From 2382ecffdbea7fd12349d68e65cc673797d5f34c Mon Sep 17 00:00:00 2001 From: Clement Calmels Date: Mon, 18 Jan 2010 23:08:12 +0100 Subject: [PATCH] use getline instead of fgets 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 Signed-off-by: Daniel Lezcano --- src/lxc/conf.c | 9 +++------ src/lxc/confile.c | 5 +---- src/lxc/parse.c | 17 ++++++++++------- src/lxc/parse.h | 2 +- 4 files changed, 15 insertions(+), 18 deletions(-) diff --git a/src/lxc/conf.c b/src/lxc/conf.c index d3a1065e1..7fc8c1e34 100644 --- a/src/lxc/conf.c +++ b/src/lxc/conf.c @@ -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; diff --git a/src/lxc/confile.c b/src/lxc/confile.c index 557845cc5..0e3ce54ea 100644 --- a/src/lxc/confile.c +++ b/src/lxc/confile.c @@ -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) diff --git a/src/lxc/parse.c b/src/lxc/parse.c index 78dbd6d42..0ae21e0ed 100644 --- a/src/lxc/parse.c +++ b/src/lxc/parse.c @@ -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; } diff --git a/src/lxc/parse.h b/src/lxc/parse.h index 94b886ebd..76d416b69 100644 --- a/src/lxc/parse.h +++ b/src/lxc/parse.h @@ -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);