From: Alex Elder Date: Wed, 28 Sep 2011 10:57:08 +0000 (+0000) Subject: xfsprogs: libxcmd: don't clobber fs_table on realloc() X-Git-Tag: v3.1.6~21 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8e96bcac0bf561e78b3d226a6287e84194d0802b;p=thirdparty%2Fxfsprogs-dev.git xfsprogs: libxcmd: don't clobber fs_table on realloc() In fs_table_insert(), realloc() is called to resize the global fs_table. If it fails, it overwrites a previously valid fs_table pointer with NULL. Instead, assign the return value to a local temporary and overwrite fs_table only if the realloc() call succeeds. The only defined errno value for a realloc() failure is ENOMEM, so return that explicitly in the event it fails. Signed-off-by: Alex Elder Reviewed-by: Christoph Hellwig --- diff --git a/libxcmd/paths.c b/libxcmd/paths.c index 1dbe0be80..0e02eb710 100644 --- a/libxcmd/paths.c +++ b/libxcmd/paths.c @@ -102,6 +102,7 @@ fs_table_insert( char *fsrt) { dev_t datadev, logdev, rtdev; + struct fs_path *tmp_fs_table; if (!dir || !fsname) return EINVAL; @@ -114,9 +115,10 @@ fs_table_insert( if (fsrt && (fsrt = fs_device_number(fsrt, &rtdev, 1)) == NULL) return errno; - fs_table = realloc(fs_table, sizeof(fs_path_t) * (fs_count + 1)); - if (!fs_table) - return errno; + tmp_fs_table = realloc(fs_table, sizeof(fs_path_t) * (fs_count + 1)); + if (!tmp_fs_table) + return ENOMEM; + fs_table = tmp_fs_table; fs_path = &fs_table[fs_count]; fs_path->fs_dir = dir;