From: cinap_lenrek Date: Sun, 4 Jul 2021 22:28:16 +0000 (+0000) Subject: libsec: do proper type checking, fix wrong deduplication check X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=58b61ff9b948076c0547c80002b5c9f1276f15c5;p=plan9front.git libsec: do proper type checking, fix wrong deduplication check --- diff --git a/sys/src/libsec/port/x509.c b/sys/src/libsec/port/x509.c index d0e6b1fbc..789bdc4ff 100644 --- a/sys/src/libsec/port/x509.c +++ b/sys/src/libsec/port/x509.c @@ -1905,7 +1905,9 @@ decode_cert(uchar *buf, int len) esubj = &el->hd; el = el->tl; epubkey = &el->hd; - if(el->tl != nil && el->tl->hd.tag.class == Context && el->tl->hd.tag.num == 3){ + if(el->tl != nil + && el->tl->hd.tag.class == Context && el->tl->hd.tag.num == 3 + && el->tl->hd.val.tag == VOctets){ c->ext = el->tl->hd.val.u.octetsval; el->tl->hd.val.u.octetsval = nil; /* transfer ownership */ } @@ -2742,12 +2744,13 @@ appendaltnames(char *name, int nname, Bytes *ext, int isreq) continue; case 1: /* email */ case 2: /* DNS */ - if(ext == nil) + if(el->hd.val.tag != VOctets) goto erralt; alt = smprint("%.*s", ext->len, (char*)ext->data); break; case 4: /* DN */ - if(ext == nil || decode(ext->data, ext->len, &edn) != ASN_OK) + if(el->hd.val.tag != VOctets + || decode(ext->data, ext->len, &edn) != ASN_OK) goto erralt; alt = parse_name(&edn); freevalfields(&edn.val); @@ -2756,7 +2759,7 @@ appendaltnames(char *name, int nname, Bytes *ext, int isreq) if(alt == nil) goto erralt; len = strlen(alt); - if(strncmp(name, alt, len) == 0 && strchr(",", name[len]) == nil){ + if(strncmp(name, alt, len) == 0 && strchr(",", name[len]) != nil){ free(alt); /* same as the subject */ continue; } @@ -2998,7 +3001,10 @@ X509reqtoRSApub(uchar *req, int nreq, char *name, int nname) copysubject(name, nname, subject); free(subject); el = el->tl; - if(el->tl != nil && el->tl->hd.tag.class == Context && el->tl->hd.tag.num == 0) + if(el->tl != nil + && el->tl->hd.tag.class == Context + && el->tl->hd.tag.num == 0 + && el->tl->hd.val.tag == VOctets) appendaltnames(name, nname, el->tl->hd.val.u.octetsval, 1); if(!is_seq(&el->hd, &el) || elistlen(el) != 2) goto errret;