[libvirt] [PATCH] Fix safezero()

Various safezero() implementations used either -1, errno or -errno return values. This patch fixes them all to return -1 and set errno appropriately. There was also a bug in size parameter passed to safewrite() which could result in an attempt to write gigabytes out of a megabyte buffer. Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- src/storage/storage_backend.c | 4 ++-- src/util/util.c | 16 +++++++++------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c index 3742493..849f01b 100644 --- a/src/storage/storage_backend.c +++ b/src/storage/storage_backend.c @@ -316,7 +316,7 @@ static int createRawFileOpHook(int fd, void *data) { if ((r = safezero(fd, 0, hdata->vol->allocation - remain, bytes)) != 0) { ret = errno; - virReportSystemError(r, _("cannot fill file '%s'"), + virReportSystemError(errno, _("cannot fill file '%s'"), hdata->vol->target.path); goto cleanup; } @@ -327,7 +327,7 @@ static int createRawFileOpHook(int fd, void *data) { if ((r = safezero(fd, 0, 0, remain)) != 0) { ret = errno; - virReportSystemError(r, _("cannot fill file '%s'"), + virReportSystemError(errno, _("cannot fill file '%s'"), hdata->vol->target.path); goto cleanup; } diff --git a/src/util/util.c b/src/util/util.c index cf7bba5..34c585d 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -146,11 +146,11 @@ int safezero(int fd, int flags ATTRIBUTE_UNUSED, off_t offset, off_t len) */ r = ftruncate(fd, offset + len); if (r < 0) - return -errno; + return -1; buf = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, offset); if (buf == MAP_FAILED) - return -errno; + return -1; memset(buf, 0, len); munmap(buf, len); @@ -167,24 +167,26 @@ int safezero(int fd, int flags ATTRIBUTE_UNUSED, off_t offset, off_t len) unsigned long long remain, bytes; if (lseek(fd, offset, SEEK_SET) < 0) - return errno; + return -1; /* Split up the write in small chunks so as not to allocate lots of RAM */ remain = len; bytes = 1024 * 1024; r = VIR_ALLOC_N(buf, bytes); - if (r < 0) - return -ENOMEM; + if (r < 0) { + errno = ENOMEM; + return -1; + } while (remain) { if (bytes > remain) bytes = remain; - r = safewrite(fd, buf, len); + r = safewrite(fd, buf, bytes); if (r < 0) { VIR_FREE(buf); - return r; + return -1; } /* safewrite() guarantees all data will be written */ -- 1.7.0

According to Jiri Denemark on 3/2/2010 8:11 AM:
Various safezero() implementations used either -1, errno or -errno return values. This patch fixes them all to return -1 and set errno appropriately.
Correct move, to match the semantics of the HAVE_POSIX_FALLOCATE version.
There was also a bug in size parameter passed to safewrite() which could result in an attempt to write gigabytes out of a megabyte buffer.
Good catch, since len is off_t.
while (remain) { if (bytes > remain) bytes = remain;
- r = safewrite(fd, buf, len); + r = safewrite(fd, buf, bytes);
ACK. -- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org

On Tue, Mar 02, 2010 at 04:11:24PM +0100, Jiri Denemark wrote:
Various safezero() implementations used either -1, errno or -errno return values. This patch fixes them all to return -1 and set errno appropriately.
There was also a bug in size parameter passed to safewrite() which could result in an attempt to write gigabytes out of a megabyte buffer.
Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- src/storage/storage_backend.c | 4 ++-- src/util/util.c | 16 +++++++++------- 2 files changed, 11 insertions(+), 9 deletions(-)
diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c index 3742493..849f01b 100644 --- a/src/storage/storage_backend.c +++ b/src/storage/storage_backend.c @@ -316,7 +316,7 @@ static int createRawFileOpHook(int fd, void *data) { if ((r = safezero(fd, 0, hdata->vol->allocation - remain, bytes)) != 0) { ret = errno; - virReportSystemError(r, _("cannot fill file '%s'"), + virReportSystemError(errno, _("cannot fill file '%s'"), hdata->vol->target.path); goto cleanup; } @@ -327,7 +327,7 @@ static int createRawFileOpHook(int fd, void *data) {
if ((r = safezero(fd, 0, 0, remain)) != 0) { ret = errno; - virReportSystemError(r, _("cannot fill file '%s'"), + virReportSystemError(errno, _("cannot fill file '%s'"), hdata->vol->target.path); goto cleanup; } diff --git a/src/util/util.c b/src/util/util.c index cf7bba5..34c585d 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -146,11 +146,11 @@ int safezero(int fd, int flags ATTRIBUTE_UNUSED, off_t offset, off_t len) */ r = ftruncate(fd, offset + len); if (r < 0) - return -errno; + return -1;
buf = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, offset); if (buf == MAP_FAILED) - return -errno; + return -1;
memset(buf, 0, len); munmap(buf, len); @@ -167,24 +167,26 @@ int safezero(int fd, int flags ATTRIBUTE_UNUSED, off_t offset, off_t len) unsigned long long remain, bytes;
if (lseek(fd, offset, SEEK_SET) < 0) - return errno; + return -1;
/* Split up the write in small chunks so as not to allocate lots of RAM */ remain = len; bytes = 1024 * 1024;
r = VIR_ALLOC_N(buf, bytes); - if (r < 0) - return -ENOMEM; + if (r < 0) { + errno = ENOMEM; + return -1; + }
while (remain) { if (bytes > remain) bytes = remain;
- r = safewrite(fd, buf, len); + r = safewrite(fd, buf, bytes); if (r < 0) { VIR_FREE(buf); - return r; + return -1; }
/* safewrite() guarantees all data will be written */
ACK, this is bug fix from my viewpoint, so I'm fine pushing this now, Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/

Various safezero() implementations used either -1, errno or -errno return values. This patch fixes them all to return -1 and set errno appropriately.
There was also a bug in size parameter passed to safewrite() which could result in an attempt to write gigabytes out of a megabyte buffer.
ACK, this is bug fix from my viewpoint, so I'm fine pushing this now,
OK, pushed. Jirka
participants (3)
-
Daniel Veillard
-
Eric Blake
-
Jiri Denemark