mirror of
https://git.proxmox.com/git/mirror_lxc
synced 2025-07-14 21:29:05 +00:00
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 <clement.calmels@fr.ibm.com> Signed-off-by: Daniel Lezcano <dlezcano@fr.ibm.com>
This commit is contained in:
parent
8eec72f75d
commit
2382ecffdb
@ -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;
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user