From: Arnaud Giersch Date: Mon, 4 Feb 2013 14:54:29 +0000 (+0100) Subject: Rewrite xbt_getline. X-Git-Tag: v3_9_90~510^2~52 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/422c6b5a12ddeca39e50a0c9ec674cec1b104c0a Rewrite xbt_getline. * fix a buffer overflow * correctly return -1 when nothing can be read --- 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; } /*