diff options
author | Natanael Copa <ncopa@alpinelinux.org> | 2014-08-08 15:13:01 +0000 |
---|---|---|
committer | Natanael Copa <ncopa@alpinelinux.org> | 2014-08-08 15:14:02 +0000 |
commit | 228008df8c423bb9bbde2564033048362794bc59 (patch) | |
tree | 831c75db2f8eb96074a8d829dfd1e89f66c5a12f /main/cryptsetup | |
parent | a6ac8136ada0d5f1cbacaa55b797127ff7d07f35 (diff) | |
download | aports-228008df8c423bb9bbde2564033048362794bc59.tar.bz2 aports-228008df8c423bb9bbde2564033048362794bc59.tar.xz |
main/cryptsetup: fix issue with tmpfs and O_DIRECT
patch from upstream.
fixes #3281
Diffstat (limited to 'main/cryptsetup')
-rw-r--r-- | main/cryptsetup/APKBUILD | 24 | ||||
-rw-r--r-- | main/cryptsetup/direct-io.patch | 148 |
2 files changed, 167 insertions, 5 deletions
diff --git a/main/cryptsetup/APKBUILD b/main/cryptsetup/APKBUILD index 86bfa88769..d29c090a29 100644 --- a/main/cryptsetup/APKBUILD +++ b/main/cryptsetup/APKBUILD @@ -1,7 +1,7 @@ # Maintainer: Natanael Copa <ncopa@alpinelinux.org> pkgname=cryptsetup pkgver=1.6.5 -pkgrel=0 +pkgrel=1 pkgdesc="Userspace setup tool for transparent encryption of block devices using the Linux 2.6 cryptoapi" url="http://code.google.com/p/cryptsetup/" arch="all" @@ -9,9 +9,20 @@ license="GPL2+" depends="" makedepends="lvm2-dev openssl-dev popt-dev util-linux-dev !libiconv-dev" subpackages="$pkgname-dev $pkgname-doc $pkgname-libs" -source="https://www.kernel.org/pub/linux/utils/cryptsetup/v${pkgver%.*}/cryptsetup-$pkgver.tar.gz" +source="https://www.kernel.org/pub/linux/utils/cryptsetup/v${pkgver%.*}/cryptsetup-$pkgver.tar.gz + direct-io.patch + " _builddir="$srcdir"/$pkgname-$pkgver +prepare() { + cd "$_builddir" + for i in $source; do + case $i in + *.patch) msg $i; patch -p1 -i "$srcdir"/$i || return 1;; + esac + done +} + build() { cd "$_builddir" ./configure \ @@ -40,6 +51,9 @@ libs() { mv "$pkgdir"/lib "$subpkgdir"/ } -md5sums="847c9f1df3c20966f27470b2a62fc797 cryptsetup-1.6.5.tar.gz" -sha256sums="7bfde843a12b150aed758a528c81e64755f224f050159410c493e7d70b77d97d cryptsetup-1.6.5.tar.gz" -sha512sums="c500d7f9f72b9ae0844cd8bab81c880ad6e65ea0e03f7d35b5f4ebbdb006618ce3ed808a457c00b589d4c72c0b10f5e26d61cefb9ccebe79af92910620f5a9e8 cryptsetup-1.6.5.tar.gz" +md5sums="847c9f1df3c20966f27470b2a62fc797 cryptsetup-1.6.5.tar.gz +eff4426fdbba93daf61011ec3f9db685 direct-io.patch" +sha256sums="7bfde843a12b150aed758a528c81e64755f224f050159410c493e7d70b77d97d cryptsetup-1.6.5.tar.gz +3cd05276966ee714315be6a3bca056bf500d3c7ac1b0481b29e1c6d5bd80eb2a direct-io.patch" +sha512sums="c500d7f9f72b9ae0844cd8bab81c880ad6e65ea0e03f7d35b5f4ebbdb006618ce3ed808a457c00b589d4c72c0b10f5e26d61cefb9ccebe79af92910620f5a9e8 cryptsetup-1.6.5.tar.gz +d3950d9bd84453aacd8bc4092e39e52e06ae5dbc4284587f5209353e5315524ece8a4c2f492bf2dcde862bd2ec75cf59e9768936f21659029a49e5b1e201201d direct-io.patch" diff --git a/main/cryptsetup/direct-io.patch b/main/cryptsetup/direct-io.patch new file mode 100644 index 0000000000..25a242575f --- /dev/null +++ b/main/cryptsetup/direct-io.patch @@ -0,0 +1,148 @@ +From 89f795d7b453acf347c0b293d09746a8c0d48d12 Mon Sep 17 00:00:00 2001 +From: Milan Broz <gmazyland@gmail.com> +Date: Fri, 8 Aug 2014 14:49:38 +0200 +Subject: [PATCH] Fix keyslot device access for devices not supporting + O_DIRECT. + +--- + lib/luks1/keyencryption.c | 55 ++++++++++++++++++++++++++++------------------- + lib/utils_device.c | 6 ++++++ + 2 files changed, 39 insertions(+), 22 deletions(-) + +diff --git a/lib/luks1/keyencryption.c b/lib/luks1/keyencryption.c +index 66e942e..3bc9c33 100644 +--- a/lib/luks1/keyencryption.c ++++ b/lib/luks1/keyencryption.c +@@ -136,7 +136,7 @@ int LUKS_encrypt_to_storage(char *src, size_t srcLength, + + struct device *device = crypt_metadata_device(ctx); + struct crypt_storage *s; +- int devfd, bsize, r = 0; ++ int devfd = -1, bsize, r = 0; + + /* Only whole sector writes supported */ + if (srcLength % SECTOR_SIZE) +@@ -164,25 +164,33 @@ int LUKS_encrypt_to_storage(char *src, size_t srcLength, + + r = crypt_storage_encrypt(s, 0, srcLength / SECTOR_SIZE, src); + crypt_storage_destroy(s); ++ + if (r) + return r; + ++ r = -EIO; ++ + /* Write buffer to device */ + bsize = device_block_size(device); + if (bsize <= 0) +- return -EIO; ++ goto out; + +- devfd = open(device_path(device), O_RDWR | O_DIRECT); ++ devfd = device_open(device, O_RDWR); + if (devfd == -1) +- return -EIO; ++ goto out; + + if (lseek(devfd, sector * SECTOR_SIZE, SEEK_SET) == -1 || + write_blockwise(devfd, bsize, src, srcLength) == -1) +- r = -EIO; ++ goto out; + +- close(devfd); +- return r; ++ r = 0; ++out: ++ if(devfd != -1) ++ close(devfd); ++ if (r) ++ log_err(ctx, _("IO error while encrypting keyslot.\n")); + ++ return r; + } + + int LUKS_decrypt_from_storage(char *dst, size_t dstLength, +@@ -194,7 +202,7 @@ int LUKS_decrypt_from_storage(char *dst, size_t dstLength, + { + struct device *device = crypt_metadata_device(ctx); + struct crypt_storage *s; +- int devfd, bsize, r = 0; ++ int devfd = -1, bsize, r = 0; + + /* Only whole sector reads supported */ + if (dstLength % SECTOR_SIZE) +@@ -219,25 +227,20 @@ int LUKS_decrypt_from_storage(char *dst, size_t dstLength, + + log_dbg("Using userspace crypto wrapper to access keyslot area."); + ++ r = -EIO; ++ + /* Read buffer from device */ + bsize = device_block_size(device); +- if (bsize <= 0) { +- crypt_storage_destroy(s); +- return -EIO; +- } ++ if (bsize <= 0) ++ goto bad; + +- devfd = open(device_path(device), O_RDONLY | O_DIRECT); +- if (devfd == -1) { +- crypt_storage_destroy(s); +- return -EIO; +- } ++ devfd = device_open(device, O_RDONLY); ++ if (devfd == -1) ++ goto bad; + + if (lseek(devfd, sector * SECTOR_SIZE, SEEK_SET) == -1 || +- read_blockwise(devfd, bsize, dst, dstLength) == -1) { +- crypt_storage_destroy(s); +- close(devfd); +- return -EIO; +- } ++ read_blockwise(devfd, bsize, dst, dstLength) == -1) ++ goto bad; + + close(devfd); + +@@ -246,4 +249,12 @@ int LUKS_decrypt_from_storage(char *dst, size_t dstLength, + crypt_storage_destroy(s); + + return r; ++bad: ++ if(devfd != -1) ++ close(devfd); ++ ++ log_err(ctx, _("IO error while decrypting keyslot.\n")); ++ crypt_storage_destroy(s); ++ ++ return r; + } +diff --git a/lib/utils_device.c b/lib/utils_device.c +index d74149a..491a026 100644 +--- a/lib/utils_device.c ++++ b/lib/utils_device.c +@@ -72,6 +72,9 @@ int device_open(struct device *device, int flags) + devfd = open(device_path(device), flags | O_SYNC); + } + ++ if (devfd < 0) ++ log_dbg("Cannot open device %s.", device_path(device)); ++ + return devfd; + } + +@@ -229,6 +232,9 @@ int device_block_size(struct device *device) + if (ioctl(fd, BLKSSZGET, &bsize) >= 0) + r = bsize; + out: ++ if (r <= 0) ++ log_dbg("Cannot get block size for device %s.", device_path(device)); ++ + close(fd); + return r; + } +-- +2.0.3 + |