From 9f5bbe3b926b52c6490346fd3c026546caadaefd Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Tue, 22 Feb 2011 17:08:12 +0000 Subject: [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 | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/src/util/util.c b/src/util/util.c index 965e96def8..ee08d47400 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -1990,30 +1990,22 @@ 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; }