|
@@ -186,6 +186,11 @@ asn1_length_decode(struct asn1_ctx *ctx, unsigned int *def, unsigned int *len)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ /* don't trust len bigger than ctx buffer */
|
|
|
+ if (*len > ctx->end - ctx->pointer)
|
|
|
+ return 0;
|
|
|
+
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
@@ -203,6 +208,10 @@ asn1_header_decode(struct asn1_ctx *ctx,
|
|
|
if (!asn1_length_decode(ctx, &def, &len))
|
|
|
return 0;
|
|
|
|
|
|
+ /* primitive shall be definite, indefinite shall be constructed */
|
|
|
+ if (*con == ASN1_PRI && !def)
|
|
|
+ return 0;
|
|
|
+
|
|
|
if (def)
|
|
|
*eoc = ctx->pointer + len;
|
|
|
else
|
|
@@ -389,6 +398,11 @@ asn1_oid_decode(struct asn1_ctx *ctx,
|
|
|
unsigned long *optr;
|
|
|
|
|
|
size = eoc - ctx->pointer + 1;
|
|
|
+
|
|
|
+ /* first subid actually encodes first two subids */
|
|
|
+ if (size < 2 || size > ULONG_MAX/sizeof(unsigned long))
|
|
|
+ return 0;
|
|
|
+
|
|
|
*oid = kmalloc(size * sizeof(unsigned long), GFP_ATOMIC);
|
|
|
if (*oid == NULL)
|
|
|
return 0;
|