ref: 58b61ff9b948076c0547c80002b5c9f1276f15c5
parent: 88060e7501de5c117b86e1d29bc24ec8e83141a8
author: cinap_lenrek <[email protected]>
date: Sun Jul 4 18:28:16 EDT 2021
libsec: do proper type checking, fix wrong deduplication check
--- a/sys/src/libsec/port/x509.c
+++ b/sys/src/libsec/port/x509.c
@@ -1905,7 +1905,9 @@
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 @@
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 @@
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 @@
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;