[libvirt] [PATCH] Fix off-by-1 in virFileAbsPath.

The virFileAbsPath was not taking into account the '/' directory separator when allocating memory for combining cwd + path. Convert to use virAsprintf to avoid this type of bug completely. * src/util/util.c: Convert virFileAbsPath to use virAsprintf --- src/util/util.c | 19 ++++++------------- 1 files changed, 6 insertions(+), 13 deletions(-) diff --git a/src/util/util.c b/src/util/util.c index 965e96d..452f592 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -1990,30 +1990,23 @@ cleanup: int virFileAbsPath(const char *path, char **abspath) { char *buf; - int cwdlen; if (path[0] == '/') { - buf = strdup(path); - if (buf == NULL) - return(-1); + if (!(*abspath = strdup(path))) + return -1; } else { buf = getcwd(NULL, 0); if (buf == NULL) - return(-1); + return -1; - cwdlen = strlen(buf); - /* cwdlen includes the null terminator */ - if (VIR_REALLOC_N(buf, cwdlen + strlen(path) + 1) < 0) { + if (virAsprintf(abspath, "%s/%s", buf, path) < 0) { VIR_FREE(buf); errno = ENOMEM; - return(-1); + return -1; } - - buf[cwdlen] = '/'; - strcpy(&buf[cwdlen + 1], path); + VIR_FREE(buf); } - *abspath = buf; return 0; } -- 1.7.4

One small change you could make if you haven't already pushed: On 02/22/2011 12:12 PM, Daniel P. Berrange wrote:
The virFileAbsPath was not taking into account the '/' directory separator when allocating memory for combining cwd + path. Convert to use virAsprintf to avoid this type of bug completely.
* src/util/util.c: Convert virFileAbsPath to use virAsprintf --- src/util/util.c | 19 ++++++------------- 1 files changed, 6 insertions(+), 13 deletions(-) [...] - cwdlen = strlen(buf); - /* cwdlen includes the null terminator */ - if (VIR_REALLOC_N(buf, cwdlen + strlen(path) + 1)< 0) { + if (virAsprintf(abspath, "%s/%s", buf, path)< 0) { VIR_FREE(buf); errno = ENOMEM;
VIR_FREE now preserves errno, so the "errno = ENOMEM" line is no longer necessary.
participants (2)
-
Daniel P. Berrange
-
Laine Stump