an attempt at plugging some holes reported by leak(1). for me this does not break anything, and my 802.1x ttls-pap thingy now runs without leaks, as far as leak(1) tells me. there may be more leaks-- I did not exercise the code of x509.c:/^verify_signature beyond the "expected 1" message. Axel. Reference: /n/sources/patch/applied/libsec-plug-some-leaks Date: Thu Sep 15 17:51:31 CES 2005 --- /sys/src/libsec/port/tlshand.c Thu Sep 15 17:43:42 2005 +++ /sys/src/libsec/port/tlshand.c Sat Sep 17 17:38:26 2005 @@ -2068,9 +2068,12 @@ uchar *a; Bytes* ans; + a = nil; n = (mpsignif(big)+7)/8; m = mptobe(big, nil, n, &a); ans = makebytes(a, m); + if(a != nil) + free(a); return ans; } --- /sys/src/libsec/port/x509.c Thu Sep 15 17:43:55 2005 +++ /sys/src/libsec/port/x509.c Sat Sep 17 17:38:01 2005 @@ -1459,21 +1459,21 @@ freeints(v->u.objidval); break; case VString: - if (v->u.stringval) + if(v->u.stringval) free(v->u.stringval); break; case VSeq: el = v->u.seqval; for(l = el; l != nil; l = l->tl) freevalfields(&l->hd.val); - if (el) + if(el) freeelist(el); break; case VSet: el = v->u.setval; for(l = el; l != nil; l = l->tl) freevalfields(&l->hd.val); - if (el) + if(el) freeelist(el); break; } @@ -1598,7 +1598,7 @@ static void freecert(CertX509* c) { - if (!c) return; + if(!c) return; if(c->issuer != nil) free(c->issuer); if(c->validity_start != nil) @@ -1609,6 +1609,7 @@ free(c->subject); freebytes(c->publickey); freebytes(c->signature); + free(c); } /* @@ -1831,15 +1832,18 @@ decode_rsapubkey(Bytes* a) { Elem e; - Elist *el; + Elist *el, *l; mpint *mp; RSApub* key; + l = nil; key = rsapuballoc(); if(decode(a->data, a->len, &e) != ASN_OK) goto errret; if(!is_seq(&e, &el) || elistlen(el) != 2) goto errret; + + l = el; key->n = mp = asn1mpint(&el->hd); if(mp == nil) @@ -1849,8 +1853,13 @@ key->ek = mp = asn1mpint(&el->hd); if(mp == nil) goto errret; + + if(l != nil) + freeelist(l); return key; errret: + if(l != nil) + freeelist(l); rsapubfree(key); return nil; } @@ -2003,7 +2012,10 @@ p+length < p) return; info = p; - if(ber_decode(&p, pend, &elem) != ASN_OK || elem.tag.num != SEQUENCE) + if(ber_decode(&p, pend, &elem) != ASN_OK) + return; + freevalfields(&elem.val); + if(elem.tag.num != SEQUENCE) return; infolen = p - info; (*digestfun)(info, infolen, digest, nil); @@ -2019,6 +2031,11 @@ int buflen; mpint *pkcs1; int nlen; + char *err; + + err = nil; + pkcs1 = nil; + pkcs1buf = nil; /* one less than the byte length of the modulus */ nlen = (mpsignif(pk->n)-1)/8; @@ -2029,22 +2046,35 @@ pkcs1buf = nil; buflen = mptobe(pkcs1, nil, 0, &pkcs1buf); buf = pkcs1buf; - if(buflen != nlen || buf[0] != 1) - return "expected 1"; + if(buflen != nlen || buf[0] != 1) { + err = "expected 1"; + goto end; + } buf++; while(buf[0] == 0xff) buf++; - if(buf[0] != 0) - return "expected 0"; + if(buf[0] != 0) { + err = "expected 0"; + goto end; + } buf++; buflen -= buf-pkcs1buf; if(decode(buf, buflen, &e) != ASN_OK || !is_seq(&e, &el) || elistlen(el) != 2 || - !is_octetstring(&el->tl->hd, &digest)) - return "signature parse error"; + !is_octetstring(&el->tl->hd, &digest)) { + err = "signature parse error"; + goto end; + } *psigalg = &el->hd; if(memcmp(digest->data, edigest, digest->len) == 0) - return nil; - return "digests did not match"; + goto end; + err = "digests did not match"; + +end: + if(pkcs1 != nil) + mpfree(pkcs1); + if(pkcs1buf != nil) + free(pkcs1buf); + return err; } RSApub*