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; +}