Memory leak and NULL derefernce fixes.
[openssl.git] / crypto / asn1 / asn_mime.c
index 6d8a9bf90f1d3d0ae502c8356d5ac25d7e8c89cc..13d003bce3cd5e77ce6445d03d05dca148078ea3 100644 (file)
@@ -667,6 +667,8 @@ static STACK_OF(MIME_HEADER) *mime_parse_hdr(BIO *bio)
        int len, state, save_state = 0;
 
        headers = sk_MIME_HEADER_new(mime_hdr_cmp);
+       if (!headers)
+               return NULL;
        while ((len = BIO_gets(bio, linebuf, MAX_SMLEN)) > 0) {
        /* If whitespace at line start then continuation line */
        if(mhdr && isspace((unsigned char)linebuf[0])) state = MIME_NAME;
@@ -862,9 +864,8 @@ static int mime_hdr_addparam(MIME_HEADER *mhdr, char *name, char *value)
 static int mime_hdr_cmp(const MIME_HEADER * const *a,
                        const MIME_HEADER * const *b)
 {
-       if ((*a)->name == NULL || (*b)->name == NULL)
-               return (*a)->name - (*b)->name < 0 ? -1 :
-                       (*a)->name - (*b)->name > 0 ? 1 : 0;
+       if (!(*a)->name || !(*b)->name)
+               return !!(*a)->name - !!(*b)->name;
 
        return(strcmp((*a)->name, (*b)->name));
 }
@@ -872,6 +873,8 @@ static int mime_hdr_cmp(const MIME_HEADER * const *a,
 static int mime_param_cmp(const MIME_PARAM * const *a,
                        const MIME_PARAM * const *b)
 {
+       if (!(*a)->param_name || !(*b)->param_name)
+               return !!(*a)->param_name - !!(*b)->param_name;
        return(strcmp((*a)->param_name, (*b)->param_name));
 }