On Tue, Jun 20, 2006 at 06:46:07PM +0200, Bastian Kleineidam wrote: > When I run xfs_growfs as a normal user, the program crashes. > /dev/hda1 is my root XFS partition, the uid and gid is 1000. > ... > (gdb) run -n /dev/hda1 > Starting program: /usr/sbin/xfs_growfs -n /dev/hda1 > *** glibc detected *** double free or corruption (fasttop): 0x080919f0 *** > ... > So error=13 is EACCES - which is undertandable since I am not root > here. The mistake now is that _both_ fs_table_insert() and > fs_table_initialise_mounts() of libxcmd/paths.c of xfsprogs call free() > on the dir variable.
Ayup, busted. Good catch. Can you try the patch below to see if it fixes the problem? thanks. -- Nathan --- a/xfsprogs/libxcmd/paths.c 2006-06-21 11:30:50.000000000 +1000 +++ b/xfsprogs/libxcmd/paths.c 2006-06-21 10:46:09.620437791 +1000 @@ -105,15 +105,15 @@ fs_table_insert( datadev = logdev = rtdev = 0; if (!fs_device_number(dir, &datadev, 0)) - goto error; + return errno; if (fslog && (fslog = fs_device_number(fslog, &logdev, 1)) == NULL) - goto error; + return errno; if (fsrt && (fsrt = fs_device_number(fsrt, &rtdev, 1)) == NULL) - goto error; + return errno; fs_table = realloc(fs_table, sizeof(fs_path_t) * (fs_count + 1)); if (!fs_table) - goto error; + return errno; fs_path = &fs_table[fs_count]; fs_path->fs_dir = dir; @@ -127,13 +127,6 @@ fs_table_insert( fs_path->fs_rtdev = rtdev; fs_count++; return 0; - - error: - if (dir) free(dir); - if (fsrt) free(fsrt); - if (fslog) free(fslog); - if (fsname) free(fsname); - return errno; } void @@ -191,8 +184,11 @@ fs_table_initialise_mounts( { struct mntent *mnt; FILE *mtp; - char *dir = NULL, *fsname = NULL, *fslog, *fsrt; - int error = 0, found = 0; + char *dir, *fsname, *fslog, *fsrt; + int error, found; + + error = found = 0; + dir = fsname = fslog = fsrt = NULL; if (!mtab_file) { mtab_file = PROC_MOUNTS; @@ -226,8 +222,10 @@ fs_table_initialise_mounts( if (!error && path && !found) error = ENXIO; if (error) { - free(dir); - free(fsname); + if (dir) free(dir); + if (fsrt) free(fsrt); + if (fslog) free(fslog); + if (fsname) free(fsname); } return error; } @@ -240,8 +238,11 @@ fs_table_initialise_mounts( char *path) { struct statfs *stats; - char *dir = NULL, *fsname = NULL, *fslog = NULL, *fsrt = NULL; - int i, count, found = 0, error = 0; + char *dir, *fsname, *fslog, *fsrt; + int i, count, error, found; + + error = found = 0; + dir = fsname = fslog = fsrt = NULL; if ((count = getmntinfo(&stats, 0)) < 0) { perror("getmntinfo"); @@ -270,8 +271,10 @@ fs_table_initialise_mounts( if (!error && path && !found) error = ENXIO; if (error) { - free(dir); - free(fsname); + if (dir) free(dir); + if (fsrt) free(fsrt); + if (fslog) free(fslog); + if (fsname) free(fsname); } return error; } @@ -339,8 +342,8 @@ fs_table_initialise_projects( if (!error && project && !found) error = ENOENT; if (error) { - free(dir); - free(fsname); + if (dir) free(dir); + if (fsname) free(fsname); } return error; } -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]