+ unsigned char *data = NULL;
+ size_t len;
+ PACKET pkt;
+
+ if ( !PACKET_buf_init(&pkt, buf, BUF_LEN)
+ || !PACKET_memdup(&pkt, &data, &len)
+ || len != BUF_LEN
+ || memcmp(data, PACKET_data(&pkt), len)
+ || !PACKET_forward(&pkt, 10)
+ || !PACKET_memdup(&pkt, &data, &len)
+ || len != BUF_LEN - 10
+ || memcmp(data, PACKET_data(&pkt), len)) {
+ fprintf(stderr, "test_PACKET_memdup() failed\n");
+ OPENSSL_free(data);
+ return 0;
+ }
+
+ OPENSSL_free(data);
+ return 1;
+}
+
+static int test_PACKET_strndup()
+{
+ char buf[10], buf2[10];
+ char *data = NULL;
+ PACKET pkt;
+
+ memset(buf, 'x', 10);
+ memset(buf2, 'y', 10);
+ buf2[5] = '\0';
+
+ if ( !PACKET_buf_init(&pkt, (unsigned char*)buf, 10)
+ || !PACKET_strndup(&pkt, &data)
+ || strlen(data) != 10
+ || strncmp(data, buf, 10)
+ || !PACKET_buf_init(&pkt, (unsigned char*)buf2, 10)
+ || !PACKET_strndup(&pkt, &data)
+ || strlen(data) != 5
+ || strcmp(data, buf2)) {
+ fprintf(stderr, "test_PACKET_strndup failed\n");
+ OPENSSL_free(data);
+ return 0;
+ }
+
+ OPENSSL_free(data);
+ return 1;
+}
+
+static int test_PACKET_contains_zero_byte()
+{
+ char buf[10], buf2[10];
+ PACKET pkt;
+
+ memset(buf, 'x', 10);
+ memset(buf2, 'y', 10);
+ buf2[5] = '\0';
+
+ if ( !PACKET_buf_init(&pkt, (unsigned char*)buf, 10)
+ || PACKET_contains_zero_byte(&pkt)
+ || !PACKET_buf_init(&pkt, (unsigned char*)buf2, 10)
+ || !PACKET_contains_zero_byte(&pkt)) {
+ fprintf(stderr, "test_PACKET_contains_zero_byte failed\n");
+ return 0;
+ }
+
+ return 1;
+}
+
+static int test_PACKET_forward(unsigned char buf[BUF_LEN])
+{
+ const unsigned char *byte;
+ PACKET pkt;