summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDariusz Michaluk <d.michaluk@samsung.com>2018-06-15 11:14:03 +0200
committerDariusz Michaluk <d.michaluk@samsung.com>2018-06-15 11:14:03 +0200
commite527f54afdf27ab8ce73a22d05d69e5482f5e92b (patch)
treeaac02c45c01b4330297e82c082bd6209b8d8b6bc /lib
parentc38ae6ad7adfdfe3cb40ff348277ca32a16756b0 (diff)
downloadlibtasn1-e527f54afdf27ab8ce73a22d05d69e5482f5e92b.tar.gz
libtasn1-e527f54afdf27ab8ce73a22d05d69e5482f5e92b.tar.bz2
libtasn1-e527f54afdf27ab8ce73a22d05d69e5482f5e92b.zip
Imported Upstream version 4.13upstream/4.13
Diffstat (limited to 'lib')
-rw-r--r--lib/decoding.c28
-rw-r--r--lib/libtasn1.h2
-rw-r--r--lib/parser_aux.c17
3 files changed, 39 insertions, 8 deletions
diff --git a/lib/decoding.c b/lib/decoding.c
index 2240b09..05dc236 100644
--- a/lib/decoding.c
+++ b/lib/decoding.c
@@ -43,8 +43,22 @@
#define HAVE_TWO(x) (x>=2?1:0)
+/* Decoding flags (dflags) used in several decoding functions.
+ * DECODE_FLAG_HAVE_TAG: The provided buffer includes a tag
+ * DECODE_FLAG_INDEFINITE: The provided buffer is of indefinite encoding (useful
+ * when no tags are present).
+ * DECODE_FLAG_LEVEL1: Internal flag to indicate a level of recursion for BER strings.
+ * DECODE_FLAG_LEVEL2: Internal flag to indicate two levels of recursion for BER strings.
+ * DECODE_FLAG_LEVEL3: Internal flag to indicate three levels of recursion for BER strings.
+ * This is the maximum levels of recursion possible to prevent stack
+ * exhaustion.
+ */
+
#define DECODE_FLAG_HAVE_TAG 1
#define DECODE_FLAG_INDEFINITE (1<<1)
+#define DECODE_FLAG_LEVEL1 (1<<2)
+#define DECODE_FLAG_LEVEL2 (1<<3)
+#define DECODE_FLAG_LEVEL3 (1<<4)
#define DECR_LEN(l, s) do { \
l -= s; \
@@ -2216,7 +2230,8 @@ _asn1_decode_simple_ber (unsigned int etype, const unsigned char *der,
}
/* indefinite constructed */
- if (((dflags & DECODE_FLAG_INDEFINITE) || class == ASN1_CLASS_STRUCTURED) && ETYPE_IS_STRING(etype))
+ if ((((dflags & DECODE_FLAG_INDEFINITE) || class == ASN1_CLASS_STRUCTURED) && ETYPE_IS_STRING(etype)) &&
+ !(dflags & DECODE_FLAG_LEVEL3))
{
len_len = 1;
@@ -2236,8 +2251,17 @@ _asn1_decode_simple_ber (unsigned int etype, const unsigned char *der,
do
{
unsigned tmp_len;
+ unsigned flags = DECODE_FLAG_HAVE_TAG;
+
+ if (dflags & DECODE_FLAG_LEVEL1)
+ flags |= DECODE_FLAG_LEVEL2;
+ else if (dflags & DECODE_FLAG_LEVEL2)
+ flags |= DECODE_FLAG_LEVEL3;
+ else
+ flags |= DECODE_FLAG_LEVEL1;
- result = asn1_decode_simple_ber(etype, p, der_len, &out, &out_len, &tmp_len);
+ result = _asn1_decode_simple_ber(etype, p, der_len, &out, &out_len, &tmp_len,
+ flags);
if (result != ASN1_SUCCESS)
{
warn();
diff --git a/lib/libtasn1.h b/lib/libtasn1.h
index 626b11e..ea26b78 100644
--- a/lib/libtasn1.h
+++ b/lib/libtasn1.h
@@ -44,7 +44,7 @@ extern "C"
{
#endif
-#define ASN1_VERSION "4.12"
+#define ASN1_VERSION "4.13"
#if defined(__GNUC__) && !defined(ASN1_INTERNAL_BUILD)
# define _ASN1_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
diff --git a/lib/parser_aux.c b/lib/parser_aux.c
index 976ab38..786ea64 100644
--- a/lib/parser_aux.c
+++ b/lib/parser_aux.c
@@ -955,7 +955,7 @@ _asn1_check_identifier (asn1_node node)
if (p2 == NULL)
{
if (p->value)
- _asn1_strcpy (_asn1_identifierMissing, p->value);
+ _asn1_str_cpy (_asn1_identifierMissing, sizeof(_asn1_identifierMissing), (char*)p->value);
else
_asn1_strcpy (_asn1_identifierMissing, "(null)");
return ASN1_IDENTIFIER_NOT_FOUND;
@@ -968,9 +968,15 @@ _asn1_check_identifier (asn1_node node)
if (p2 && (type_field (p2->type) == ASN1_ETYPE_DEFAULT))
{
_asn1_str_cpy (name2, sizeof (name2), node->name);
- _asn1_str_cat (name2, sizeof (name2), ".");
- _asn1_str_cat (name2, sizeof (name2), (char *) p2->value);
- _asn1_strcpy (_asn1_identifierMissing, p2->value);
+ if (p2->value)
+ {
+ _asn1_str_cat (name2, sizeof (name2), ".");
+ _asn1_str_cat (name2, sizeof (name2), (char *) p2->value);
+ _asn1_str_cpy (_asn1_identifierMissing, sizeof(_asn1_identifierMissing), (char*)p2->value);
+ }
+ else
+ _asn1_strcpy (_asn1_identifierMissing, "(null)");
+
p2 = asn1_find_node (node, name2);
if (!p2 || (type_field (p2->type) != ASN1_ETYPE_OBJECT_ID) ||
!(p2->type & CONST_ASSIGN))
@@ -990,7 +996,8 @@ _asn1_check_identifier (asn1_node node)
_asn1_str_cpy (name2, sizeof (name2), node->name);
_asn1_str_cat (name2, sizeof (name2), ".");
_asn1_str_cat (name2, sizeof (name2), (char *) p2->value);
- _asn1_strcpy (_asn1_identifierMissing, p2->value);
+ _asn1_str_cpy (_asn1_identifierMissing, sizeof(_asn1_identifierMissing), (char*)p2->value);
+
p2 = asn1_find_node (node, name2);
if (!p2 || (type_field (p2->type) != ASN1_ETYPE_OBJECT_ID)
|| !(p2->type & CONST_ASSIGN))