Blame inet/test-inet6_opt.c

Packit 6c4009
#include <netinet/in.h>
Packit 6c4009
#include <stdio.h>
Packit 6c4009
#include <stdlib.h>
Packit 6c4009
#include <string.h>
Packit 6c4009
#include <stdint.h>
Packit 6c4009
Packit 6c4009
#define OPT_X	42
Packit 6c4009
#define OPT_Y	43
Packit 6c4009
#define OPT_Z	44
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
encode_inet6_opt (socklen_t *elp)
Packit 6c4009
{
Packit 6c4009
  void *eb = NULL;
Packit 6c4009
  socklen_t el;
Packit 6c4009
  int cl;
Packit 6c4009
  void *db;
Packit 6c4009
  int offset;
Packit 6c4009
  uint8_t val1;
Packit 6c4009
  uint16_t val2;
Packit 6c4009
  uint32_t val4;
Packit 6c4009
  uint64_t val8;
Packit 6c4009
Packit 6c4009
  *elp = 0;
Packit 6c4009
#define CHECK() \
Packit 6c4009
  if (cl == -1)						\
Packit 6c4009
    {							\
Packit 6c4009
      printf ("cl == -1 on line %d\n", __LINE__);	\
Packit 6c4009
      free (eb);					\
Packit 6c4009
      return NULL;					\
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  /* Estimate the length */
Packit 6c4009
  cl = inet6_opt_init (NULL, 0);
Packit 6c4009
  CHECK ();
Packit 6c4009
  cl = inet6_opt_append (NULL, 0, cl, OPT_X, 12, 8, NULL);
Packit 6c4009
  CHECK ();
Packit 6c4009
  cl = inet6_opt_append (NULL, 0, cl, OPT_Y, 7, 4, NULL);
Packit 6c4009
  CHECK ();
Packit 6c4009
  cl = inet6_opt_append (NULL, 0, cl, OPT_Z, 7, 1, NULL);
Packit 6c4009
  CHECK ();
Packit 6c4009
  cl = inet6_opt_finish (NULL, 0, cl);
Packit 6c4009
  CHECK ();
Packit 6c4009
  el = cl;
Packit 6c4009
Packit 6c4009
  eb = malloc (el + 8);
Packit 6c4009
  if (eb == NULL)
Packit 6c4009
    {
Packit 6c4009
      puts ("malloc failed");
Packit 6c4009
      return NULL;
Packit 6c4009
    }
Packit 6c4009
  /* Canary.  */
Packit 6c4009
  memcpy (eb + el, "deadbeef", 8);
Packit 6c4009
Packit 6c4009
  cl = inet6_opt_init (eb, el);
Packit 6c4009
  CHECK ();
Packit 6c4009
Packit 6c4009
  cl = inet6_opt_append (eb, el, cl, OPT_X, 12, 8, &db);
Packit 6c4009
  CHECK ();
Packit 6c4009
  val4 = 0x12345678;
Packit 6c4009
  offset = inet6_opt_set_val (db, 0, &val4, sizeof  (val4));
Packit 6c4009
  val8 = 0x0102030405060708LL;
Packit 6c4009
  inet6_opt_set_val (db, offset, &val8, sizeof  (val8));
Packit 6c4009
Packit 6c4009
  cl = inet6_opt_append (eb, el, cl, OPT_Y, 7, 4, &db);
Packit 6c4009
  CHECK ();
Packit 6c4009
  val1 = 0x01;
Packit 6c4009
  offset = inet6_opt_set_val (db, 0, &val1, sizeof  (val1));
Packit 6c4009
  val2 = 0x1331;
Packit 6c4009
  offset = inet6_opt_set_val (db, offset, &val2, sizeof  (val2));
Packit 6c4009
  val4 = 0x01020304;
Packit 6c4009
  inet6_opt_set_val (db, offset, &val4, sizeof  (val4));
Packit 6c4009
Packit 6c4009
  cl = inet6_opt_append (eb, el, cl, OPT_Z, 7, 1, &db);
Packit 6c4009
  CHECK ();
Packit 6c4009
  inet6_opt_set_val (db, 0, (void *) "abcdefg", 7);
Packit 6c4009
Packit 6c4009
  cl = inet6_opt_finish (eb, el, cl);
Packit 6c4009
  CHECK ();
Packit 6c4009
Packit 6c4009
  if (memcmp (eb + el, "deadbeef", 8) != 0)
Packit 6c4009
    {
Packit 6c4009
      puts ("Canary corrupted");
Packit 6c4009
      free (eb);
Packit 6c4009
      return NULL;
Packit 6c4009
    }
Packit 6c4009
  *elp = el;
Packit 6c4009
  return eb;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
int
Packit 6c4009
decode_inet6_opt (void *eb, socklen_t el)
Packit 6c4009
{
Packit 6c4009
  int ret = 0;
Packit 6c4009
  int seq = 0;
Packit 6c4009
  int cl = 0;
Packit 6c4009
  int offset;
Packit 6c4009
  uint8_t type;
Packit 6c4009
  socklen_t len;
Packit 6c4009
  uint8_t val1;
Packit 6c4009
  uint16_t val2;
Packit 6c4009
  uint32_t val4;
Packit 6c4009
  uint64_t val8;
Packit 6c4009
  void *db;
Packit 6c4009
  char buf[8];
Packit 6c4009
Packit 6c4009
  while ((cl = inet6_opt_next (eb, el, cl, &type, &len, &db)) != -1)
Packit 6c4009
    switch (type)
Packit 6c4009
      {
Packit 6c4009
      case OPT_X:
Packit 6c4009
	if (seq++ != 0)
Packit 6c4009
	  {
Packit 6c4009
	    puts ("OPT_X is not first");
Packit 6c4009
	    ret = 1;
Packit 6c4009
	  }
Packit 6c4009
	if (len != 12)
Packit 6c4009
	  {
Packit 6c4009
	    printf ("OPT_X's length %d != 12\n", len);
Packit 6c4009
	    ret = 1;
Packit 6c4009
	  }
Packit 6c4009
	offset = inet6_opt_get_val (db, 0, &val4, sizeof (val4));
Packit 6c4009
	if (val4 != 0x12345678)
Packit 6c4009
	  {
Packit 6c4009
	    printf ("OPT_X's val4 %x != 0x12345678\n", val4);
Packit 6c4009
	    ret = 1;
Packit 6c4009
	  }
Packit 6c4009
	offset = inet6_opt_get_val (db, offset, &val8, sizeof (val8));
Packit 6c4009
	if (offset != len || val8 != 0x0102030405060708LL)
Packit 6c4009
	  {
Packit 6c4009
	    printf ("OPT_X's val8 %llx != 0x0102030405060708\n",
Packit 6c4009
		    (long long) val8);
Packit 6c4009
	    ret = 1;
Packit 6c4009
	  }
Packit 6c4009
	break;
Packit 6c4009
      case OPT_Y:
Packit 6c4009
	if (seq++ != 1)
Packit 6c4009
	  {
Packit 6c4009
	    puts ("OPT_Y is not second");
Packit 6c4009
	    ret = 1;
Packit 6c4009
	  }
Packit 6c4009
	if (len != 7)
Packit 6c4009
	  {
Packit 6c4009
	    printf ("OPT_Y's length %d != 7\n", len);
Packit 6c4009
	    ret = 1;
Packit 6c4009
	  }
Packit 6c4009
	offset = inet6_opt_get_val (db, 0, &val1, sizeof (val1));
Packit 6c4009
	if (val1 != 0x01)
Packit 6c4009
	  {
Packit 6c4009
	    printf ("OPT_Y's val1 %x != 0x01\n", val1);
Packit 6c4009
	    ret = 1;
Packit 6c4009
	  }
Packit 6c4009
	offset = inet6_opt_get_val (db, offset, &val2, sizeof (val2));
Packit 6c4009
	if (val2 != 0x1331)
Packit 6c4009
	  {
Packit 6c4009
	    printf ("OPT_Y's val2 %x != 0x1331\n", val2);
Packit 6c4009
	    ret = 1;
Packit 6c4009
	  }
Packit 6c4009
	offset = inet6_opt_get_val (db, offset, &val4, sizeof (val4));
Packit 6c4009
	if (offset != len || val4 != 0x01020304)
Packit 6c4009
	  {
Packit 6c4009
	    printf ("OPT_Y's val4 %x != 0x01020304\n", val4);
Packit 6c4009
	    ret = 1;
Packit 6c4009
	  }
Packit 6c4009
	break;
Packit 6c4009
      case OPT_Z:
Packit 6c4009
	if (seq++ != 2)
Packit 6c4009
	  {
Packit 6c4009
	    puts ("OPT_Z is not third");
Packit 6c4009
	    ret = 1;
Packit 6c4009
	  }
Packit 6c4009
	if (len != 7)
Packit 6c4009
	  {
Packit 6c4009
	    printf ("OPT_Z's length %d != 7\n", len);
Packit 6c4009
	    ret = 1;
Packit 6c4009
	  }
Packit 6c4009
	offset = inet6_opt_get_val (db, 0, buf, 7);
Packit 6c4009
	if (offset != len || memcmp (buf, "abcdefg", 7) != 0)
Packit 6c4009
	  {
Packit 6c4009
	    buf[7] = '\0';
Packit 6c4009
	    printf ("OPT_Z's buf \"%s\" != \"abcdefg\"\n", buf);
Packit 6c4009
	    ret = 1;
Packit 6c4009
	  }
Packit 6c4009
	break;
Packit 6c4009
      default:
Packit 6c4009
	printf ("Unknown option %d\n", type);
Packit 6c4009
	ret = 1;
Packit 6c4009
	break;
Packit 6c4009
      }
Packit 6c4009
  if (seq != 3)
Packit 6c4009
    {
Packit 6c4009
      puts ("Didn't see all of OPT_X, OPT_Y and OPT_Z");
Packit 6c4009
      ret = 1;
Packit 6c4009
    }
Packit 6c4009
  return ret;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
static int
Packit 6c4009
do_test (void)
Packit 6c4009
{
Packit 6c4009
  void *eb;
Packit 6c4009
  socklen_t el;
Packit 6c4009
  eb = encode_inet6_opt (&el);
Packit 6c4009
  if (eb == NULL)
Packit 6c4009
    return 1;
Packit 6c4009
  if (decode_inet6_opt (eb, el))
Packit 6c4009
    return 1;
Packit 6c4009
  return 0;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
#define TEST_FUNCTION do_test ()
Packit 6c4009
#include "../test-skeleton.c"