Date: Sun, 12 Mar 2017 16:03:34 +0000 (UTC) From: "Pedro F. Giffuni" <pfg@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r315162 - in head/lib/libc: gen iconv net regex rpc stdio stdlib Message-ID: <201703121603.v2CG3YdU028591@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: pfg Date: Sun Mar 12 16:03:34 2017 New Revision: 315162 URL: https://svnweb.freebsd.org/changeset/base/315162 Log: libc: provide some bounds-checking through reallocarray(3). reallocarray(3) is a non portable extension that originated in OpenBSD. Given that it is already in FreeBSD's libc it is useful for the cases where reallocation involves a multiplication. MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D9955 Modified: head/lib/libc/gen/glob.c head/lib/libc/gen/scandir.c head/lib/libc/gen/setmode.c head/lib/libc/gen/wordexp.c head/lib/libc/iconv/citrus_esdb.c head/lib/libc/net/nsdispatch.c head/lib/libc/regex/regcomp.c head/lib/libc/rpc/getnetconfig.c head/lib/libc/stdio/open_wmemstream.c head/lib/libc/stdio/printf-pos.c head/lib/libc/stdio/ungetc.c head/lib/libc/stdlib/getenv.c Modified: head/lib/libc/gen/glob.c ============================================================================== --- head/lib/libc/gen/glob.c Sun Mar 12 15:36:07 2017 (r315161) +++ head/lib/libc/gen/glob.c Sun Mar 12 16:03:34 2017 (r315162) @@ -850,7 +850,7 @@ globextend(const Char *path, glob_t *pgl const char *origpat) { char **pathv; - size_t i, newsize, len; + size_t i, newn, len; char *copy; const Char *p; @@ -860,9 +860,9 @@ globextend(const Char *path, glob_t *pgl return (GLOB_NOSPACE); } - newsize = sizeof(*pathv) * (2 + pglob->gl_pathc + pglob->gl_offs); - /* realloc(NULL, newsize) is equivalent to malloc(newsize). */ - pathv = realloc((void *)pglob->gl_pathv, newsize); + newn = 2 + pglob->gl_pathc + pglob->gl_offs; + /* reallocarray(NULL, newn, size) is equivalent to malloc(newn*size). */ + pathv = reallocarray(pglob->gl_pathv, newn, sizeof(*pathv)); if (pathv == NULL) return (GLOB_NOSPACE); Modified: head/lib/libc/gen/scandir.c ============================================================================== --- head/lib/libc/gen/scandir.c Sun Mar 12 15:36:07 2017 (r315161) +++ head/lib/libc/gen/scandir.c Sun Mar 12 16:03:34 2017 (r315162) @@ -116,8 +116,8 @@ scandir(const char *dirname, struct dire if (numitems >= arraysz) { struct dirent **names2; - names2 = (struct dirent **)realloc((char *)names, - (arraysz * 2) * sizeof(struct dirent *)); + names2 = reallocarray(names, arraysz, + 2 * sizeof(struct dirent *)); if (names2 == NULL) { free(p); goto fail; Modified: head/lib/libc/gen/setmode.c ============================================================================== --- head/lib/libc/gen/setmode.c Sun Mar 12 15:36:07 2017 (r315161) +++ head/lib/libc/gen/setmode.c Sun Mar 12 16:03:34 2017 (r315162) @@ -155,7 +155,7 @@ common: if (set->cmd2 & CMD2_CLR) { if (set >= endset) { \ BITCMD *newset; \ setlen += SET_LEN_INCR; \ - newset = realloc(saveset, sizeof(BITCMD) * setlen); \ + newset = reallocarray(saveset, setlen, sizeof(BITCMD)); \ if (newset == NULL) \ goto out; \ set = newset + (set - saveset); \ Modified: head/lib/libc/gen/wordexp.c ============================================================================== --- head/lib/libc/gen/wordexp.c Sun Mar 12 15:36:07 2017 (r315161) +++ head/lib/libc/gen/wordexp.c Sun Mar 12 16:03:34 2017 (r315162) @@ -234,8 +234,8 @@ we_askshell(const char *words, wordexp_t vofs += we->we_offs; we->we_wordc += nwords; we->we_nbytes += nbytes; - if ((nwv = realloc(we->we_wordv, (we->we_wordc + 1 + - (flags & WRDE_DOOFFS ? we->we_offs : 0)) * + if ((nwv = reallocarray(we->we_wordv, (we->we_wordc + 1 + + (flags & WRDE_DOOFFS ? we->we_offs : 0)), sizeof(char *))) == NULL) { error = WRDE_NOSPACE; goto cleanup; Modified: head/lib/libc/iconv/citrus_esdb.c ============================================================================== --- head/lib/libc/iconv/citrus_esdb.c Sun Mar 12 15:36:07 2017 (r315161) +++ head/lib/libc/iconv/citrus_esdb.c Sun Mar 12 16:03:34 2017 (r315162) @@ -347,7 +347,7 @@ _citrus_esdb_get_list(char ***rlist, siz ret = 0; /* XXX: why reallocing the list space posteriorly? shouldn't be done earlier? */ - q = realloc(list, num * sizeof(char *)); + q = reallocarray(list, num, sizeof(char *)); if (!q) { ret = ENOMEM; goto quit3; Modified: head/lib/libc/net/nsdispatch.c ============================================================================== --- head/lib/libc/net/nsdispatch.c Sun Mar 12 15:36:07 2017 (r315161) +++ head/lib/libc/net/nsdispatch.c Sun Mar 12 16:03:34 2017 (r315162) @@ -213,7 +213,7 @@ vector_append(const void *elem, void *ve void *p; if ((*count % ELEMSPERCHUNK) == 0) { - p = realloc(vec, (*count + ELEMSPERCHUNK) * esize); + p = reallocarray(vec, *count + ELEMSPERCHUNK, esize); if (p == NULL) { nss_log_simple(LOG_ERR, "memory allocation failure"); return (vec); Modified: head/lib/libc/regex/regcomp.c ============================================================================== --- head/lib/libc/regex/regcomp.c Sun Mar 12 15:36:07 2017 (r315161) +++ head/lib/libc/regex/regcomp.c Sun Mar 12 16:03:34 2017 (r315162) @@ -1143,7 +1143,7 @@ allocset(struct parse *p) { cset *cs, *ncs; - ncs = realloc(p->g->sets, (p->g->ncsets + 1) * sizeof(*ncs)); + ncs = reallocarray(p->g->sets, p->g->ncsets + 1, sizeof(*ncs)); if (ncs == NULL) { SETERROR(REG_ESPACE); return (NULL); @@ -1206,7 +1206,7 @@ CHadd(struct parse *p, cset *cs, wint_t if (ch < NC) cs->bmp[ch >> 3] |= 1 << (ch & 7); else { - newwides = realloc(cs->wides, (cs->nwides + 1) * + newwides = reallocarray(cs->wides, cs->nwides + 1, sizeof(*cs->wides)); if (newwides == NULL) { SETERROR(REG_ESPACE); @@ -1235,7 +1235,7 @@ CHaddrange(struct parse *p, cset *cs, wi CHadd(p, cs, min); if (min >= max) return; - newranges = realloc(cs->ranges, (cs->nranges + 1) * + newranges = reallocarray(cs->ranges, cs->nranges + 1, sizeof(*cs->ranges)); if (newranges == NULL) { SETERROR(REG_ESPACE); @@ -1259,7 +1259,7 @@ CHaddtype(struct parse *p, cset *cs, wct for (i = 0; i < NC; i++) if (iswctype(i, wct)) CHadd(p, cs, i); - newtypes = realloc(cs->types, (cs->ntypes + 1) * + newtypes = reallocarray(cs->types, cs->ntypes + 1, sizeof(*cs->types)); if (newtypes == NULL) { SETERROR(REG_ESPACE); @@ -1382,7 +1382,7 @@ enlarge(struct parse *p, sopno size) if (p->ssize >= size) return 1; - sp = (sop *)realloc(p->strip, size*sizeof(sop)); + sp = reallocarray(p->strip, size, sizeof(sop)); if (sp == NULL) { SETERROR(REG_ESPACE); return 0; @@ -1400,7 +1400,7 @@ static void stripsnug(struct parse *p, struct re_guts *g) { g->nstates = p->slen; - g->strip = (sop *)realloc((char *)p->strip, p->slen * sizeof(sop)); + g->strip = reallocarray((char *)p->strip, p->slen, sizeof(sop)); if (g->strip == NULL) { SETERROR(REG_ESPACE); g->strip = p->strip; Modified: head/lib/libc/rpc/getnetconfig.c ============================================================================== --- head/lib/libc/rpc/getnetconfig.c Sun Mar 12 15:36:07 2017 (r315161) +++ head/lib/libc/rpc/getnetconfig.c Sun Mar 12 16:03:34 2017 (r315162) @@ -630,8 +630,8 @@ parse_ncp(char *stringp, struct netconfi ncp->nc_lookups = NULL; ncp->nc_nlookups = 0; while ((cp = tokenp) != NULL) { - if ((nc_lookups = realloc(ncp->nc_lookups, - (ncp->nc_nlookups + 1) * sizeof *ncp->nc_lookups)) == NULL) { + if ((nc_lookups = reallocarray(ncp->nc_lookups, + ncp->nc_nlookups + 1, sizeof(*ncp->nc_lookups))) == NULL) { free(ncp->nc_lookups); ncp->nc_lookups = NULL; return (-1); Modified: head/lib/libc/stdio/open_wmemstream.c ============================================================================== --- head/lib/libc/stdio/open_wmemstream.c Sun Mar 12 15:36:07 2017 (r315161) +++ head/lib/libc/stdio/open_wmemstream.c Sun Mar 12 16:03:34 2017 (r315162) @@ -63,7 +63,7 @@ wmemstream_grow(struct wmemstream *ms, f else newsize = newoff; if (newsize > ms->len) { - buf = realloc(*ms->bufp, (newsize + 1) * sizeof(wchar_t)); + buf = reallocarray(*ms->bufp, newsize + 1, sizeof(wchar_t)); if (buf != NULL) { #ifdef DEBUG fprintf(stderr, "WMS: %p growing from %zd to %zd\n", Modified: head/lib/libc/stdio/printf-pos.c ============================================================================== --- head/lib/libc/stdio/printf-pos.c Sun Mar 12 15:36:07 2017 (r315161) +++ head/lib/libc/stdio/printf-pos.c Sun Mar 12 16:03:34 2017 (r315162) @@ -655,7 +655,7 @@ __grow_type_table(struct typetable *type return (-1); bcopy(oldtable, newtable, oldsize * sizeof(enum typeid)); } else { - newtable = realloc(oldtable, newsize * sizeof(enum typeid)); + newtable = reallocarray(oldtable, newsize, sizeof(enum typeid)); if (newtable == NULL) return (-1); } Modified: head/lib/libc/stdio/ungetc.c ============================================================================== --- head/lib/libc/stdio/ungetc.c Sun Mar 12 15:36:07 2017 (r315161) +++ head/lib/libc/stdio/ungetc.c Sun Mar 12 16:03:34 2017 (r315162) @@ -73,14 +73,14 @@ __submore(FILE *fp) return (0); } i = fp->_ub._size; - p = realloc(fp->_ub._base, (size_t)(i << 1)); + p = reallocarray(fp->_ub._base, i, 2); if (p == NULL) return (EOF); /* no overlap (hence can use memcpy) because we doubled the size */ (void)memcpy((void *)(p + i), (void *)p, (size_t)i); fp->_p = p + i; fp->_ub._base = p; - fp->_ub._size = i << 1; + fp->_ub._size = i * 2; return (0); } Modified: head/lib/libc/stdlib/getenv.c ============================================================================== --- head/lib/libc/stdlib/getenv.c Sun Mar 12 15:36:07 2017 (r315161) +++ head/lib/libc/stdlib/getenv.c Sun Mar 12 16:03:34 2017 (r315162) @@ -272,8 +272,8 @@ __rebuild_environ(int newEnvironSize) /* Resize environ. */ if (newEnvironSize > environSize) { tmpEnvironSize = newEnvironSize * 2; - tmpEnviron = realloc(intEnviron, sizeof (*intEnviron) * - (tmpEnvironSize + 1)); + tmpEnviron = reallocarray(intEnviron, tmpEnvironSize + 1, + sizeof(*intEnviron)); if (tmpEnviron == NULL) return (-1); environSize = tmpEnvironSize; @@ -306,8 +306,8 @@ __enlarge_env(void) envVarsTotal++; if (envVarsTotal > envVarsSize) { newEnvVarsSize = envVarsTotal * 2; - tmpEnvVars = realloc(envVars, sizeof (*envVars) * - newEnvVarsSize); + tmpEnvVars = reallocarray(envVars, newEnvVarsSize, + sizeof(*envVars)); if (tmpEnvVars == NULL) { envVarsTotal--; return (false);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201703121603.v2CG3YdU028591>