]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
use getline instead of fgets
authorClement Calmels <clement.calmels@fr.ibm.com>
Mon, 18 Jan 2010 22:08:12 +0000 (23:08 +0100)
committerDaniel Lezcano <dlezcano@fr.ibm.com>
Mon, 18 Jan 2010 22:08:12 +0000 (23:08 +0100)
The getline function allocate the needed memory. Fix buffer can lead
to 'hard to find' bug. I don't test the pivot_root part but the other
parts are ok.

Signed-off-by: Clement Calmels <clement.calmels@fr.ibm.com>
Signed-off-by: Daniel Lezcano <dlezcano@fr.ibm.com>
src/lxc/conf.c
src/lxc/confile.c
src/lxc/parse.c
src/lxc/parse.h

index d3a1065e1c548f506e21ba1706250aed66c3f3af..7fc8c1e34497faf88e6c18301c1ed2b68692f60c 100644 (file)
@@ -146,7 +146,6 @@ static int configure_find_fstype_cb(char* buffer, void *data)
 static int configure_find_fstype(const char *rootfs, char *fstype, int mntopt)
 {
        int i, found;
-       char buffer[MAXPATHLEN];
 
        struct cbarg {
                const char *rootfs;
@@ -182,7 +181,7 @@ static int configure_find_fstype(const char *rootfs, char *fstype, int mntopt)
 
                found = lxc_file_for_each_line(fsfile[i],
                                               configure_find_fstype_cb,
-                                              buffer, sizeof(buffer), &cbarg);
+                                              &cbarg);
 
                if (found < 0) {
                        SYSERROR("failed to read '%s'", fsfile[i]);
@@ -396,7 +395,7 @@ static int setup_rootfs_pivot_root_cb(char *buffer, void *data)
 
 static int setup_rootfs_pivot_root(const char *rootfs, const char *pivotdir)
 {
-       char path[MAXPATHLEN], buffer[MAXPATHLEN];
+       char path[MAXPATHLEN];
        void *cbparm[2];
        struct lxc_list mountlist, *iterator;
        int ok, still_mounted, last_still_mounted;
@@ -458,9 +457,7 @@ static int setup_rootfs_pivot_root(const char *rootfs, const char *pivotdir)
        }
 
        snprintf(path, sizeof(path), "/%s/proc/mounts", pivotdir);
-       ok = lxc_file_for_each_line(path,
-                              setup_rootfs_pivot_root_cb,
-                              buffer, sizeof(buffer), &cbparm);
+       ok = lxc_file_for_each_line(path, setup_rootfs_pivot_root_cb, &cbparm);
        if (ok < 0) {
                SYSERROR("failed to read or parse mount list '%s'", path);
                return -1;
index 557845cc512bb7e8c6771d0dc1c8a656cb49bf0a..0e3ce54ea2a964331a95d89816d88dc18eb4e76a 100644 (file)
@@ -666,10 +666,7 @@ int lxc_config_readline(char *buffer, struct lxc_conf *conf)
 
 int lxc_config_read(const char *file, struct lxc_conf *conf)
 {
-       char buffer[MAXPATHLEN];
-
-       return lxc_file_for_each_line(file, parse_line, buffer,
-                                     sizeof(buffer), conf);
+       return lxc_file_for_each_line(file, parse_line, conf);
 }
 
 int lxc_config_define_add(struct lxc_list *defines, char* arg)
index 78dbd6d42c1deba3ddb9eb2e828644baa16e5fde..0ae21e0ed8220f98e8daead69bfd05f23a6b9178 100644 (file)
@@ -64,11 +64,12 @@ int lxc_dir_for_each(const char *name, const char *directory,
        return ret;
 }
 
-int lxc_file_for_each_line(const char *file, lxc_file_cb callback,
-                          char *buffer, size_t len, void* data)
+int lxc_file_for_each_line(const char *file, lxc_file_cb callback, void *data)
 {
        FILE *f;
        int err = 0;
+       char *line = NULL;
+       size_t len = 0;
 
        f = fopen(file, "r");
        if (!f) {
@@ -76,14 +77,16 @@ int lxc_file_for_each_line(const char *file, lxc_file_cb callback,
                return -1;
        }
 
-       while (fgets(buffer, len, f)) {
-               err = callback(buffer, data);
+       while (getline(&line, &len, f) != -1) {
+               err = callback(line, data);
                if (err) {
-                       ERROR("failed to process '%s'", buffer);
-                       goto out;
+                       ERROR("failed to process '%s'", line);
+                       break;
                }
        }
-out:
+
+       if (line)
+               free(line);
        fclose(f);
        return err;
 }
index 94b886ebdf2a150b52a40b422fd310ee9476e190..76d416b69d2ff60cf59d132a17b0fedbd053c204 100644 (file)
@@ -32,7 +32,7 @@ extern int lxc_dir_for_each(const char *name, const char *directory,
                            lxc_dir_cb callback, void *data);
 
 extern int lxc_file_for_each_line(const char *file, lxc_file_cb callback,
-                                 char *buffer, size_t len, void* data);
+                                 void* data);
 
 extern int lxc_char_left_gc(char *buffer, size_t len);