Module Name: src Committed By: christos Date: Sat Mar 12 17:31:40 UTC 2022
Modified Files: src/lib/libc/gen: fts.c scandir.c setmode.3 setmode.c stringlist.c src/lib/libc/net: getprotoent_r.c getservent_r.c src/lib/libc/stdio: vfwprintf.c src/lib/libc/stdlib: _env.c hcreate.c radixsort.c src/lib/libc/string: wcsdup.c Log Message: reallocarr returns errno. preserve it. To generate a diff of this commit: cvs rdiff -u -r1.50 -r1.51 src/lib/libc/gen/fts.c cvs rdiff -u -r1.29 -r1.30 src/lib/libc/gen/scandir.c cvs rdiff -u -r1.22 -r1.23 src/lib/libc/gen/setmode.3 cvs rdiff -u -r1.36 -r1.37 src/lib/libc/gen/setmode.c cvs rdiff -u -r1.14 -r1.15 src/lib/libc/gen/stringlist.c cvs rdiff -u -r1.7 -r1.8 src/lib/libc/net/getprotoent_r.c cvs rdiff -u -r1.12 -r1.13 src/lib/libc/net/getservent_r.c cvs rdiff -u -r1.37 -r1.38 src/lib/libc/stdio/vfwprintf.c cvs rdiff -u -r1.12 -r1.13 src/lib/libc/stdlib/_env.c cvs rdiff -u -r1.11 -r1.12 src/lib/libc/stdlib/hcreate.c cvs rdiff -u -r1.21 -r1.22 src/lib/libc/stdlib/radixsort.c cvs rdiff -u -r1.5 -r1.6 src/lib/libc/string/wcsdup.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/lib/libc/gen/fts.c diff -u src/lib/libc/gen/fts.c:1.50 src/lib/libc/gen/fts.c:1.51 --- src/lib/libc/gen/fts.c:1.50 Tue Nov 2 04:39:20 2021 +++ src/lib/libc/gen/fts.c Sat Mar 12 12:31:39 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: fts.c,v 1.50 2021/11/02 08:39:20 nia Exp $ */ +/* $NetBSD: fts.c,v 1.51 2022/03/12 17:31:39 christos Exp $ */ /*- * Copyright (c) 1990, 1993, 1994 @@ -38,7 +38,7 @@ #if 0 static char sccsid[] = "@(#)fts.c 8.6 (Berkeley) 8/14/94"; #else -__RCSID("$NetBSD: fts.c,v 1.50 2021/11/02 08:39:20 nia Exp $"); +__RCSID("$NetBSD: fts.c,v 1.51 2022/03/12 17:31:39 christos Exp $"); #endif #endif /* LIBC_SCCS and not lint */ @@ -1015,9 +1015,10 @@ fts_sort(FTS *sp, FTSENT *head, size_t n * 40 so don't realloc one entry at a time. */ if (nitems > sp->fts_nitems) { - if (reallocarr(&sp->fts_array, - nitems + 40, sizeof(FTSENT *)) != 0) - return (head); + errno = reallocarr(&sp->fts_array, + nitems + 40, sizeof(*sp->fts_array)); + if (errno) + return head; sp->fts_nitems = fts_nitems_truncate(nitems + 40); } for (ap = sp->fts_array, p = head; p; p = p->fts_link) Index: src/lib/libc/gen/scandir.c diff -u src/lib/libc/gen/scandir.c:1.29 src/lib/libc/gen/scandir.c:1.30 --- src/lib/libc/gen/scandir.c:1.29 Fri Oct 29 06:40:00 2021 +++ src/lib/libc/gen/scandir.c Sat Mar 12 12:31:39 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: scandir.c,v 1.29 2021/10/29 10:40:00 nia Exp $ */ +/* $NetBSD: scandir.c,v 1.30 2022/03/12 17:31:39 christos Exp $ */ /* * Copyright (c) 1983, 1993 @@ -34,7 +34,7 @@ #if 0 static char sccsid[] = "@(#)scandir.c 8.3 (Berkeley) 1/2/94"; #else -__RCSID("$NetBSD: scandir.c,v 1.29 2021/10/29 10:40:00 nia Exp $"); +__RCSID("$NetBSD: scandir.c,v 1.30 2022/03/12 17:31:39 christos Exp $"); #endif #endif /* LIBC_SCCS and not lint */ @@ -94,6 +94,7 @@ scandir(const char *dirname, struct dire struct dirent *d, *p, **names; size_t nitems, arraysz; DIR *dirp; + int serrno; _DIAGASSERT(dirname != NULL); _DIAGASSERT(namelist != NULL); @@ -105,7 +106,8 @@ scandir(const char *dirname, struct dire goto bad; names = NULL; - if (reallocarr(&names, arraysz, sizeof(*names)) != 0) + errno = reallocarr(&names, arraysz, sizeof(*names)); + if (errno) goto bad; nitems = 0; @@ -120,7 +122,8 @@ scandir(const char *dirname, struct dire if (nitems >= arraysz) { if ((arraysz = dirsize(dirp->dd_fd, arraysz)) == 0) goto bad2; - if (reallocarr(&names, arraysz, sizeof(*names)) != 0) + errno = reallocarr(&names, arraysz, sizeof(*names)); + if (errno) goto bad2; } @@ -146,10 +149,14 @@ scandir(const char *dirname, struct dire return (int)nitems; bad2: + serrno = errno; while (nitems-- > 0) free(names[nitems]); free(names); + errno = serrno; bad: + serrno = errno; (void)closedir(dirp); + errno = serrno; return -1; } Index: src/lib/libc/gen/setmode.3 diff -u src/lib/libc/gen/setmode.3:1.22 src/lib/libc/gen/setmode.3:1.23 --- src/lib/libc/gen/setmode.3:1.22 Mon Jul 3 17:32:49 2017 +++ src/lib/libc/gen/setmode.3 Sat Mar 12 12:31:39 2022 @@ -1,4 +1,4 @@ -.\" $NetBSD: setmode.3,v 1.22 2017/07/03 21:32:49 wiz Exp $ +.\" $NetBSD: setmode.3,v 1.23 2022/03/12 17:31:39 christos Exp $ .\" .\" Copyright (c) 1989, 1991, 1993 .\" The Regents of the University of California. All rights reserved. @@ -29,7 +29,7 @@ .\" .\" @(#)setmode.3 8.2 (Berkeley) 4/28/95 .\" -.Dd January 4, 2009 +.Dd March 12, 2022 .Dt SETMODE 3 .Os .Sh NAME @@ -111,7 +111,7 @@ function may fail and set .Va errno for any of the errors specified for the library routines -.Xr malloc 3 +.Xr reallocarr 3 or .Xr strtol 3 . In addition, Index: src/lib/libc/gen/setmode.c diff -u src/lib/libc/gen/setmode.c:1.36 src/lib/libc/gen/setmode.c:1.37 --- src/lib/libc/gen/setmode.c:1.36 Sat Mar 12 03:32:02 2022 +++ src/lib/libc/gen/setmode.c Sat Mar 12 12:31:39 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: setmode.c,v 1.36 2022/03/12 08:32:02 nia Exp $ */ +/* $NetBSD: setmode.c,v 1.37 2022/03/12 17:31:39 christos Exp $ */ /* * Copyright (c) 1989, 1993, 1994 @@ -37,7 +37,7 @@ #if 0 static char sccsid[] = "@(#)setmode.c 8.2 (Berkeley) 3/25/94"; #else -__RCSID("$NetBSD: setmode.c,v 1.36 2022/03/12 08:32:02 nia Exp $"); +__RCSID("$NetBSD: setmode.c,v 1.37 2022/03/12 17:31:39 christos Exp $"); #endif #endif /* LIBC_SCCS and not lint */ @@ -164,10 +164,9 @@ common: if (set->cmd2 & CMD2_CLR) { BITCMD *newset; \ setlen += SET_LEN_INCR; \ newset = saveset; \ - if (reallocarr(&newset, setlen, sizeof(BITCMD)) != 0) { \ - errno = ENOMEM; \ + errno = reallocarr(&newset, setlen, sizeof(*newset)); \ + if (errno) \ goto out; \ - } \ set = newset + (set - saveset); \ saveset = newset; \ endset = newset + (setlen - 2); \ @@ -208,10 +207,9 @@ setmode(const char *p) setlen = SET_LEN + 2; set = NULL; - if (reallocarr(&set, setlen, sizeof(BITCMD)) != 0) { - errno = ENOMEM; - return (NULL); - } + errno = reallocarr(&set, setlen, sizeof(*set)); + if (errno) + return NULL; saveset = set; endset = set + (setlen - 2); Index: src/lib/libc/gen/stringlist.c diff -u src/lib/libc/gen/stringlist.c:1.14 src/lib/libc/gen/stringlist.c:1.15 --- src/lib/libc/gen/stringlist.c:1.14 Wed May 20 21:29:13 2015 +++ src/lib/libc/gen/stringlist.c Sat Mar 12 12:31:39 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: stringlist.c,v 1.14 2015/05/21 01:29:13 christos Exp $ */ +/* $NetBSD: stringlist.c,v 1.15 2022/03/12 17:31:39 christos Exp $ */ /*- * Copyright (c) 1994, 1999 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include <sys/cdefs.h> #if defined(LIBC_SCCS) && !defined(lint) -__RCSID("$NetBSD: stringlist.c,v 1.14 2015/05/21 01:29:13 christos Exp $"); +__RCSID("$NetBSD: stringlist.c,v 1.15 2022/03/12 17:31:39 christos Exp $"); #endif /* LIBC_SCCS and not lint */ #include "namespace.h" @@ -69,9 +69,11 @@ sl_init(void) sl->sl_cur = 0; sl->sl_max = _SL_CHUNKSIZE; sl->sl_str = NULL; - errno = reallocarr(&sl->sl_str, sl->sl_max, sizeof(char *)); + errno = reallocarr(&sl->sl_str, sl->sl_max, sizeof(*sl->sl_str)); if (errno) { + int serrno = errno; free(sl); + errno = serrno; sl = NULL; } return sl; @@ -91,7 +93,7 @@ sl_add(StringList *sl, char *name) char **new = sl->sl_str; errno = reallocarr(&new, (sl->sl_max + _SL_CHUNKSIZE), - sizeof(char *)); + sizeof(*new)); if (errno) return -1; sl->sl_max += _SL_CHUNKSIZE; Index: src/lib/libc/net/getprotoent_r.c diff -u src/lib/libc/net/getprotoent_r.c:1.7 src/lib/libc/net/getprotoent_r.c:1.8 --- src/lib/libc/net/getprotoent_r.c:1.7 Sat Mar 12 03:41:38 2022 +++ src/lib/libc/net/getprotoent_r.c Sat Mar 12 12:31:39 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: getprotoent_r.c,v 1.7 2022/03/12 08:41:38 nia Exp $ */ +/* $NetBSD: getprotoent_r.c,v 1.8 2022/03/12 17:31:39 christos Exp $ */ /* * Copyright (c) 1983, 1993 @@ -34,7 +34,7 @@ #if 0 static char sccsid[] = "@(#)getprotoent.c 8.1 (Berkeley) 6/4/93"; #else -__RCSID("$NetBSD: getprotoent_r.c,v 1.7 2022/03/12 08:41:38 nia Exp $"); +__RCSID("$NetBSD: getprotoent_r.c,v 1.8 2022/03/12 17:31:39 christos Exp $"); #endif #endif /* LIBC_SCCS and not lint */ @@ -87,6 +87,7 @@ getprotoent_r(struct protoent *pr, struc { char *p, *cp, **q; size_t i = 0; + int serrno; if (pd->fp == NULL && (pd->fp = fopen(_PATH_PROTOCOLS, "re")) == NULL) return NULL; @@ -112,12 +113,10 @@ getprotoent_r(struct protoent *pr, struc if (pd->aliases == NULL) { pd->aliases = NULL; pd->maxaliases = 10; - if (reallocarr(&pd->aliases, - pd->maxaliases, sizeof(char *)) != 0) { - endprotoent_r(pd); - errno = ENOMEM; - return NULL; - } + errno = reallocarr(&pd->aliases, + pd->maxaliases, sizeof(*pd->aliases)); + if (errno) + goto bad; } q = pr->p_aliases = pd->aliases; if (p != NULL) { @@ -129,12 +128,10 @@ getprotoent_r(struct protoent *pr, struc } if (i == pd->maxaliases - 2) { pd->maxaliases *= 2; - if (reallocarr(&q, - pd->maxaliases, sizeof(char *)) != 0) { - endprotoent_r(pd); - errno = ENOMEM; - return NULL; - } + errno = reallocarr(&q, + pd->maxaliases, sizeof(*q)); + if (errno) + goto bad; pr->p_aliases = pd->aliases = q; } q[i++] = cp; @@ -147,4 +144,9 @@ getprotoent_r(struct protoent *pr, struc q[i] = NULL; return pr; } +bad: + serrno = errno; + endprotoent_r(pd); + errno = serrno; + return NULL; } Index: src/lib/libc/net/getservent_r.c diff -u src/lib/libc/net/getservent_r.c:1.12 src/lib/libc/net/getservent_r.c:1.13 --- src/lib/libc/net/getservent_r.c:1.12 Sat Mar 12 03:43:11 2022 +++ src/lib/libc/net/getservent_r.c Sat Mar 12 12:31:39 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: getservent_r.c,v 1.12 2022/03/12 08:43:11 nia Exp $ */ +/* $NetBSD: getservent_r.c,v 1.13 2022/03/12 17:31:39 christos Exp $ */ /* * Copyright (c) 1983, 1993 @@ -34,7 +34,7 @@ #if 0 static char sccsid[] = "@(#)getservent.c 8.1 (Berkeley) 6/4/93"; #else -__RCSID("$NetBSD: getservent_r.c,v 1.12 2022/03/12 08:43:11 nia Exp $"); +__RCSID("$NetBSD: getservent_r.c,v 1.13 2022/03/12 17:31:39 christos Exp $"); #endif #endif /* LIBC_SCCS and not lint */ @@ -292,11 +292,10 @@ _servent_parsedb(struct servent_data *sd if (sd->aliases == NULL) { sd->maxaliases = 10; sd->aliases = NULL; - if (reallocarr(&sd->aliases, - sd->maxaliases, sizeof(char *)) != 0) { - errno = ENOMEM; + errno = reallocarr(&sd->aliases, + sd->maxaliases, sizeof(*sd->aliases)); + if (errno) goto fail; - } } sp->s_aliases = sd->aliases; i = 0; @@ -306,10 +305,9 @@ _servent_parsedb(struct servent_data *sd if (i == sd->maxaliases - 2) { sd->maxaliases *= 2; q = sd->aliases; - if (reallocarr(&q, sd->maxaliases, sizeof(*q)) != 0) { - errno = ENOMEM; + errno = reallocarr(&q, sd->maxaliases, sizeof(*q)); + if (errno) goto fail; - } sp->s_aliases = sd->aliases = q; } sp->s_aliases[i++] = __UNCONST(data + 1); Index: src/lib/libc/stdio/vfwprintf.c diff -u src/lib/libc/stdio/vfwprintf.c:1.37 src/lib/libc/stdio/vfwprintf.c:1.38 --- src/lib/libc/stdio/vfwprintf.c:1.37 Sat Mar 12 03:36:52 2022 +++ src/lib/libc/stdio/vfwprintf.c Sat Mar 12 12:31:39 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: vfwprintf.c,v 1.37 2022/03/12 08:36:52 nia Exp $ */ +/* $NetBSD: vfwprintf.c,v 1.38 2022/03/12 17:31:39 christos Exp $ */ /*- * Copyright (c) 1990, 1993 @@ -38,7 +38,7 @@ static char sccsid[] = "@(#)vfprintf.c 8.1 (Berkeley) 6/4/93"; __FBSDID("$FreeBSD: src/lib/libc/stdio/vfwprintf.c,v 1.27 2007/01/09 00:28:08 imp Exp $"); #else -__RCSID("$NetBSD: vfwprintf.c,v 1.37 2022/03/12 08:36:52 nia Exp $"); +__RCSID("$NetBSD: vfwprintf.c,v 1.38 2022/03/12 17:31:39 christos Exp $"); #endif #endif /* LIBC_SCCS and not lint */ @@ -460,10 +460,9 @@ __mbsconv(char *mbsarg, int prec, locale * wide characters for printing. */ convbuf = NULL; - if (reallocarr(&convbuf, insize + 1, sizeof(*convbuf)) != 0) { - errno = ENOMEM; + errno = reallocarr(&convbuf, insize + 1, sizeof(*convbuf)); + if (errno) return NULL; - } wcp = convbuf; p = mbsarg; mbs = initial; @@ -477,7 +476,9 @@ __mbsconv(char *mbsarg, int prec, locale insize -= nconv; } if (nconv == (size_t)-1 || nconv == (size_t)-2) { + int serrno = errno; free(convbuf); + errno = serrno; return NULL; } *wcp = L'\0'; @@ -1979,16 +1980,17 @@ __grow_type_table (size_t nextarg, enum newsize = nextarg + 1; if (oldsize == STATIC_ARG_TBL_SIZE) { newtable = NULL; - if (reallocarr(&newtable, newsize, sizeof(*newtable)) != 0) { - errno = ENOMEM; + errno = reallocarr(&newtable, newsize, sizeof(*newtable)); + if (errno) return -1; - } memcpy(newtable, oldtable, oldsize * sizeof(*newtable)); } else { newtable = oldtable; - if (reallocarr(&newtable, newsize, sizeof(*newtable)) != 0) { - errno = ENOMEM; + errno = reallocarr(&newtable, newsize, sizeof(*newtable)); + if (errno) { + int serrno = errno; free(oldtable); + errno = serrno; return -1; } } Index: src/lib/libc/stdlib/_env.c diff -u src/lib/libc/stdlib/_env.c:1.12 src/lib/libc/stdlib/_env.c:1.13 --- src/lib/libc/stdlib/_env.c:1.12 Sat Mar 12 03:44:38 2022 +++ src/lib/libc/stdlib/_env.c Sat Mar 12 12:31:39 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: _env.c,v 1.12 2022/03/12 08:44:38 nia Exp $ */ +/* $NetBSD: _env.c,v 1.13 2022/03/12 17:31:39 christos Exp $ */ /*- * Copyright (c) 2010 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include <sys/cdefs.h> #if defined(LIBC_SCCS) && !defined(lint) -__RCSID("$NetBSD: _env.c,v 1.12 2022/03/12 08:44:38 nia Exp $"); +__RCSID("$NetBSD: _env.c,v 1.13 2022/03/12 17:31:39 christos Exp $"); #endif /* LIBC_SCCS and not lint */ #include "namespace.h" @@ -297,22 +297,20 @@ __getenvslot(const char *name, size_t l_ /* Allocate a new environment array. */ if (environ == allocated_environ) { new_environ = environ; - if (reallocarr(&new_environ, - new_size, sizeof(*new_environ)) != 0) { - errno = ENOMEM; + errno = reallocarr(&new_environ, + new_size, sizeof(*new_environ)); + if (errno) return -1; - } } else { free(allocated_environ); allocated_environ = NULL; allocated_environ_size = 0; new_environ = NULL; - if (reallocarr(&new_environ, - new_size, sizeof(*new_environ)) != 0) { - errno = ENOMEM; + errno = reallocarr(&new_environ, + new_size, sizeof(*new_environ)); + if (errno) return -1; - } (void)memcpy(new_environ, environ, num_entries * sizeof(*new_environ)); } Index: src/lib/libc/stdlib/hcreate.c diff -u src/lib/libc/stdlib/hcreate.c:1.11 src/lib/libc/stdlib/hcreate.c:1.12 --- src/lib/libc/stdlib/hcreate.c:1.11 Sat Mar 12 03:26:01 2022 +++ src/lib/libc/stdlib/hcreate.c Sat Mar 12 12:31:39 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: hcreate.c,v 1.11 2022/03/12 08:26:01 nia Exp $ */ +/* $NetBSD: hcreate.c,v 1.12 2022/03/12 17:31:39 christos Exp $ */ /* * Copyright (c) 2001 Christopher G. Demetriou @@ -43,7 +43,7 @@ #include <sys/cdefs.h> #if defined(LIBC_SCCS) && !defined(lint) -__RCSID("$NetBSD: hcreate.c,v 1.11 2022/03/12 08:26:01 nia Exp $"); +__RCSID("$NetBSD: hcreate.c,v 1.12 2022/03/12 17:31:39 christos Exp $"); #endif /* LIBC_SCCS and not lint */ #if !defined(lint) @@ -104,7 +104,6 @@ hcreate_r(size_t nel, struct hsearch_dat struct internal_head *table; size_t idx; unsigned int p2; - void *p; /* If nel is too small, make it min sized. */ if (nel < MIN_BUCKETS) @@ -125,13 +124,10 @@ hcreate_r(size_t nel, struct hsearch_dat /* Allocate the table. */ head->size = nel; head->filled = 0; - p = NULL; - if (reallocarr(&p, nel, sizeof(table[0])) != 0) { - errno = ENOMEM; + errno = reallocarr(&table, nel, sizeof(*table)); + if (errno) return 0; - } - head->table = p; - table = p; + head->table = (void *)table; /* Initialize it. */ for (idx = 0; idx < nel; idx++) Index: src/lib/libc/stdlib/radixsort.c diff -u src/lib/libc/stdlib/radixsort.c:1.21 src/lib/libc/stdlib/radixsort.c:1.22 --- src/lib/libc/stdlib/radixsort.c:1.21 Fri Oct 29 07:03:46 2021 +++ src/lib/libc/stdlib/radixsort.c Sat Mar 12 12:31:39 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: radixsort.c,v 1.21 2021/10/29 11:03:46 nia Exp $ */ +/* $NetBSD: radixsort.c,v 1.22 2022/03/12 17:31:39 christos Exp $ */ /*- * Copyright (c) 1990, 1993 @@ -37,7 +37,7 @@ #if 0 static char sccsid[] = "@(#)radixsort.c 8.2 (Berkeley) 4/28/95"; #else -__RCSID("$NetBSD: radixsort.c,v 1.21 2021/10/29 11:03:46 nia Exp $"); +__RCSID("$NetBSD: radixsort.c,v 1.22 2022/03/12 17:31:39 christos Exp $"); #endif #endif /* LIBC_SCCS and not lint */ @@ -130,10 +130,9 @@ sradixsort(const u_char **a, int n, cons simplesort(a, n, 0, tr, endch); else { ta = NULL; - if (reallocarr(&ta, n, sizeof(a)) != 0) { - errno = ENOMEM; - return (-1); - } + errno = reallocarr(&ta, n, sizeof(*ta)); + if (errno) + return -1; r_sort_b(a, ta, n, 0, tr, endch); free(ta); } Index: src/lib/libc/string/wcsdup.c diff -u src/lib/libc/string/wcsdup.c:1.5 src/lib/libc/string/wcsdup.c:1.6 --- src/lib/libc/string/wcsdup.c:1.5 Fri Oct 29 07:03:46 2021 +++ src/lib/libc/string/wcsdup.c Sat Mar 12 12:31:40 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: wcsdup.c,v 1.5 2021/10/29 11:03:46 nia Exp $ */ +/* $NetBSD: wcsdup.c,v 1.6 2022/03/12 17:31:40 christos Exp $ */ /* * Copyright (C) 2006 Aleksey Cheusov @@ -14,7 +14,7 @@ #include <sys/cdefs.h> #if defined(LIBC_SCCS) && !defined(lint) -__RCSID("$NetBSD: wcsdup.c,v 1.5 2021/10/29 11:03:46 nia Exp $"); +__RCSID("$NetBSD: wcsdup.c,v 1.6 2022/03/12 17:31:40 christos Exp $"); #endif /* LIBC_SCCS and not lint */ #include "namespace.h" @@ -36,10 +36,9 @@ wcsdup(const wchar_t *str) len = wcslen(str) + 1; copy = NULL; - if (reallocarr(©, len, sizeof(wchar_t)) != 0) { - errno = ENOMEM; + errno = reallocarr(©, len, sizeof(*copy)); + if (errno) return NULL; - } return wmemcpy(copy, str, len); }