From 5a913db9576f87ae9780d22de7d7f614e7f53dda Mon Sep 17 00:00:00 2001 From: LaMont Jones Date: Wed, 9 Apr 2008 17:58:18 -0600 Subject: mkswap: when writing the signature page, handle EINTR returns. If the signature page write bumps into EINTR, it should finish the write, instead of dying. Addresses-Ubuntu-Bug: 206113 Signed-off-by: LaMont Jones --- disk-utils/mkswap.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/disk-utils/mkswap.c b/disk-utils/mkswap.c index 4b1becaf..dbbfa389 100644 --- a/disk-utils/mkswap.c +++ b/disk-utils/mkswap.c @@ -488,6 +488,24 @@ check_mount(void) { return 1; } +static ssize_t +write_all(int fd, const void *buf, size_t count) { + const unsigned char *b = buf; + ssize_t ret = 0; + ssize_t tmp; + do { + tmp = write(fd, b + ret, count - ret); + if (tmp > 0) { + ret += tmp, b += tmp, count -= tmp; + } else if (tmp == 0) { + break; /* hit end of file... */ + } else if (errno != EINTR && errno != EAGAIN) { + return -1; + } + } while (ret < count && ret != -1); + return ret; +} + int main(int argc, char ** argv) { struct stat statbuf; @@ -730,8 +748,11 @@ the -f option to force it.\n"), offset = ((version == 0) ? 0 : 1024); if (lseek(DEV, offset, SEEK_SET) != offset) die(_("unable to rewind swap-device")); - if (write(DEV,(char*)signature_page+offset, pagesize-offset) - != pagesize-offset) + i=write_all(DEV,(char*)signature_page+offset, pagesize-offset); + if (i < 0) + fprintf(stderr, _("error writing swap signature: %s"), + strerror(errno)); + if (i != pagesize-offset) die(_("unable to write signature page")); /* -- cgit v1.2.3 From fb1cc2595e31079de36a5fa6983ca64519177162 Mon Sep 17 00:00:00 2001 From: LaMont Jones Date: Fri, 11 Apr 2008 21:01:45 -0600 Subject: changelog: release --- debian/changelog | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/debian/changelog b/debian/changelog index 43558554..2bbcf63b 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +util-linux (2.13.1-4) unstable; urgency=low + + * meta: Drop bashism in preinst. Closes: #472248 + * mkswap: when writing the signature page, handle EINTR returns. LP: #206113 + + -- LaMont Jones Fri, 11 Apr 2008 21:01:29 -0600 + util-linux (2.13.1-3) unstable; urgency=low [Kees Cook] -- cgit v1.2.3 From 563ee4e1c7339286a02daea01fcc33d0aa828c7e Mon Sep 17 00:00:00 2001 From: LaMont Jones Date: Mon, 14 Apr 2008 18:17:25 -0600 Subject: Revert "mkswap: when writing the signature page, handle EINTR returns." This reverts commit 5a913db9576f87ae9780d22de7d7f614e7f53dda. --- disk-utils/mkswap.c | 25 ++----------------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/disk-utils/mkswap.c b/disk-utils/mkswap.c index dbbfa389..4b1becaf 100644 --- a/disk-utils/mkswap.c +++ b/disk-utils/mkswap.c @@ -488,24 +488,6 @@ check_mount(void) { return 1; } -static ssize_t -write_all(int fd, const void *buf, size_t count) { - const unsigned char *b = buf; - ssize_t ret = 0; - ssize_t tmp; - do { - tmp = write(fd, b + ret, count - ret); - if (tmp > 0) { - ret += tmp, b += tmp, count -= tmp; - } else if (tmp == 0) { - break; /* hit end of file... */ - } else if (errno != EINTR && errno != EAGAIN) { - return -1; - } - } while (ret < count && ret != -1); - return ret; -} - int main(int argc, char ** argv) { struct stat statbuf; @@ -748,11 +730,8 @@ the -f option to force it.\n"), offset = ((version == 0) ? 0 : 1024); if (lseek(DEV, offset, SEEK_SET) != offset) die(_("unable to rewind swap-device")); - i=write_all(DEV,(char*)signature_page+offset, pagesize-offset); - if (i < 0) - fprintf(stderr, _("error writing swap signature: %s"), - strerror(errno)); - if (i != pagesize-offset) + if (write(DEV,(char*)signature_page+offset, pagesize-offset) + != pagesize-offset) die(_("unable to write signature page")); /* -- cgit v1.2.3 From 37e8f037e3a4135039893961f7fea393d5ddea6c Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Tue, 15 Apr 2008 00:35:05 +0200 Subject: mkswap: when writing the signature page, handle EINTR returns If the signature page write bumps into EINTR, it should finish the write, instead of dying. Addresses-Ubuntu-Bug: 206113 Signed-off-by: LaMont Jones Signed-off-by: Karel Zak --- disk-utils/mkswap.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/disk-utils/mkswap.c b/disk-utils/mkswap.c index 4b1becaf..c1907fbd 100644 --- a/disk-utils/mkswap.c +++ b/disk-utils/mkswap.c @@ -488,6 +488,22 @@ check_mount(void) { return 1; } + +static int +write_all(int fd, const void *buf, size_t count) { + while(count) { + ssize_t tmp = write(fd, buf, count); + + if (tmp > 0) { + count -= tmp; + if (count) + buf += tmp; + } else if (errno != EINTR && errno != EAGAIN) + return -1; + } + return 0; +} + int main(int argc, char ** argv) { struct stat statbuf; @@ -730,9 +746,12 @@ the -f option to force it.\n"), offset = ((version == 0) ? 0 : 1024); if (lseek(DEV, offset, SEEK_SET) != offset) die(_("unable to rewind swap-device")); - if (write(DEV,(char*)signature_page+offset, pagesize-offset) - != pagesize-offset) - die(_("unable to write signature page")); + if (write_all(DEV, (char *) signature_page + offset, + pagesize - offset) == -1) { + fprintf(stderr, _("%s: %s: unable to write signature page: %s"), + program_name, device_name, strerror(errno)); + exit(1); + } /* * A subsequent swapon() will fail if the signature -- cgit v1.2.3 From 30e500affcbe671751bfe1ec1639dbd033283b34 Mon Sep 17 00:00:00 2001 From: LaMont Jones Date: Mon, 14 Apr 2008 18:19:15 -0600 Subject: changelog: release --- debian/changelog | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/debian/changelog b/debian/changelog index 2bbcf63b..8c72f628 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +util-linux (2.13.1-5) unstable; urgency=low + + * Switch to upstream's more-correct fix for LP#206113 + * mkswap: when writing the signature page, handle EINTR returns. LP: #206113 + + -- LaMont Jones Mon, 14 Apr 2008 18:18:30 -0600 + util-linux (2.13.1-4) unstable; urgency=low * meta: Drop bashism in preinst. Closes: #472248 -- cgit v1.2.3