commit f847dfb10b01bbe5f53c3d66badedfc1be9e9046
parent 9ed79aacd5ef54b9f19f0b91c000f13f46ec76ab
Author: Jason A. Donenfeld <Jason@zx2c4.com>
Date: Sun, 29 Jun 2014 10:45:36 +0200
darwin: properly ejects ramdisks
In the move away from extensive global variables and improved cleanup
routines, we forgot to fix the darwin platform file, which means
temporary ramdisks never got unmounted. This patch cleans up the general
cleanup trap logic routines.
Diffstat:
2 files changed, 20 insertions(+), 15 deletions(-)
diff --git a/src/password-store.sh b/src/password-store.sh
@@ -163,11 +163,16 @@ clip() {
echo "Copied $2 to clipboard. Will clear in $CLIP_TIME seconds."
}
tmpdir() {
+ [[ -n $SECURE_TMPDIR ]] && return
local warn=1
[[ $1 == "nowarn" ]] && warn=0
local template="$PROGRAM.XXXXXXXXXXXXX"
if [[ -d /dev/shm && -w /dev/shm && -x /dev/shm ]]; then
SECURE_TMPDIR="$(TMPDIR=/dev/shm mktemp -d -t "$template")"
+ remove_tmpfile() {
+ rm -rf "$SECURE_TMPDIR"
+ }
+ trap remove_tmpfile INT TERM EXIT
else
[[ $warn -eq 1 ]] && yesno "$(cat <<-_EOF
Your system does not have /dev/shm, which means that it may
@@ -178,6 +183,11 @@ tmpdir() {
_EOF
)"
SECURE_TMPDIR="$(mktemp -d -t "$template")"
+ shred_tmpfile() {
+ find "$SECURE_TMPDIR" -type f -exec $SHRED {} +
+ rm -rf "$SECURE_TMPDIR"
+ }
+ trap shred_tmpfile INT TERM EXIT
fi
}
@@ -413,11 +423,6 @@ cmd_edit() {
tmpdir #Defines $SECURE_TMPDIR
local tmp_file="$(TMPDIR="$SECURE_TMPDIR" mktemp -t "$template")"
- eval "shred_tmpfile() {
- $SHRED '$tmp_file'
- rm -rf '$SECURE_TMPDIR' '$tmp_file'
- }"
- trap shred_tmpfile INT TERM EXIT
local action="Add"
diff --git a/src/platform/darwin.sh b/src/platform/darwin.sh
@@ -16,19 +16,19 @@ clip() {
}
tmpdir() {
- cleanup_tmp() {
- [[ -d $SECURE_TMPDIR ]] || return
- rm -rf "$tmp_file" "$SECURE_TMPDIR" 2>/dev/null
+ [[ -n $SECURE_TMPDIR ]] && return
+ unmount_tmpdir() {
+ [[ -n $SECURE_TMPDIR && -d $SECURE_TMPDIR && -n $DARWIN_RAMDISK_DEV ]] || return
umount "$SECURE_TMPDIR"
- diskutil quiet eject "$ramdisk_dev"
- rmdir "$SECURE_TMPDIR"
+ diskutil quiet eject "$DARWIN_RAMDISK_DEV"
+ rm -rf "$SECURE_TMPDIR"
}
- trap cleanup_tmp INT TERM EXIT
+ trap unmount_tmpdir INT TERM EXIT
SECURE_TMPDIR="$(mktemp -t "$template" -d)"
- local ramdisk_dev="$(hdid -drivekey system-image=yes -nomount 'ram://32768' | cut -d ' ' -f 1)" # 32768 sectors = 16 mb
- [[ -z $ramdisk_dev ]] && exit 1
- newfs_hfs -M 700 "$ramdisk_dev" &>/dev/null || exit 1
- mount -t hfs -o noatime -o nobrowse "$ramdisk_dev" "$SECURE_TMPDIR" || exit 1
+ DARWIN_RAMDISK_DEV="$(hdid -drivekey system-image=yes -nomount 'ram://32768' | cut -d ' ' -f 1)" # 32768 sectors = 16 mb
+ [[ -z $DARWIN_RAMDISK_DEV ]] && die "Error: could not create ramdisk."
+ newfs_hfs -M 700 "$DARWIN_RAMDISK_DEV" &>/dev/null || die "Error: could not create filesystem on ramdisk."
+ mount -t hfs -o noatime -o nobrowse "$DARWIN_RAMDISK_DEV" "$SECURE_TMPDIR" || die "Error: could not mount filesystem on ramdisk."
}
GETOPT="$(brew --prefix gnu-getopt 2>/dev/null || echo /usr/local)/bin/getopt"