On Wed, Oct 15, 2014 at 11:15:42AM +0100, Philip Martin wrote: > 1) > > In x509parse.c:x509_get_version: > > err = asn1_get_tag(p, end, &len, > ASN1_CONTEXT_SPECIFIC | ASN1_CONSTRUCTED | 0); > > Why the "| 0"? It doesn't do anything.
Inherited from the original tropicssl code. I think we can remove it. > > 2) > > In x509parse.c:x509_get_name: > > cur->next = apr_palloc(result_pool, sizeof(x509_name)); > > if (cur->next == NULL) > return SVN_NO_ERROR; > > We generally assume apr_palloc will abort rather than return NULL, > that's certainly the assumption in other places in this file. If we > were to detect an allocation failure then returning no error is not > correct. The code we imported from tropicssl used malloc/free. So this probably happened during the conversion from malloc/free to APR pool. I agree that the null check should just be removed. > > 3) > > In x509parse.c:x509_get_name: > > oid = &cur->oid; > oid->tag = **p; > > err = asn1_get_tag(p, end, &oid->len, ASN1_OID); > if (err) > return svn_error_create(SVN_ERR_X509_CERT_INVALID_NAME, err, NULL); > > The asn1_get_tag() call verifies both that *p has not reached end and > that the tag is ASN1_OID. This happens after assigning **p to oid->tag, > so if asn1_get_tag were to detect that *p had reached end it would > happen after we had dereferenced **p. This bug occurs in other places: > x509_get_sig, x509_get_alg, etc. > > Fix by assigning ASN1_OID explicitly or by moving the assignment after > asn1_get_tag. > > -- > Philip Martin | Subversion Committer > WANdisco // *Non-Stop Data*