From: Peter Krempa Date: Wed, 31 Oct 2012 10:17:41 +0000 (+0100) Subject: util: Improve error reporting from absolutePathFromBaseFile helper X-Git-Tag: v1.0.0~17 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ca043b8c061cee39aada6b6ae6e9ce28f94c02b5;p=thirdparty%2Flibvirt.git util: Improve error reporting from absolutePathFromBaseFile helper There are multiple reasons canonicalize_file_name() used in absolutePathFromBaseFile helper can fail. This patch enhances error reporting from that helper. --- diff --git a/src/util/storage_file.c b/src/util/storage_file.c index e0b41781b0..a0399abd00 100644 --- a/src/util/storage_file.c +++ b/src/util/storage_file.c @@ -530,22 +530,36 @@ qedGetBackingStore(char **res, static char * absolutePathFromBaseFile(const char *base_file, const char *path) { - char *res; - char *tmp; - size_t d_len = dir_len (base_file); + char *res = NULL; + char *tmp = NULL; + size_t d_len = dir_len(base_file); /* If path is already absolute, or if dirname(base_file) is ".", just return a copy of path. */ - if (*path == '/' || d_len == 0) - return canonicalize_file_name(path); + if (*path == '/' || d_len == 0) { + if (!(res = canonicalize_file_name(path))) + virReportSystemError(errno, + _("Can't canonicalize path '%s'"), path); + + goto cleanup; + } /* Ensure that the following cast-to-int is valid. */ - if (d_len > INT_MAX) - return NULL; + if (d_len > INT_MAX) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Directory name too long: '%s'"), base_file); + goto cleanup; + } - if (virAsprintf(&tmp, "%.*s/%s", (int) d_len, base_file, path) < 0) - return NULL; - res = canonicalize_file_name(tmp); + if (virAsprintf(&tmp, "%.*s/%s", (int) d_len, base_file, path) < 0) { + virReportOOMError(); + goto cleanup; + } + + if (!(res = canonicalize_file_name(tmp))) + virReportSystemError(errno, _("Can't canonicalize path '%s'"), path); + +cleanup: VIR_FREE(tmp); return res; } @@ -713,7 +727,6 @@ virStorageFileGetMetadataFromBuf(int format, meta->backingStoreRaw = meta->backingStore; meta->backingStore = absolutePathFromBaseFile(path, backing); if (meta->backingStore == NULL) { - virReportOOMError(); VIR_FREE(backing); return -1; }