summary refs log tree commit diff
path: root/inet
diff options
context:
space:
mode:
Diffstat (limited to 'inet')
-rw-r--r--inet/Makefile4
-rw-r--r--inet/inet6_opt.c36
-rw-r--r--inet/test-inet6_opt.c207
3 files changed, 20 insertions, 227 deletions
diff --git a/inet/Makefile b/inet/Makefile
index 3f796e4487..075716fbeb 100644
--- a/inet/Makefile
+++ b/inet/Makefile
@@ -1,4 +1,4 @@
-# Copyright (C) 1991-2006, 2007 Free Software Foundation, Inc.
+# Copyright (C) 1991-2002, 2003, 2004, 2006 Free Software Foundation, Inc.
 # This file is part of the GNU C Library.
 
 # The GNU C Library is free software; you can redistribute it and/or
@@ -52,7 +52,7 @@ routines := htonl htons		\
 aux := check_pf ifreq
 
 tests := htontest test_ifindex tst-ntoa tst-ether_aton tst-network \
-	 tst-gethnm test-ifaddrs bug-if1 test-inet6_opt
+	 tst-gethnm test-ifaddrs bug-if1
 
 include ../Rules
 
diff --git a/inet/inet6_opt.c b/inet/inet6_opt.c
index 17d3fee213..bddb85182b 100644
--- a/inet/inet6_opt.c
+++ b/inet/inet6_opt.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2006, 2007 Free Software Foundation, Inc.
+/* Copyright (C) 2006 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2006.
 
@@ -51,7 +51,7 @@ add_padding (uint8_t *extbuf, int offset, int npad)
 {
   if (npad == 1)
     extbuf[offset] = IP6OPT_PAD1;
-  else if (npad > 0)
+  else
     {
       struct ip6_opt *pad_opt = (struct ip6_opt *) (extbuf + offset);
 
@@ -102,17 +102,21 @@ inet6_opt_append (void *extbuf, socklen_t extlen, int offset, uint8_t type,
   int data_offset = offset + sizeof (struct ip6_opt);
   int npad = (align - data_offset % align) & (align - 1);
 
-  if (extbuf != NULL)
-    {
-      /* Now we can check whether the buffer is large enough.  */
-      if (data_offset + npad + len > extlen)
-	return -1;
+  /* Now we can check whether the buffer is large enough.  */
+  if (data_offset + npad + len > extlen)
+    return -1;
 
-      add_padding (extbuf, offset, npad);
+  if (npad != 0)
+    {
+      if (extbuf != NULL)
+	add_padding (extbuf, offset, npad);
 
       offset += npad;
+    }
 
-      /* Now prepare the option itself.  */
+  /* Now prepare the option itself.  */
+  if (extbuf != NULL)
+    {
       struct ip6_opt *opt = (struct ip6_opt *) ((uint8_t *) extbuf + offset);
 
       opt->ip6o_type = type;
@@ -120,8 +124,6 @@ inet6_opt_append (void *extbuf, socklen_t extlen, int offset, uint8_t type,
 
       *databufp = opt + 1;
     }
-  else
-    offset += npad;
 
   return offset + sizeof (struct ip6_opt) + len;
 }
@@ -143,14 +145,12 @@ inet6_opt_finish (void *extbuf, socklen_t extlen, int offset)
   /* Required padding at the end.  */
   int npad = (8 - (offset & 7)) & 7;
 
-  if (extbuf != NULL)
-    {
-      /* Make sure the buffer is large enough.  */
-      if (offset + npad > extlen)
-	return -1;
+  /* Make sure the buffer is large enough.  */
+  if (offset + npad > extlen)
+    return -1;
 
-      add_padding (extbuf, offset, npad);
-    }
+  if (extbuf != NULL)
+    add_padding (extbuf, offset, npad);
 
   return offset + npad;
 }
diff --git a/inet/test-inet6_opt.c b/inet/test-inet6_opt.c
deleted file mode 100644
index 4db9b59389..0000000000
--- a/inet/test-inet6_opt.c
+++ /dev/null
@@ -1,207 +0,0 @@
-#include <netinet/in.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#define OPT_X	42
-#define OPT_Y	43
-#define OPT_Z	44
-
-static void *
-encode_inet6_opt (socklen_t *elp)
-{
-  void *eb = NULL;
-  socklen_t el;
-  int cl;
-  void *db;
-  int offset;
-  uint8_t val1;
-  uint16_t val2;
-  uint32_t val4;
-  uint64_t val8;
-
-  *elp = 0;
-#define CHECK() \
-  if (cl == -1)						\
-    {							\
-      printf ("cl == -1 on line %d\n", __LINE__);	\
-      free (eb);					\
-      return NULL;					\
-    }
-
-  /* Estimate the length */
-  cl = inet6_opt_init (NULL, 0);
-  CHECK ();
-  cl = inet6_opt_append (NULL, 0, cl, OPT_X, 12, 8, NULL);
-  CHECK ();
-  cl = inet6_opt_append (NULL, 0, cl, OPT_Y, 7, 4, NULL);
-  CHECK ();
-  cl = inet6_opt_append (NULL, 0, cl, OPT_Z, 7, 1, NULL);
-  CHECK ();
-  cl = inet6_opt_finish (NULL, 0, cl);
-  CHECK ();
-  el = cl;
-
-  eb = malloc (el + 8);
-  if (eb == NULL)
-    {
-      puts ("malloc failed");
-      return NULL;
-    }
-  /* Canary.  */
-  memcpy (eb + el, "deadbeef", 8);
-
-  cl = inet6_opt_init (eb, el);
-  CHECK ();
-
-  cl = inet6_opt_append (eb, el, cl, OPT_X, 12, 8, &db);
-  CHECK ();
-  val4 = 0x12345678;
-  offset = inet6_opt_set_val (db, 0, &val4, sizeof  (val4));
-  val8 = 0x0102030405060708LL;
-  inet6_opt_set_val (db, offset, &val8, sizeof  (val8));
-
-  cl = inet6_opt_append (eb, el, cl, OPT_Y, 7, 4, &db);
-  CHECK ();
-  val1 = 0x01;
-  offset = inet6_opt_set_val (db, 0, &val1, sizeof  (val1));
-  val2 = 0x1331;
-  offset = inet6_opt_set_val (db, offset, &val2, sizeof  (val2));
-  val4 = 0x01020304;
-  inet6_opt_set_val (db, offset, &val4, sizeof  (val4));
-
-  cl = inet6_opt_append (eb, el, cl, OPT_Z, 7, 1, &db);
-  CHECK ();
-  inet6_opt_set_val (db, 0, (void *) "abcdefg", 7);
-
-  cl = inet6_opt_finish (eb, el, cl);
-  CHECK ();
-
-  if (memcmp (eb + el, "deadbeef", 8) != 0)
-    {
-      puts ("Canary corrupted");
-      free (eb);
-      return NULL;
-    }
-  *elp = el;
-  return eb;
-}
-
-int
-decode_inet6_opt (void *eb, socklen_t el)
-{
-  int ret = 0;
-  int seq = 0;
-  int cl = 0;
-  int offset;
-  uint8_t type;
-  socklen_t len;
-  uint8_t val1;
-  uint16_t val2;
-  uint32_t val4;
-  uint64_t val8;
-  void *db;
-  char buf[8];
-
-  while ((cl = inet6_opt_next (eb, el, cl, &type, &len, &db)) != -1)
-    switch (type)
-      {
-      case OPT_X:
-	if (seq++ != 0)
-	  {
-	    puts ("OPT_X is not first");
-	    ret = 1;
-	  }
-	if (len != 12)
-	  {
-	    printf ("OPT_X's length %d != 12\n", len);
-	    ret = 1;
-	  }
-	offset = inet6_opt_get_val (db, 0, &val4, sizeof (val4));
-	if (val4 != 0x12345678)
-	  {
-	    printf ("OPT_X's val4 %x != 0x12345678\n", val4);
-	    ret = 1;
-	  }
-	offset = inet6_opt_get_val (db, offset, &val8, sizeof (val8));
-	if (offset != len || val8 != 0x0102030405060708LL)
-	  {
-	    printf ("OPT_X's val8 %llx != 0x0102030405060708\n",
-		    (long long) val8);
-	    ret = 1;
-	  }
-	break;
-      case OPT_Y:
-	if (seq++ != 1)
-	  {
-	    puts ("OPT_Y is not second");
-	    ret = 1;
-	  }
-	if (len != 7)
-	  {
-	    printf ("OPT_Y's length %d != 7\n", len);
-	    ret = 1;
-	  }
-	offset = inet6_opt_get_val (db, 0, &val1, sizeof (val1));
-	if (val1 != 0x01)
-	  {
-	    printf ("OPT_Y's val1 %x != 0x01\n", val1);
-	    ret = 1;
-	  }
-	offset = inet6_opt_get_val (db, offset, &val2, sizeof (val2));
-	if (val2 != 0x1331)
-	  {
-	    printf ("OPT_Y's val2 %x != 0x1331\n", val2);
-	    ret = 1;
-	  }
-	offset = inet6_opt_get_val (db, offset, &val4, sizeof (val4));
-	if (offset != len || val4 != 0x01020304)
-	  {
-	    printf ("OPT_Y's val4 %x != 0x01020304\n", val4);
-	    ret = 1;
-	  }
-	break;
-      case OPT_Z:
-	if (seq++ != 2)
-	  {
-	    puts ("OPT_Z is not third");
-	    ret = 1;
-	  }
-	if (len != 7)
-	  {
-	    printf ("OPT_Z's length %d != 7\n", len);
-	    ret = 1;
-	  }
-	offset = inet6_opt_get_val (db, 0, buf, 7);
-	if (offset != len || memcmp (buf, "abcdefg", 7) != 0)
-	  {
-	    buf[7] = '\0';
-	    printf ("OPT_Z's buf \"%s\" != \"abcdefg\"\n", buf);
-	    ret = 1;
-	  }
-	break;
-      default:
-	printf ("Unknown option %d\n", type);
-	ret = 1;
-	break;
-      }
-  if (seq != 3)
-    {
-      puts ("Didn't see all of OPT_X, OPT_Y and OPT_Z");
-      ret = 1;
-    }
-  return ret;
-}
-
-int
-main (void)
-{
-  void *eb;
-  socklen_t el;
-  eb = encode_inet6_opt (&el);
-  if (eb == NULL)
-    return 1;
-  if (decode_inet6_opt (eb, el))
-    return 1;
-  return 0;
-}