libsec: cleanup x509 and tlshand
- add overflow checks for newbytes(), newbits(), newints() - remove suspicious nil check from estrdup() - remove useless nil checks before free
This commit is contained in:
parent
16bbaa2014
commit
e601e1605b
|
@ -325,7 +325,6 @@ static Bytes* mptobytes(mpint* big);
|
||||||
static mpint* bytestomp(Bytes* bytes);
|
static mpint* bytestomp(Bytes* bytes);
|
||||||
static void freebytes(Bytes* b);
|
static void freebytes(Bytes* b);
|
||||||
static Ints* newints(int len);
|
static Ints* newints(int len);
|
||||||
static Ints* makeints(int* buf, int len);
|
|
||||||
static void freeints(Ints* b);
|
static void freeints(Ints* b);
|
||||||
|
|
||||||
/* x509.c */
|
/* x509.c */
|
||||||
|
@ -2228,10 +2227,9 @@ serverMasterSecret(TlsSec *sec, Bytes *epm)
|
||||||
// Hence the fprint(2,) can't be replaced by tlsError(), which sends an Alert msg to the client.
|
// Hence the fprint(2,) can't be replaced by tlsError(), which sends an Alert msg to the client.
|
||||||
if(sec->ok < 0 || pm == nil || get16(pm->data) != sec->clientVers){
|
if(sec->ok < 0 || pm == nil || get16(pm->data) != sec->clientVers){
|
||||||
fprint(2, "serverMasterSecret failed ok=%d pm=%p pmvers=%x cvers=%x nepm=%d\n",
|
fprint(2, "serverMasterSecret failed ok=%d pm=%p pmvers=%x cvers=%x nepm=%d\n",
|
||||||
sec->ok, pm, pm ? get16(pm->data) : -1, sec->clientVers, epm->len);
|
sec->ok, pm, pm != nil ? get16(pm->data) : -1, sec->clientVers, epm->len);
|
||||||
sec->ok = -1;
|
sec->ok = -1;
|
||||||
if(pm != nil)
|
freebytes(pm);
|
||||||
freebytes(pm);
|
|
||||||
pm = newbytes(MasterSecretSize);
|
pm = newbytes(MasterSecretSize);
|
||||||
genrandom(pm->data, MasterSecretSize);
|
genrandom(pm->data, MasterSecretSize);
|
||||||
}
|
}
|
||||||
|
@ -2537,6 +2535,8 @@ newbytes(int len)
|
||||||
{
|
{
|
||||||
Bytes* ans;
|
Bytes* ans;
|
||||||
|
|
||||||
|
if(len < 0)
|
||||||
|
abort();
|
||||||
ans = (Bytes*)emalloc(OFFSET(data[0], Bytes) + len);
|
ans = (Bytes*)emalloc(OFFSET(data[0], Bytes) + len);
|
||||||
ans->len = len;
|
ans->len = len;
|
||||||
return ans;
|
return ans;
|
||||||
|
@ -2551,16 +2551,14 @@ makebytes(uchar* buf, int len)
|
||||||
Bytes* ans;
|
Bytes* ans;
|
||||||
|
|
||||||
ans = newbytes(len);
|
ans = newbytes(len);
|
||||||
if(len > 0)
|
memmove(ans->data, buf, len);
|
||||||
memmove(ans->data, buf, len);
|
|
||||||
return ans;
|
return ans;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
freebytes(Bytes* b)
|
freebytes(Bytes* b)
|
||||||
{
|
{
|
||||||
if(b != nil)
|
free(b);
|
||||||
free(b);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* len is number of ints */
|
/* len is number of ints */
|
||||||
|
@ -2569,25 +2567,15 @@ newints(int len)
|
||||||
{
|
{
|
||||||
Ints* ans;
|
Ints* ans;
|
||||||
|
|
||||||
|
if(len < 0 || len > ((uint)-1>>1)/sizeof(int))
|
||||||
|
abort();
|
||||||
ans = (Ints*)emalloc(OFFSET(data[0], Ints) + len*sizeof(int));
|
ans = (Ints*)emalloc(OFFSET(data[0], Ints) + len*sizeof(int));
|
||||||
ans->len = len;
|
ans->len = len;
|
||||||
return ans;
|
return ans;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Ints*
|
|
||||||
makeints(int* buf, int len)
|
|
||||||
{
|
|
||||||
Ints* ans;
|
|
||||||
|
|
||||||
ans = newints(len);
|
|
||||||
if(len > 0)
|
|
||||||
memmove(ans->data, buf, len*sizeof(int));
|
|
||||||
return ans;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
freeints(Ints* b)
|
freeints(Ints* b)
|
||||||
{
|
{
|
||||||
if(b != nil)
|
free(b);
|
||||||
free(b);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -177,14 +177,13 @@ emalloc(int n)
|
||||||
static char*
|
static char*
|
||||||
estrdup(char *s)
|
estrdup(char *s)
|
||||||
{
|
{
|
||||||
char *d, *d0;
|
char *d;
|
||||||
|
int n;
|
||||||
|
|
||||||
if(!s)
|
n = strlen(s)+1;
|
||||||
return 0;
|
d = emalloc(n);
|
||||||
d = d0 = emalloc(strlen(s)+1);
|
memmove(d, s, n);
|
||||||
while(*d++ = *s++)
|
return d;
|
||||||
;
|
|
||||||
return d0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1287,6 +1286,8 @@ newbytes(int len)
|
||||||
{
|
{
|
||||||
Bytes* ans;
|
Bytes* ans;
|
||||||
|
|
||||||
|
if(len < 0)
|
||||||
|
abort();
|
||||||
ans = (Bytes*)emalloc(OFFSETOF(data[0], Bytes) + len);
|
ans = (Bytes*)emalloc(OFFSETOF(data[0], Bytes) + len);
|
||||||
ans->len = len;
|
ans->len = len;
|
||||||
return ans;
|
return ans;
|
||||||
|
@ -1308,8 +1309,7 @@ makebytes(uchar* buf, int len)
|
||||||
static void
|
static void
|
||||||
freebytes(Bytes* b)
|
freebytes(Bytes* b)
|
||||||
{
|
{
|
||||||
if(b != nil)
|
free(b);
|
||||||
free(b);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1347,6 +1347,8 @@ newints(int len)
|
||||||
{
|
{
|
||||||
Ints* ans;
|
Ints* ans;
|
||||||
|
|
||||||
|
if(len < 0 || len > ((uint)-1>>1)/sizeof(int))
|
||||||
|
abort();
|
||||||
ans = (Ints*)emalloc(OFFSETOF(data[0], Ints) + len*sizeof(int));
|
ans = (Ints*)emalloc(OFFSETOF(data[0], Ints) + len*sizeof(int));
|
||||||
ans->len = len;
|
ans->len = len;
|
||||||
return ans;
|
return ans;
|
||||||
|
@ -1358,16 +1360,14 @@ makeints(int* buf, int len)
|
||||||
Ints* ans;
|
Ints* ans;
|
||||||
|
|
||||||
ans = newints(len);
|
ans = newints(len);
|
||||||
if(len > 0)
|
memmove(ans->data, buf, len*sizeof(int));
|
||||||
memmove(ans->data, buf, len*sizeof(int));
|
|
||||||
return ans;
|
return ans;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
freeints(Ints* b)
|
freeints(Ints* b)
|
||||||
{
|
{
|
||||||
if(b != nil)
|
free(b);
|
||||||
free(b);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* len is number of bytes */
|
/* len is number of bytes */
|
||||||
|
@ -1376,6 +1376,8 @@ newbits(int len)
|
||||||
{
|
{
|
||||||
Bits* ans;
|
Bits* ans;
|
||||||
|
|
||||||
|
if(len < 0)
|
||||||
|
abort();
|
||||||
ans = (Bits*)emalloc(OFFSETOF(data[0], Bits) + len);
|
ans = (Bits*)emalloc(OFFSETOF(data[0], Bits) + len);
|
||||||
ans->len = len;
|
ans->len = len;
|
||||||
ans->unusedbits = 0;
|
ans->unusedbits = 0;
|
||||||
|
@ -1396,8 +1398,7 @@ makebits(uchar* buf, int len, int unusedbits)
|
||||||
static void
|
static void
|
||||||
freebits(Bits* b)
|
freebits(Bits* b)
|
||||||
{
|
{
|
||||||
if(b != nil)
|
free(b);
|
||||||
free(b);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static Elist*
|
static Elist*
|
||||||
|
@ -1471,15 +1472,13 @@ freevalfields(Value* v)
|
||||||
el = v->u.seqval;
|
el = v->u.seqval;
|
||||||
for(l = el; l != nil; l = l->tl)
|
for(l = el; l != nil; l = l->tl)
|
||||||
freevalfields(&l->hd.val);
|
freevalfields(&l->hd.val);
|
||||||
if(el)
|
freeelist(el);
|
||||||
freeelist(el);
|
|
||||||
break;
|
break;
|
||||||
case VSet:
|
case VSet:
|
||||||
el = v->u.setval;
|
el = v->u.setval;
|
||||||
for(l = el; l != nil; l = l->tl)
|
for(l = el; l != nil; l = l->tl)
|
||||||
freevalfields(&l->hd.val);
|
freevalfields(&l->hd.val);
|
||||||
if(el)
|
freeelist(el);
|
||||||
freeelist(el);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1669,15 +1668,12 @@ static DigestAlg *digestalg[NUMALGS+1] = {
|
||||||
static void
|
static void
|
||||||
freecert(CertX509* c)
|
freecert(CertX509* c)
|
||||||
{
|
{
|
||||||
if(!c) return;
|
if(c == nil)
|
||||||
if(c->issuer != nil)
|
return;
|
||||||
free(c->issuer);
|
free(c->issuer);
|
||||||
if(c->validity_start != nil)
|
free(c->validity_start);
|
||||||
free(c->validity_start);
|
free(c->validity_end);
|
||||||
if(c->validity_end != nil)
|
free(c->subject);
|
||||||
free(c->validity_end);
|
|
||||||
if(c->subject != nil)
|
|
||||||
free(c->subject);
|
|
||||||
freebytes(c->publickey);
|
freebytes(c->publickey);
|
||||||
freebytes(c->signature);
|
freebytes(c->signature);
|
||||||
free(c);
|
free(c);
|
||||||
|
@ -1925,12 +1921,10 @@ decode_rsapubkey(Bytes* a)
|
||||||
if(mp == nil)
|
if(mp == nil)
|
||||||
goto errret;
|
goto errret;
|
||||||
|
|
||||||
if(l != nil)
|
freeelist(l);
|
||||||
freeelist(l);
|
|
||||||
return key;
|
return key;
|
||||||
errret:
|
errret:
|
||||||
if(l != nil)
|
freeelist(l);
|
||||||
freeelist(l);
|
|
||||||
rsapubfree(key);
|
rsapubfree(key);
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
@ -2222,10 +2216,8 @@ verify_signature(Bytes* signature, RSApub *pk, uchar *edigest, int edigestlen, E
|
||||||
err = "digests did not match";
|
err = "digests did not match";
|
||||||
|
|
||||||
end:
|
end:
|
||||||
if(pkcs1 != nil)
|
mpfree(pkcs1);
|
||||||
mpfree(pkcs1);
|
free(pkcs1buf);
|
||||||
if(pkcs1buf != nil)
|
|
||||||
free(pkcs1buf);
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2366,7 +2358,7 @@ mkutc(long t)
|
||||||
e.tag.class = Universal;
|
e.tag.class = Universal;
|
||||||
e.tag.num = UTCTime;
|
e.tag.num = UTCTime;
|
||||||
e.val.tag = VString;
|
e.val.tag = VString;
|
||||||
snprint(utc, 50, "%.2d%.2d%.2d%.2d%.2d%.2dZ",
|
snprint(utc, sizeof(utc), "%.2d%.2d%.2d%.2d%.2d%.2dZ",
|
||||||
tm->year % 100, tm->mon+1, tm->mday, tm->hour, tm->min, tm->sec);
|
tm->year % 100, tm->mon+1, tm->mday, tm->hour, tm->min, tm->sec);
|
||||||
e.val.u.stringval = estrdup(utc);
|
e.val.u.stringval = estrdup(utc);
|
||||||
return e;
|
return e;
|
||||||
|
|
Loading…
Reference in a new issue