s4:heimdal: import lorikeet-heimdal-200911122202 (commit 9291fd2d101f3eecec550178634f...
[abartlet/samba.git/.git] / source4 / heimdal / lib / asn1 / der_get.c
index aee565040fd61168d76b9b17249f7244502c5aee..5a062fb339e8a4676287a15318ea85e69c1b73b1 100644 (file)
@@ -305,7 +305,7 @@ der_get_octet_string_ber (const unsigned char *p, size_t len,
            void *ptr;
 
            ptr = realloc(data->data, data->length + datalen);
-           if (ptr == NULL) {
+           if (ptr == NULL && data->length + datalen != 0) {
                e = ENOMEM;
                goto out;
            }
@@ -354,21 +354,23 @@ der_get_heim_integer (const unsigned char *p, size_t len,
            p++;
            data->length--;
        }
-       data->data = malloc(data->length);
-       if (data->data == NULL) {
-           data->length = 0;
-           if (size)
-               *size = 0;
-           return ENOMEM;
-       }
-       q = &((unsigned char*)data->data)[data->length - 1];
-       p += data->length - 1;
-       while (q >= (unsigned char*)data->data) {
-           *q = *p ^ 0xff;
-           if (carry)
-               carry = !++*q;
-           p--;
-           q--;
+       if (data->length) {
+           data->data = malloc(data->length);
+           if (data->data == NULL) {
+               data->length = 0;
+               if (size)
+                   *size = 0;
+               return ENOMEM;
+           }
+           q = &((unsigned char*)data->data)[data->length - 1];
+           p += data->length - 1;
+           while (q >= (unsigned char*)data->data) {
+               *q = *p ^ 0xff;
+               if (carry)
+                   carry = !++*q;
+               p--;
+               q--;
+           }
        }
     } else {
        data->negative = 0;