/mandos/trunk

To get this branch, use:
bzr branch http://bzr.recompile.se/loggerhead/mandos/trunk

« back to all changes in this revision

Viewing changes to initramfs-tools-script

  • Committer: Teddy Hogeborn
  • Date: 2016-03-17 20:40:55 UTC
  • Revision ID: teddy@recompile.se-20160317204055-bhsh5xsidq7w5cxu
Client: Fix plymouth agent; broken since 1.7.2.

Fix an very old memory bug in the plymouth agent (which has been
present since its apperance in version 1.2), but which was only
recently detected at run time due to the new -fsanitize=address
compile- time flag, which has been used since version 1.7.2.  This
detection of a memory access violation causes the program to abort,
making the Plymouth graphical boot system unable to accept interactive
input of passwords when using the Mandos client.

* plugins.d/plymouth.c (exec_and_wait): Fix memory allocation bug when
  allocating new_argv.  Also tolerate a zero-length argv.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/bin/sh -e
 
2
 
3
# This script will run in the initrd environment at boot and edit
 
4
# /conf/conf.d/cryptroot to set /lib/mandos/plugin-runner as keyscript
 
5
# when no other keyscript is set, before cryptsetup.
 
6
 
7
 
 
8
# This script should be installed as
 
9
# "/usr/share/initramfs-tools/scripts/init-premount/mandos" which will
 
10
# eventually be "/scripts/init-premount/mandos" in the initrd.img
 
11
# file.
 
12
 
 
13
PREREQ="udev"
 
14
prereqs()
 
15
{
 
16
    echo "$PREREQ"
 
17
}
 
18
 
 
19
case $1 in
 
20
prereqs)
 
21
        prereqs
 
22
        exit 0
 
23
        ;;
 
24
esac
 
25
 
 
26
. /scripts/functions
 
27
 
 
28
for param in `cat /proc/cmdline`; do
 
29
    case "$param" in
 
30
        ip=*) IPOPTS="${param#ip=}" ;;
 
31
        mandos=*)
 
32
            # Split option line on commas
 
33
            old_ifs="$IFS"
 
34
            IFS="$IFS,"
 
35
            for mpar in ${param#mandos=}; do
 
36
                IFS="$old_ifs"
 
37
                case "$mpar" in
 
38
                    off) exit 0 ;;
 
39
                    connect) connect="" ;;
 
40
                    connect:*) connect="${mpar#connect:}" ;;
 
41
                    *) log_warning_msg "$0: Bad option ${mpar}" ;;
 
42
                esac
 
43
            done
 
44
            unset mpar
 
45
            IFS="$old_ifs"
 
46
            unset old_ifs
 
47
            ;;
 
48
    esac
 
49
done
 
50
unset param
 
51
 
 
52
chmod a=rwxt /tmp
 
53
 
 
54
test -r /conf/conf.d/cryptroot
 
55
test -w /conf/conf.d
 
56
 
 
57
# Get DEVICE from /conf/initramfs.conf and other files
 
58
. /conf/initramfs.conf
 
59
for conf in /conf/conf.d/*; do
 
60
    [ -f ${conf} ] && . ${conf}
 
61
done
 
62
if [ -e /conf/param.conf ]; then
 
63
    . /conf/param.conf
 
64
fi
 
65
 
 
66
# Override DEVICE from sixth field of ip= kernel option, if passed
 
67
case "$IPOPTS" in
 
68
    *:*:*:*:*:*)                # At least six fields
 
69
        # Remove the first five fields
 
70
        device="${IPOPTS#*:*:*:*:*:}"
 
71
        # Remove all fields except the first one
 
72
        DEVICE="${device%%:*}"
 
73
        ;;
 
74
esac
 
75
 
 
76
# Add device setting (if any) to plugin-runner.conf
 
77
if [ "${DEVICE+set}" = set ]; then
 
78
    # Did we get the device from an ip= option?
 
79
    if [ "${device+set}" = set ]; then
 
80
        # Let ip= option override local config; append:
 
81
        cat <<-EOF >>/conf/conf.d/mandos/plugin-runner.conf
 
82
        
 
83
        --options-for=mandos-client:--interface=${DEVICE}
 
84
EOF
 
85
    else
 
86
        # Prepend device setting so any later options would override:
 
87
        sed -i -e \
 
88
            '1i--options-for=mandos-client:--interface='"${DEVICE}" \
 
89
            /conf/conf.d/mandos/plugin-runner.conf
 
90
    fi
 
91
fi
 
92
unset device
 
93
 
 
94
# If we are connecting directly, run "configure_networking" (from
 
95
# /scripts/functions); it needs IPOPTS and DEVICE
 
96
if [ "${connect+set}" = set ]; then
 
97
    set +e                      # Required by library functions
 
98
    configure_networking
 
99
    set -e
 
100
    if [ -n "$connect" ]; then
 
101
        cat <<-EOF >>/conf/conf.d/mandos/plugin-runner.conf
 
102
        
 
103
        --options-for=mandos-client:--connect=${connect}
 
104
EOF
 
105
    fi
 
106
fi
 
107
 
 
108
# Do not replace cryptroot file unless we need to.
 
109
replace_cryptroot=no
 
110
 
 
111
# Our keyscript
 
112
mandos=/lib/mandos/plugin-runner
 
113
test -x "$mandos"
 
114
 
 
115
# parse /conf/conf.d/cryptroot.  Format:
 
116
# target=sda2_crypt,source=/dev/sda2,key=none,keyscript=/foo/bar/baz
 
117
exec 3>/conf/conf.d/cryptroot.mandos
 
118
while read options; do
 
119
    newopts=""
 
120
    # Split option line on commas
 
121
    old_ifs="$IFS"
 
122
    IFS="$IFS,"
 
123
    for opt in $options; do
 
124
        # Find the keyscript option, if any
 
125
        case "$opt" in
 
126
            keyscript=*)
 
127
                keyscript="${opt#keyscript=}"
 
128
                newopts="$newopts,$opt"
 
129
                ;;
 
130
            "") : ;;
 
131
            *)
 
132
                newopts="$newopts,$opt"
 
133
                ;;
 
134
        esac
 
135
    done
 
136
    IFS="$old_ifs"
 
137
    unset old_ifs
 
138
    # If there was no keyscript option, add one.
 
139
    if [ -z "$keyscript" ]; then
 
140
        replace_cryptroot=yes
 
141
        newopts="$newopts,keyscript=$mandos"
 
142
    fi
 
143
    newopts="${newopts#,}"
 
144
    echo "$newopts" >&3
 
145
done < /conf/conf.d/cryptroot
 
146
exec 3>&-
 
147
 
 
148
# If we need to, replace the old cryptroot file with the new file.
 
149
if [ "$replace_cryptroot" = yes ]; then
 
150
    mv /conf/conf.d/cryptroot /conf/conf.d/cryptroot.mandos-old
 
151
    mv /conf/conf.d/cryptroot.mandos /conf/conf.d/cryptroot
 
152
else
 
153
    rm /conf/conf.d/cryptroot.mandos
 
154
fi