Hi, libgfortran has malloc and calloc wrappers, but so far the equivalent realloc wrapper has been missing. The attached patch corrects this, and converts existing realloc users. Committed r210948 to trunk as obvious after regtesting on x86_64-unknown-linux-gnu.
2014-05-26 Janne Blomqvist <j...@gcc.gnu.org> * libgfortran.h (xrealloc): New prototype. * runtime/memory.c (xrealloc): New function. * io/fbuf.c (fbuf_alloc): Use xrealloc. * io/list_read.c (push_char_default): Likewise. (push_char4): Likewise. -- Janne Blomqvist
diff --git a/libgfortran/io/fbuf.c b/libgfortran/io/fbuf.c index 170ce97..e24da62 100644 --- a/libgfortran/io/fbuf.c +++ b/libgfortran/io/fbuf.c @@ -121,10 +121,7 @@ fbuf_alloc (gfc_unit * u, int len) { /* Round up to nearest multiple of the current buffer length. */ newlen = ((u->fbuf->pos + len) / u->fbuf->len + 1) * u->fbuf->len; - dest = realloc (u->fbuf->buf, newlen); - if (dest == NULL) - return NULL; - u->fbuf->buf = dest; + u->fbuf->buf = xrealloc (u->fbuf->buf, newlen); u->fbuf->len = newlen; } diff --git a/libgfortran/io/list_read.c b/libgfortran/io/list_read.c index 13e38f4..a7e4f88 100644 --- a/libgfortran/io/list_read.c +++ b/libgfortran/io/list_read.c @@ -79,7 +79,7 @@ typedef unsigned char uchar; static void push_char_default (st_parameter_dt *dtp, int c) { - char *new; + if (dtp->u.p.saved_string == NULL) { @@ -92,13 +92,11 @@ push_char_default (st_parameter_dt *dtp, int c) if (dtp->u.p.saved_used >= dtp->u.p.saved_length) { dtp->u.p.saved_length = 2 * dtp->u.p.saved_length; - new = realloc (dtp->u.p.saved_string, dtp->u.p.saved_length); - if (new == NULL) - generate_error (&dtp->common, LIBERROR_OS, NULL); - dtp->u.p.saved_string = new; + dtp->u.p.saved_string = + xrealloc (dtp->u.p.saved_string, dtp->u.p.saved_length); // Also this should not be necessary. - memset (new + dtp->u.p.saved_used, 0, + memset (dtp->u.p.saved_string + dtp->u.p.saved_used, 0, dtp->u.p.saved_length - dtp->u.p.saved_used); } @@ -126,10 +124,7 @@ push_char4 (st_parameter_dt *dtp, int c) if (dtp->u.p.saved_used >= dtp->u.p.saved_length) { dtp->u.p.saved_length = 2 * dtp->u.p.saved_length; - new = realloc (p, dtp->u.p.saved_length * sizeof (gfc_char4_t)); - if (new == NULL) - generate_error (&dtp->common, LIBERROR_OS, NULL); - p = new; + p = xrealloc (p, dtp->u.p.saved_length * sizeof (gfc_char4_t)); memset4 (new + dtp->u.p.saved_used, 0, dtp->u.p.saved_length - dtp->u.p.saved_used); diff --git a/libgfortran/libgfortran.h b/libgfortran/libgfortran.h index ba6c1e9..b3e8a2e 100644 --- a/libgfortran/libgfortran.h +++ b/libgfortran/libgfortran.h @@ -771,6 +771,8 @@ internal_proto(xmalloc); extern void *xcalloc (size_t, size_t) __attribute__ ((malloc)); internal_proto(xcalloc); +extern void *xrealloc (void *, size_t); +internal_proto(xrealloc); /* environ.c */ diff --git a/libgfortran/runtime/memory.c b/libgfortran/runtime/memory.c index efeea86..b18b505 100644 --- a/libgfortran/runtime/memory.c +++ b/libgfortran/runtime/memory.c @@ -58,3 +58,17 @@ xcalloc (size_t nmemb, size_t size) return p; } + + +void * +xrealloc (void *ptr, size_t size) +{ + if (size == 0) + size = 1; + + void *newp = realloc (ptr, size); + if (!newp) + os_error ("Memory allocation failure in xrealloc"); + + return newp; +}