svn commit: r316613 - in stable/11/lib/libc: gen iconv net regex rpc stdio stdlib
Rodney W. Grimes
freebsd at pdx.rh.CN85.dnsmgr.net
Sat Apr 8 00:19:21 UTC 2017
[ Charset UTF-8 unsupported, converting... ]
> Author: pfg
> Date: Fri Apr 7 16:08:04 2017
> New Revision: 316613
> URL: https://svnweb.freebsd.org/changeset/base/316613
>
> Log:
> MFC r315162:
> 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.
>
> Modified:
> stable/11/lib/libc/gen/glob.c
> stable/11/lib/libc/gen/scandir.c
> stable/11/lib/libc/gen/setmode.c
> stable/11/lib/libc/gen/wordexp.c
> stable/11/lib/libc/iconv/citrus_esdb.c
> stable/11/lib/libc/net/nsdispatch.c
> stable/11/lib/libc/regex/regcomp.c
> stable/11/lib/libc/rpc/getnetconfig.c
> stable/11/lib/libc/stdio/open_wmemstream.c
> stable/11/lib/libc/stdio/printf-pos.c
> stable/11/lib/libc/stdio/ungetc.c
> stable/11/lib/libc/stdlib/getenv.c
> Directory Properties:
> stable/11/ (props changed)
>
> Modified: stable/11/lib/libc/gen/glob.c
> ==============================================================================
> --- stable/11/lib/libc/gen/glob.c Fri Apr 7 15:41:49 2017 (r316612)
> +++ stable/11/lib/libc/gen/glob.c Fri Apr 7 16:08:04 2017 (r316613)
> @@ -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: stable/11/lib/libc/gen/scandir.c
> ==============================================================================
> --- stable/11/lib/libc/gen/scandir.c Fri Apr 7 15:41:49 2017 (r316612)
> +++ stable/11/lib/libc/gen/scandir.c Fri Apr 7 16:08:04 2017 (r316613)
> @@ -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: stable/11/lib/libc/gen/setmode.c
> ==============================================================================
> --- stable/11/lib/libc/gen/setmode.c Fri Apr 7 15:41:49 2017 (r316612)
> +++ stable/11/lib/libc/gen/setmode.c Fri Apr 7 16:08:04 2017 (r316613)
> @@ -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: stable/11/lib/libc/gen/wordexp.c
> ==============================================================================
> --- stable/11/lib/libc/gen/wordexp.c Fri Apr 7 15:41:49 2017 (r316612)
> +++ stable/11/lib/libc/gen/wordexp.c Fri Apr 7 16:08:04 2017 (r316613)
> @@ -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: stable/11/lib/libc/iconv/citrus_esdb.c
> ==============================================================================
> --- stable/11/lib/libc/iconv/citrus_esdb.c Fri Apr 7 15:41:49 2017 (r316612)
> +++ stable/11/lib/libc/iconv/citrus_esdb.c Fri Apr 7 16:08:04 2017 (r316613)
> @@ -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: stable/11/lib/libc/net/nsdispatch.c
> ==============================================================================
> --- stable/11/lib/libc/net/nsdispatch.c Fri Apr 7 15:41:49 2017 (r316612)
> +++ stable/11/lib/libc/net/nsdispatch.c Fri Apr 7 16:08:04 2017 (r316613)
> @@ -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: stable/11/lib/libc/regex/regcomp.c
> ==============================================================================
> --- stable/11/lib/libc/regex/regcomp.c Fri Apr 7 15:41:49 2017 (r316612)
> +++ stable/11/lib/libc/regex/regcomp.c Fri Apr 7 16:08:04 2017 (r316613)
> @@ -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: stable/11/lib/libc/rpc/getnetconfig.c
> ==============================================================================
> --- stable/11/lib/libc/rpc/getnetconfig.c Fri Apr 7 15:41:49 2017 (r316612)
> +++ stable/11/lib/libc/rpc/getnetconfig.c Fri Apr 7 16:08:04 2017 (r316613)
> @@ -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: stable/11/lib/libc/stdio/open_wmemstream.c
> ==============================================================================
> --- stable/11/lib/libc/stdio/open_wmemstream.c Fri Apr 7 15:41:49 2017 (r316612)
> +++ stable/11/lib/libc/stdio/open_wmemstream.c Fri Apr 7 16:08:04 2017 (r316613)
> @@ -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: stable/11/lib/libc/stdio/printf-pos.c
> ==============================================================================
> --- stable/11/lib/libc/stdio/printf-pos.c Fri Apr 7 15:41:49 2017 (r316612)
> +++ stable/11/lib/libc/stdio/printf-pos.c Fri Apr 7 16:08:04 2017 (r316613)
> @@ -633,7 +633,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: stable/11/lib/libc/stdio/ungetc.c
> ==============================================================================
> --- stable/11/lib/libc/stdio/ungetc.c Fri Apr 7 15:41:49 2017 (r316612)
> +++ stable/11/lib/libc/stdio/ungetc.c Fri Apr 7 16:08:04 2017 (r316613)
> @@ -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: stable/11/lib/libc/stdlib/getenv.c
> ==============================================================================
> --- stable/11/lib/libc/stdlib/getenv.c Fri Apr 7 15:41:49 2017 (r316612)
> +++ stable/11/lib/libc/stdlib/getenv.c Fri Apr 7 16:08:04 2017 (r316613)
> @@ -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);
>
>
I am not sure, but isnt this a code pessimization as you now push
an extra arg on the stack, and also remove the possiblity of compile
time const calculation of foo * bar?
--
Rod Grimes rgrimes at freebsd.org
More information about the svn-src-stable
mailing list