---
libkmod/libkmod-util.c | 39 +++++++++++++++++++++++++--------------
1 file changed, 25 insertions(+), 14 deletions(-)
diff --git a/libkmod/libkmod-util.c b/libkmod/libkmod-util.c
index 837f417..df12433 100644
--- a/libkmod/libkmod-util.c
+++ b/libkmod/libkmod-util.c
@@ -46,8 +46,8 @@
char *getline_wrapped(FILE *fp, unsigned int *linenum)
{
int size = 256;
- int i = 0;
- char *buf = malloc(size);
+ int i = 0, n = 0;
+ _cleanup_free_ char *buf = malloc(size);
if (buf == NULL)
return NULL;
@@ -57,26 +57,33 @@ char *getline_wrapped(FILE *fp, unsigned int *linenum)
switch(ch) {
case EOF:
- if (i == 0) {
- free(buf);
+ if (i == 0)
return NULL;
- }
/* else fall through */
case '\n':
- if (linenum)
- (*linenum)++;
- if (i == size)
- buf = realloc(buf, size + 1);
- buf[i] = '\0';
- return buf;
+ n++;
+
+ {
+ char *ret;
+ if (i == size) {
+ ret = realloc(buf, size + 1);
+ if (!ret)
+ return NULL;
+ } else
+ ret = buf;
+ ret[i] = '\0';
+ buf = NULL;
+ if (linenum)
+ *linenum += n;
+ return ret;
+ }
case '\\':
ch = getc_unlocked(fp);
if (ch == '\n') {
- if (linenum)
- (*linenum)++;
+ n++;
continue;
}
/* else fall through */
@@ -85,8 +92,12 @@ char *getline_wrapped(FILE *fp, unsigned int *linenum)
buf[i++] = ch;
if (i == size) {
+ char *tmp;
size *= 2;
- buf = realloc(buf, size);
+ tmp = realloc(buf, size);
+ if (!tmp)
+ return NULL;
+ buf = tmp;
}
}
}
--
1.8.4.2
--
To unsubscribe from this list: send the line "unsubscribe linux-modules" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html