From: Daniel P. Berrange Date: Fri, 3 May 2013 13:26:56 +0000 (+0100) Subject: Fix error handling of readdir() in virFileLoopDeviceOpen X-Git-Tag: CVE-2013-1962~63 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1eeff53d7d2f5cdd135613d774bc09ee4ee8e8dd;p=thirdparty%2Flibvirt.git Fix error handling of readdir() in virFileLoopDeviceOpen To correctly handle errors from readdir() you must set 'errno' to zero before invoking it & check its value afterwards to distinguish error from EOF. Signed-off-by: Daniel P. Berrange --- diff --git a/src/util/virfile.c b/src/util/virfile.c index a59d67d5e1..52e2c2da00 100644 --- a/src/util/virfile.c +++ b/src/util/virfile.c @@ -546,6 +546,7 @@ static int virFileLoopDeviceOpen(char **dev_name) goto cleanup; } + errno = 0; while ((de = readdir(dh)) != NULL) { if (!STRPREFIX(de->d_name, "loop")) continue; @@ -577,10 +578,15 @@ static int virFileLoopDeviceOpen(char **dev_name) /* Oh well, try the next device */ VIR_FORCE_CLOSE(fd); VIR_FREE(looppath); + errno = 0; } - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("Unable to find a free loop device in /dev")); + if (errno != 0) + virReportSystemError(errno, "%s", + _("Unable to iterate over loop devices")); + else + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Unable to find a free loop device in /dev")); cleanup: if (fd != -1) {