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    |    9 +++------
 src/lxc/confile.c |    5 +----
 src/lxc/parse.c   |   17 ++++++++++-------
 src/lxc/parse.h   |    2 +-
 4 files changed, 15 insertions(+), 18 deletions(-)

Index: lxc/src/lxc/conf.c
===================================================================
--- lxc.orig/src/lxc/conf.c
+++ lxc/src/lxc/conf.c
@@ -146,7 +146,6 @@ static int configure_find_fstype_cb(char
 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 c
 
 		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(ch
 
 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
 	}
 
 	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: lxc/src/lxc/confile.c
===================================================================
--- lxc.orig/src/lxc/confile.c
+++ lxc/src/lxc/confile.c
@@ -666,10 +666,7 @@ int lxc_config_readline(char *buffer, st
 
 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: lxc/src/lxc/parse.c
===================================================================
--- lxc.orig/src/lxc/parse.c
+++ lxc/src/lxc/parse.c
@@ -64,11 +64,12 @@ int lxc_dir_for_each(const char *name, c
 	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 *f
 		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: lxc/src/lxc/parse.h
===================================================================
--- lxc.orig/src/lxc/parse.h
+++ lxc/src/lxc/parse.h
@@ -32,7 +32,7 @@ extern int lxc_dir_for_each(const char *
 			    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);
 



