If growing the current region fails, realloc will leave errno set,
even though the function will eventually succeed.

Index: stdlib/malloc.c
===================================================================
RCS file: /cvs/src/lib/libc/stdlib/malloc.c,v
retrieving revision 1.149
diff -u -p -r1.149 malloc.c
--- stdlib/malloc.c     22 Dec 2012 07:32:17 -0000      1.149
+++ stdlib/malloc.c     7 May 2013 04:41:45 -0000
@@ -1297,6 +1297,7 @@ orealloc(void *p, size_t newsz, void *f)
                        if (!mopts.malloc_guard) {
                                void *hint = (char *)p + roldsz;
                                size_t needed = rnewsz - roldsz;
+                               int saved_errno = errno;
 
                                STATS_INC(g_pool->cheap_realloc_tries);
                                zapcacheregion(g_pool, hint, needed);
@@ -1317,6 +1318,7 @@ orealloc(void *p, size_t newsz, void *f)
                                        if (munmap(q, needed))
                                                wrterror("munmap", q);
                                }
+                               errno = saved_errno;
                        }
                } else if (rnewsz < roldsz) {
                        if (mopts.malloc_guard) {

Reply via email to