From 422c6b5a12ddeca39e50a0c9ec674cec1b104c0a Mon Sep 17 00:00:00 2001 From: Arnaud Giersch Date: Mon, 4 Feb 2013 15:54:29 +0100 Subject: [PATCH] Rewrite xbt_getline. * fix a buffer overflow * correctly return -1 when nothing can be read --- src/xbt/xbt_str.c | 33 +++++++++++++-------------------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/src/xbt/xbt_str.c b/src/xbt/xbt_str.c index 2fad5bf71b..9247f2dd35 100644 --- a/src/xbt/xbt_str.c +++ b/src/xbt/xbt_str.c @@ -539,39 +539,32 @@ char *xbt_str_join_array(const char *const *strs, const char *sep) * In either case, on a successful call, *buf and *n will be updated to reflect * the buffer address and allocated size respectively. */ -ssize_t xbt_getline(char **buf, size_t * n, FILE * stream) +ssize_t xbt_getline(char **buf, size_t *n, FILE *stream) { - size_t i; + ssize_t i; int ch; + ch = getc(stream); + if (ferror(stream) || feof(stream)) + return -1; + if (!*buf) { - *buf = xbt_malloc(512); *n = 512; + *buf = xbt_malloc(*n); } - if (feof(stream)) - return (ssize_t) - 1; - - for (i = 0; (ch = fgetc(stream)) != EOF; i++) { - - if (i >= (*n) + 1) + i = 0; + do { + if (i == *n) *buf = xbt_realloc(*buf, *n += 512); - - (*buf)[i] = ch; - - if ((*buf)[i] == '\n') { - i++; - (*buf)[i] = '\0'; - break; - } - } + (*buf)[i++] = ch; + } while (ch != '\n' && (ch = getc(stream)) != EOF); if (i == *n) *buf = xbt_realloc(*buf, *n += 1); - (*buf)[i] = '\0'; - return (ssize_t) i; + return i; } /* -- 2.20.1