Hello,

asn1_read_value_type() with len = 0 passed fails for CHOICE and BIT STRING 
types.


See the attached patch which adds a testcase!


Best regards,


        Andreas

-- 
Andreas Schneider                   GPG-ID: CC014E3D
Samba Team                             [email protected]
www.samba.org
>From 84ab83d3ea567d585e091f28bb97b99088360389 Mon Sep 17 00:00:00 2001
From: Andreas Schneider <[email protected]>
Date: Mon, 24 Oct 2016 11:16:56 +0200
Subject: [PATCH] Add spc_pe_image_data test

Signed-off-by: Andreas Schneider <[email protected]>
---
 tests/Makefile.am           |  10 ++--
 tests/mscat.asn             |  34 ++++++++++++
 tests/spc_pe_image_data.c   | 128 ++++++++++++++++++++++++++++++++++++++++++++
 tests/spc_pe_image_data.der | Bin 0 -> 40 bytes
 4 files changed, 169 insertions(+), 3 deletions(-)
 create mode 100644 tests/mscat.asn
 create mode 100644 tests/spc_pe_image_data.c
 create mode 100644 tests/spc_pe_image_data.der

diff --git a/tests/Makefile.am b/tests/Makefile.am
index 379525e..0d8fcb1 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -25,7 +25,7 @@ LDADD = ../lib/libtasn1.la ../gl/libgnu.la
 EXTRA_DIST = Test_parser.asn Test_tree.asn Test_tree_asn1_tab.c	\
 	Test_encoding.asn pkix.asn TestIndef.p12 choice.asn coding-decoding2.asn \
 	TestIndef2.p12 TestIndef3.der TestCertOctetOverflow.der \
-	libtasn1.supp ocsp-basic-response.der \
+	libtasn1.supp ocsp-basic-response.der spc_pe_image_data.der \
 	invalid-x509/id-000000.der invalid-x509/id-000001.der \
 	invalid-x509/id-000002.der invalid-x509/id-000003.der \
 	invalid-x509/id-000004.der invalid-x509/id-000005.der \
@@ -54,13 +54,15 @@ MOSTLYCLEANFILES = Test_parser_ERROR.asn
 check_PROGRAMS = Test_parser Test_tree Test_encoding Test_indefinite \
 	Test_errors Test_simple Test_overflow Test_strings Test_choice \
 	Test_encdec copynode coding-decoding2 strict-der Test_choice_ocsp \
-	ocsp-basic-response octet-string coding-long-oid object-id-decoding
+	ocsp-basic-response octet-string coding-long-oid object-id-decoding \
+	spc_pe_image_data
 
 TESTS = Test_parser Test_tree Test_encoding Test_indefinite	\
 	Test_errors Test_simple Test_overflow crlf threadsafety \
 	Test_strings Test_choice Test_encdec copynode coding-decoding2 \
 	strict-der Test_choice_ocsp decoding decoding-invalid-x509 \
-	ocsp-basic-response octet-string coding-long-oid object-id-decoding
+	ocsp-basic-response octet-string coding-long-oid object-id-decoding \
+	spc_pe_image_data
 
 TESTS_ENVIRONMENT = \
 	ASN1PARSER=$(srcdir)/Test_parser.asn \
@@ -76,6 +78,8 @@ TESTS_ENVIRONMENT = \
 	ASN1CHOICE_OCSP=$(srcdir)/pkix.asn \
 	ASN1CHOICE_OCSP_DATA=$(srcdir)/ocsp.der \
 	ASN1_RESPONSE_OCSP_DATA=$(srcdir)/ocsp-basic-response.der \
+	ASN1_MSCAT=$(srcdir)/mscat.asn \
+	ASN1_SPC_PE_IMAGE_DATA=$(srcdir)/spc_pe_image_data.der \
 	THREADSAFETY_FILES=`find $(top_srcdir)/lib -name \*.c` \
 	EXEEXT=$(EXEEXT) \
 	LSAN_OPTIONS=suppressions=libtasn1.supp \
diff --git a/tests/mscat.asn b/tests/mscat.asn
new file mode 100644
index 0000000..beb69f7
--- /dev/null
+++ b/tests/mscat.asn
@@ -0,0 +1,34 @@
+CATALOG {}
+DEFINITIONS IMPLICIT TAGS ::= -- assuming implicit tags, should try explicit too
+
+BEGIN
+
+-- SPC_PE_IMAGE_DATA
+SpcPEImageData ::= SEQUENCE {
+    flags       SpcPeImageFlags DEFAULT includeResources,
+    link        [0] EXPLICIT SpcLink OPTIONAL
+}
+
+SpcPeImageFlags ::= BIT STRING {
+    includeResources            (0),
+    includeDebugInfo            (1),
+    includeImportAddressTable   (2)
+}
+
+SpcLink ::= CHOICE {
+    url         [0]    IMPLICIT IA5String,
+    moniker     [1]    IMPLICIT SpcSerializedObject,
+    file        [2]    EXPLICIT SpcString
+}
+
+SpcSerializedObject ::= SEQUENCE {
+    classId     OCTET STRING, -- GUID
+    data        OCTET STRING  -- Binary structure
+}
+
+SpcString ::= CHOICE {
+    unicode     [0] IMPLICIT BMPString,
+    ascii       [1] IMPLICIT IA5String
+}
+
+END
diff --git a/tests/spc_pe_image_data.c b/tests/spc_pe_image_data.c
new file mode 100644
index 0000000..e014a8c
--- /dev/null
+++ b/tests/spc_pe_image_data.c
@@ -0,0 +1,128 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <libtasn1.h>
+
+int main (int argc, char** argv)
+{
+	int result = 0, len;
+	asn1_node definitions = NULL, node1 = NULL;
+	char errorDescription[ASN1_MAX_ERROR_DESCRIPTION_SIZE];
+	const char *choicefile = getenv ("ASN1_MSCAT");
+	const char *datafile = getenv ("ASN1_SPC_PE_IMAGE_DATA");
+	FILE *fp;
+	char data[1024];
+	int data_size = sizeof (data);
+	unsigned etype;
+	int cmp;
+
+	if (choicefile == NULL) {
+		choicefile = "mscat.asn";
+	}
+
+	if (datafile == NULL) {
+		datafile = "spc_pe_image_data.der";
+	}
+
+	result = asn1_parser2tree(choicefile, &definitions, errorDescription);
+	if (result != ASN1_SUCCESS) {
+		fprintf(stderr, "error in %d: %s\n", __LINE__, errorDescription);
+		exit (1);
+	}
+
+	result = asn1_create_element(definitions,
+				     "CATALOG.SpcPEImageData",
+				     &node1);
+	if (result != ASN1_SUCCESS) {
+		fprintf(stderr, "error in %d\n", __LINE__);
+		exit (1);
+	}
+
+	fp = fopen(datafile, "rb");
+	if (fp == NULL) {
+		fprintf (stderr, "error in %d\n", __LINE__);
+		exit(1);
+	}
+	data_size = fread(data, 1, sizeof(data), fp);
+	fclose(fp);
+
+	result = asn1_der_decoding2(&node1,
+				    data,
+				    &data_size,
+				    ASN1_DECODE_FLAG_STRICT_DER,
+				    errorDescription);
+	if (result != ASN1_SUCCESS) {
+		fprintf(stderr, "error in %d: decoding: %s\n", __LINE__, errorDescription);
+		exit(1);
+	}
+
+	len = 0;
+	result = asn1_read_value_type(node1,
+				      "flags",
+				      NULL,
+				      &len,
+				      &etype);
+	if (result != ASN1_SUCCESS) {
+		fprintf(stderr, "error in %d: %s\n", __LINE__, errorDescription);
+		exit(1);
+	}
+
+	if ((size_t)len >= sizeof(data)) {
+		fprintf(stderr,
+			"error len=%d, sizeof(data)=%zu\n",
+			len,
+			sizeof(data));
+		exit(1);
+	}
+
+	result = asn1_read_value(node1, "flags", data, &len);
+	if (result != ASN1_SUCCESS) {
+		fprintf(stderr, "error in %d: %s\n", __LINE__, errorDescription);
+		exit (1);
+	}
+
+	etype = 0;
+	len = 0;
+	result = asn1_read_value_type(node1, "link", NULL, &len, &etype);
+	if (result != ASN1_SUCCESS)
+	{
+		fprintf(stderr,
+			"error in %d: result is: %s\n",
+			__LINE__,
+			asn1_strerror(result));
+		exit(1);
+	}
+
+	if (etype != ASN1_ETYPE_CHOICE) {
+		fprintf(stderr,
+			"error in %d: The type (%u) doesn't match choice.\n",
+			__LINE__,
+			etype);
+		exit(1);
+	}
+
+	if (len != 5) {
+		fprintf (stderr, "length doesn't match the expected (got: %d, should be: 20)\n", len);
+		exit (1);
+	}
+
+	len = sizeof(data);
+	result = asn1_read_value(node1, "link", data, &len);
+	if (result != ASN1_SUCCESS) {
+		fprintf(stderr, "error in %d: %s\n", __LINE__, errorDescription);
+		exit (1);
+	}
+
+	cmp = memcmp(data, "file", len);
+	if (cmp != 0) {
+		fprintf(stderr, "contents don't match\n");
+		exit(1);
+	}
+
+	printf("SUCCESS\n");
+
+	asn1_delete_structure (&node1);
+	asn1_delete_structure (&definitions);
+
+	return 0;
+}
diff --git a/tests/spc_pe_image_data.der b/tests/spc_pe_image_data.der
new file mode 100644
index 0000000000000000000000000000000000000000..0e72dfa20d30507f8659cac5bba579f8fc8f4874
GIT binary patch
literal 40
ocmXp|V`gGqus~svT!RdQ4H)_}Bry~-<TK<jq%xEMu^k8k0H}cn$N&HU

literal 0
HcmV?d00001

-- 
2.7.4

Reply via email to