From 9ae7b7d1beb4d2ced96e4be3c90d6f3d863151dd Mon Sep 17 00:00:00 2001 From: Milan Broz Date: Wed, 19 Dec 2012 13:19:05 +0100 Subject: [PATCH] Fix regression in header backup (1.5.1). Access to backup file must handle write to regular files too. --- lib/luks1/keymanage.c | 2 +- lib/utils.c | 5 ++++- tests/compat-test | 4 +++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/luks1/keymanage.c b/lib/luks1/keymanage.c index 72d3f88..f369303 100644 --- a/lib/luks1/keymanage.c +++ b/lib/luks1/keymanage.c @@ -283,7 +283,7 @@ int LUKS_hdr_restore( log_dbg("Storing backup of header (%u bytes) and keyslot area (%u bytes) to device %s.", sizeof(*hdr), buffer_size - LUKS_ALIGN_KEYSLOTS, device_path(device)); - devfd = open(device_path(device), O_WRONLY | O_DIRECT | O_SYNC); + devfd = open(device_path(device), O_RDWR | O_DIRECT | O_SYNC); if (devfd == -1) { if (errno == EACCES) log_err(ctx, _("Cannot write to device %s, permission denied.\n"), diff --git a/lib/utils.c b/lib/utils.c index eef7891..67032f2 100644 --- a/lib/utils.c +++ b/lib/utils.c @@ -97,9 +97,12 @@ ssize_t write_blockwise(int fd, int bsize, void *orig_buf, size_t count) goto out; r = read(fd, hangover_buf, bsize); - if (r < 0 || r != bsize) + if (r < 0 || r < hangover) goto out; + if (r < bsize) + bsize = r; + r = lseek(fd, -bsize, SEEK_CUR); if (r < 0) goto out; diff --git a/tests/compat-test b/tests/compat-test index c1003d6..f02fbc6 100755 --- a/tests/compat-test +++ b/tests/compat-test @@ -149,10 +149,12 @@ ORG_SHA1=$(sha1sum -b /dev/mapper/$DEV_NAME | cut -f 1 -d' ') $CRYPTSETUP -q luksClose $DEV_NAME || fail # Check it can be opened from header backup as well -$CRYPTSETUP luksHeaderBackup $IMG --header-backup-file $HEADER_IMG +$CRYPTSETUP luksHeaderBackup $IMG --header-backup-file $HEADER_IMG || fail echo "compatkey" | $CRYPTSETUP luksOpen $IMG10 $DEV_NAME --header $HEADER_IMG || fail check_exists $CRYPTSETUP -q luksClose $DEV_NAME || fail +# Check restore +$CRYPTSETUP luksHeaderRestore -q $IMG --header-backup-file $HEADER_IMG || fail # Repeat for V1.0 header - not aligned first keyslot echo "compatkey" | $CRYPTSETUP luksOpen $IMG10 $DEV_NAME || fail -- 2.7.4