---
 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

Reply via email to