ref: e601e1605bfa52d1ce944b915191f5f28c12f138
parent: 16bbaa20140a575efbae7336cef6eb2484a0f367
author: cinap_lenrek <[email protected]>
date: Wed May 27 20:31:36 EDT 2015
libsec: cleanup x509 and tlshand - add overflow checks for newbytes(), newbits(), newints() - remove suspicious nil check from estrdup() - remove useless nil checks before free
--- a/sys/src/libsec/port/tlshand.c
+++ b/sys/src/libsec/port/tlshand.c
@@ -325,7 +325,6 @@
static mpint* bytestomp(Bytes* bytes);
static void freebytes(Bytes* b);
static Ints* newints(int len);
-static Ints* makeints(int* buf, int len);
static void freeints(Ints* b);
/* x509.c */
@@ -2228,10 +2227,9 @@
// 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){
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;
- if(pm != nil)
- freebytes(pm);
+ freebytes(pm);
pm = newbytes(MasterSecretSize);
genrandom(pm->data, MasterSecretSize);
}
@@ -2537,6 +2535,8 @@
{
Bytes* ans;
+ if(len < 0)
+ abort();
ans = (Bytes*)emalloc(OFFSET(data[0], Bytes) + len);
ans->len = len;
return ans;
@@ -2551,8 +2551,7 @@
Bytes* ans;
ans = newbytes(len);
- if(len > 0)
- memmove(ans->data, buf, len);
+ memmove(ans->data, buf, len);
return ans;
}
@@ -2559,8 +2558,7 @@
static void
freebytes(Bytes* b)
{
- if(b != nil)
- free(b);
+ free(b);
}
/* len is number of ints */
@@ -2569,25 +2567,15 @@
{
Ints* ans;
+ if(len < 0 || len > ((uint)-1>>1)/sizeof(int))
+ abort();
ans = (Ints*)emalloc(OFFSET(data[0], Ints) + len*sizeof(int));
ans->len = len;
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
freeints(Ints* b)
{
- if(b != nil)
- free(b);
+ free(b);
}
--- a/sys/src/libsec/port/x509.c
+++ b/sys/src/libsec/port/x509.c
@@ -177,14 +177,13 @@
static char*
estrdup(char *s)
{
- char *d, *d0;
+ char *d;
+ int n;
- if(!s)
- return 0;
- d = d0 = emalloc(strlen(s)+1);
- while(*d++ = *s++)
- ;
- return d0;
+ n = strlen(s)+1;
+ d = emalloc(n);
+ memmove(d, s, n);
+ return d;
}
@@ -1287,6 +1286,8 @@
{
Bytes* ans;
+ if(len < 0)
+ abort();
ans = (Bytes*)emalloc(OFFSETOF(data[0], Bytes) + len);
ans->len = len;
return ans;
@@ -1308,8 +1309,7 @@
static void
freebytes(Bytes* b)
{
- if(b != nil)
- free(b);
+ free(b);
}
/*
@@ -1347,6 +1347,8 @@
{
Ints* ans;
+ if(len < 0 || len > ((uint)-1>>1)/sizeof(int))
+ abort();
ans = (Ints*)emalloc(OFFSETOF(data[0], Ints) + len*sizeof(int));
ans->len = len;
return ans;
@@ -1358,8 +1360,7 @@
Ints* ans;
ans = newints(len);
- if(len > 0)
- memmove(ans->data, buf, len*sizeof(int));
+ memmove(ans->data, buf, len*sizeof(int));
return ans;
}
@@ -1366,8 +1367,7 @@
static void
freeints(Ints* b)
{
- if(b != nil)
- free(b);
+ free(b);
}
/* len is number of bytes */
@@ -1376,6 +1376,8 @@
{
Bits* ans;
+ if(len < 0)
+ abort();
ans = (Bits*)emalloc(OFFSETOF(data[0], Bits) + len);
ans->len = len;
ans->unusedbits = 0;
@@ -1396,8 +1398,7 @@
static void
freebits(Bits* b)
{
- if(b != nil)
- free(b);
+ free(b);
}
static Elist*
@@ -1471,15 +1472,13 @@
el = v->u.seqval;
for(l = el; l != nil; l = l->tl)
freevalfields(&l->hd.val);
- if(el)
- freeelist(el);
+ freeelist(el);
break;
case VSet:
el = v->u.setval;
for(l = el; l != nil; l = l->tl)
freevalfields(&l->hd.val);
- if(el)
- freeelist(el);
+ freeelist(el);
break;
}
}
@@ -1669,15 +1668,12 @@
static void
freecert(CertX509* c)
{
- if(!c) return;
- if(c->issuer != nil)
- free(c->issuer);
- if(c->validity_start != nil)
- free(c->validity_start);
- if(c->validity_end != nil)
- free(c->validity_end);
- if(c->subject != nil)
- free(c->subject);
+ if(c == nil)
+ return;
+ free(c->issuer);
+ free(c->validity_start);
+ free(c->validity_end);
+ free(c->subject);
freebytes(c->publickey);
freebytes(c->signature);
free(c);
@@ -1925,12 +1921,10 @@
if(mp == nil)
goto errret;
- if(l != nil)
- freeelist(l);
+ freeelist(l);
return key;
errret:
- if(l != nil)
- freeelist(l);
+ freeelist(l);
rsapubfree(key);
return nil;
}
@@ -2222,10 +2216,8 @@
err = "digests did not match";
end:
- if(pkcs1 != nil)
- mpfree(pkcs1);
- if(pkcs1buf != nil)
- free(pkcs1buf);
+ mpfree(pkcs1);
+ free(pkcs1buf);
return err;
}
@@ -2366,7 +2358,7 @@
e.tag.class = Universal;
e.tag.num = UTCTime;
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);
e.val.u.stringval = estrdup(utc);
return e;