From 1eeff53d7d2f5cdd135613d774bc09ee4ee8e8dd Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Fri, 3 May 2013 14:26:56 +0100 Subject: [PATCH] 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 --- src/util/virfile.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) 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) { -- 2.47.2