/mandos/release

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

« back to all changes in this revision

Viewing changes to initramfs-tools-hook

  • Committer: Teddy Hogeborn
  • Date: 2016-03-17 20:40:55 UTC
  • mto: (237.7.594 trunk)
  • mto: This revision was merged to the branch mainline in revision 341.
  • 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:
3
3
# This script will be run by 'mkinitramfs' when it creates the image.
4
4
# Its job is to decide which files to install, then install them into
5
5
# the staging area, where the initramfs is being created.  This
6
 
# happens when a new 'linux-image' package is installed, or when the
 
6
# happens when a new 'linux-image' package is installed, or when an
7
7
# administrator runs 'update-initramfs' by hand to update an initramfs
8
8
# image.
9
9
 
29
29
 
30
30
. /usr/share/initramfs-tools/hook-functions
31
31
 
32
 
for d in /usr /usr/local; do
33
 
    if [ -d "$d"/lib/mandos ]; then
34
 
        prefix="$d"
 
32
for d in /usr/lib \
 
33
    "/usr/lib/`dpkg-architecture -qDEB_HOST_MULTIARCH 2>/dev/null`" \
 
34
    "`rpm --eval='%{_libdir}' 2>/dev/null`" /usr/local/lib; do
 
35
    if [ -d "$d"/mandos ]; then
 
36
        libdir="$d"
35
37
        break
36
38
    fi
37
39
done
38
 
if [ -z "$prefix" ]; then
 
40
if [ -z "$libdir" ]; then
39
41
    # Mandos not found
40
42
    exit 1
41
43
fi
51
53
    exit 1
52
54
fi
53
55
 
54
 
mandos_user="`{ getent passwd _mandos \
55
 
                || getent passwd mandos \
56
 
                || getent passwd nobody \
57
 
                || echo ::65534::::; } \
58
 
        | awk --field-separator=: '{ print $3 }'`" 
59
 
mandos_group="`{ getent group _mandos \
60
 
                || getent group mandos \
61
 
                || getent group nogroup \
62
 
                || echo ::65534:; } \
63
 
        | awk --field-separator=: '{ print $3 }'`"
 
56
set `{ getent passwd _mandos \
 
57
    || getent passwd nobody \
 
58
    || echo ::65534:65534:::; } \
 
59
    | cut --delimiter=: --fields=3,4 --only-delimited \
 
60
    --output-delimiter=" "`
 
61
mandos_user="$1"
 
62
mandos_group="$2"
64
63
 
65
64
# The Mandos network client uses the network
66
65
auto_add_modules net
71
70
CONFDIR="/conf/conf.d/mandos"
72
71
MANDOSDIR="/lib/mandos"
73
72
PLUGINDIR="${MANDOSDIR}/plugins.d"
 
73
PLUGINHELPERDIR="${MANDOSDIR}/plugin-helpers"
 
74
HOOKDIR="${MANDOSDIR}/network-hooks.d"
74
75
 
75
76
# Make directories
76
77
install --directory --mode=u=rwx,go=rx "${DESTDIR}${CONFDIR}" \
77
 
        "${DESTDIR}${MANDOSDIR}"
 
78
        "${DESTDIR}${MANDOSDIR}" "${DESTDIR}${HOOKDIR}" \
 
79
        "${DESTDIR}${PLUGINHELPERDIR}"
78
80
install --owner=${mandos_user} --group=${mandos_group} --directory \
79
81
    --mode=u=rwx "${DESTDIR}${PLUGINDIR}"
80
82
 
81
83
# Copy the Mandos plugin runner
82
 
copy_exec "$prefix"/lib/mandos/plugin-runner "${MANDOSDIR}"
 
84
copy_exec "$libdir"/mandos/plugin-runner "${MANDOSDIR}"
83
85
 
84
86
# Copy the plugins
85
87
 
86
88
# Copy the packaged plugins
87
 
for file in "$prefix"/lib/mandos/plugins.d/*; do
 
89
for file in "$libdir"/mandos/plugins.d/*; do
88
90
    base="`basename \"$file\"`"
89
91
    # Is this plugin overridden?
90
92
    if [ -e "/etc/mandos/plugins.d/$base" ]; then
91
93
        continue
92
94
    fi
93
95
    case "$base" in
94
 
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-bak|*.dpkg-new|*.dpkg-divert) : ;;
95
 
        "*") :;;
96
 
        *) copy_exec "$file" "${PLUGINDIR}";;
 
96
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-bak|*.dpkg-new|*.dpkg-divert)
 
97
            : ;;
 
98
        "*") echo "W: Mandos client plugin directory is empty." >&2 ;;
 
99
        *) copy_exec "$file" "${PLUGINDIR}" ;;
 
100
    esac
 
101
done
 
102
 
 
103
# Copy the packaged plugin helpers
 
104
for file in "$libdir"/mandos/plugin-helpers/*; do
 
105
    base="`basename \"$file\"`"
 
106
    # Is this plugin overridden?
 
107
    if [ -e "/etc/mandos/plugin-helpers/$base" ]; then
 
108
        continue
 
109
    fi
 
110
    case "$base" in
 
111
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-bak|*.dpkg-new|*.dpkg-divert)
 
112
            : ;;
 
113
        "*") : ;;
 
114
        *) copy_exec "$file" "${PLUGINHELPERDIR}" ;;
97
115
    esac
98
116
done
99
117
 
101
119
for file in /etc/mandos/plugins.d/*; do
102
120
    base="`basename \"$file\"`"
103
121
    case "$base" in
104
 
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-bak|*.dpkg-new|*.dpkg-divert) : ;;
105
 
        "*") :;;
106
 
        *) copy_exec "$file" "${PLUGINDIR}";;
107
 
    esac
108
 
done
109
 
 
110
 
# GPGME needs /usr/bin/gpg
111
 
if [ ! -e "${DESTDIR}/usr/bin/gpg" \
112
 
    -a -n "`ls \"${DESTDIR}\"/usr/lib/libgpgme.so* \
113
 
                2>/dev/null`" ]; then
114
 
    copy_exec /usr/bin/gpg
115
 
fi
 
122
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-bak|*.dpkg-new|*.dpkg-divert)
 
123
            : ;;
 
124
        "*") : ;;
 
125
        *) copy_exec "$file" "${PLUGINDIR}" ;;
 
126
    esac
 
127
done
 
128
 
 
129
# Copy any user-supplied plugin helpers
 
130
for file in /etc/mandos/plugin-helpers/*; do
 
131
    base="`basename \"$file\"`"
 
132
    case "$base" in
 
133
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-bak|*.dpkg-new|*.dpkg-divert)
 
134
            : ;;
 
135
        "*") : ;;
 
136
        *) copy_exec "$file" "${PLUGINHELPERDIR}" ;;
 
137
    esac
 
138
done
 
139
 
 
140
# Get DEVICE from initramfs.conf and other files
 
141
. /etc/initramfs-tools/initramfs.conf
 
142
for conf in /etc/initramfs-tools/conf.d/*; do
 
143
    if [ -n `basename \"$conf\" | grep '^[[:alnum:]][[:alnum:]\._-]*$' \
 
144
        | grep -v '\.dpkg-.*$'` ]; then
 
145
        [ -f ${conf} ] && . ${conf}
 
146
    fi
 
147
done
 
148
export DEVICE
 
149
 
 
150
# Copy network hooks
 
151
for hook in /etc/mandos/network-hooks.d/*; do
 
152
    case "`basename \"$hook\"`" in
 
153
        "*") continue ;;
 
154
        *[!A-Za-z0-9_.-]*) continue ;;
 
155
        *) test -d "$hook" || copy_exec "$hook" "${HOOKDIR}" ;;
 
156
    esac
 
157
    if [ -x "$hook" ]; then
 
158
        # Copy any files needed by the network hook
 
159
        MANDOSNETHOOKDIR=/etc/mandos/network-hooks.d MODE=files \
 
160
            VERBOSITY=0 "$hook" files | while read file target; do
 
161
            if [ ! -e "${file}" ]; then
 
162
                echo "WARNING: file ${file} not found, requested by Mandos network hook '${hook##*/}'" >&2
 
163
            fi
 
164
            if [ -z "${target}" ]; then
 
165
                copy_exec "$file"
 
166
            else
 
167
                copy_exec "$file" "$target"
 
168
            fi
 
169
        done
 
170
        # Copy and load any modules needed by the network hook
 
171
        MANDOSNETHOOKDIR=/etc/mandos/network-hooks.d MODE=modules \
 
172
            VERBOSITY=0 "$hook" modules | while read module; do
 
173
            if [ -z "${target}" ]; then
 
174
                force_load "$module"
 
175
            fi
 
176
        done
 
177
    fi
 
178
done
 
179
 
 
180
# GPGME needs GnuPG
 
181
gpg=/usr/bin/gpg
 
182
libgpgme11_version="`dpkg-query --showformat='${Version}' --show libgpgme11`"
 
183
if dpkg --compare-versions "$libgpgme11_version" ge 1.5.0-0.1; then
 
184
    if [ -e /usr/bin/gpgconf ]; then
 
185
        if [ ! -e "${DESTDIR}/usr/bin/gpgconf" ]; then
 
186
            copy_exec /usr/bin/gpgconf
 
187
        fi
 
188
        gpg="`/usr/bin/gpgconf|sed --quiet --expression='s/^gpg:[^:]*://p'`"
 
189
    fi
 
190
elif dpkg --compare-versions "$libgpgme11_version" ge 1.4.1-0.1; then
 
191
    gpg=/usr/bin/gpg2
 
192
fi
 
193
if [ ! -e "${DESTDIR}$gpg" ]; then
 
194
    copy_exec "$gpg"
 
195
fi
 
196
unset gpg
 
197
unset libgpgme11_version
116
198
 
117
199
# Config files
118
 
for file in /etc/mandos/*; do
 
200
for file in /etc/mandos/plugin-runner.conf; do
119
201
    if [ -d "$file" ]; then
120
202
        continue
121
203
    fi
123
205
done
124
206
 
125
207
if [ ${mandos_user} != 65534 ]; then
126
 
    PLUGINRUNNERCONF="${DESTDIR}${CONFDIR}/plugin-runner.conf"
127
 
    echo "--userid=${mandos_user}" >> "$PLUGINRUNNERCONF"
 
208
    sed --in-place --expression="1i--userid=${mandos_user}" \
 
209
        "${DESTDIR}${CONFDIR}/plugin-runner.conf"
128
210
fi
129
211
 
130
212
if [ ${mandos_group} != 65534 ]; then
131
 
    PLUGINRUNNERCONF="${DESTDIR}${CONFDIR}/plugin-runner.conf"
132
 
    echo "--groupid=${mandos_group}" >> "$PLUGINRUNNERCONF"
 
213
    sed --in-place --expression="1i--groupid=${mandos_group}" \
 
214
        "${DESTDIR}${CONFDIR}/plugin-runner.conf"
133
215
fi
134
216
 
135
 
# Key files 
136
 
for file in  "$keydir"/*; do
 
217
# Key files
 
218
for file in "$keydir"/*; do
137
219
    if [ -d "$file" ]; then
138
220
        continue
139
221
    fi
140
 
    cp --archive --sparse=always "$file" "${DESTDIR}${CONFDIR}"
141
 
    chown ${mandos_user}:${mandos_group} \
142
 
        "${DESTDIR}${CONFDIR}/`basename \"$file\"`"
 
222
    case "$file" in
 
223
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-bak|*.dpkg-new|*.dpkg-divert)
 
224
            : ;;
 
225
        "*") : ;;
 
226
        *)
 
227
            cp --archive --sparse=always "$file" \
 
228
               "${DESTDIR}${CONFDIR}"
 
229
            chown ${mandos_user}:${mandos_group} \
 
230
                  "${DESTDIR}${CONFDIR}/`basename \"$file\"`"
 
231
            ;;
 
232
    esac
143
233
done
 
234
# Use Diffie-Hellman parameters file if available
 
235
if [ -e "${DESTDIR}${CONFDIR}"/dhparams.pem ]; then
 
236
    sed --in-place \
 
237
        --expression="1i--options-for=mandos-client:--dh-params=${CONFDIR}/dhparams.pem" \
 
238
        "${DESTDIR}/${CONFDIR}/plugin-runner.conf"
 
239
fi
144
240
 
145
241
# /lib/mandos/plugin-runner will drop priviliges, but needs access to
146
242
# its plugin directory and its config file.  However, since almost all
168
264
        chmod a+rX "${DESTDIR}$dir"
169
265
    fi
170
266
done
171
 
for dir in /lib /usr/lib; do
172
 
    find "${DESTDIR}$dir" \! -perm -u+rw,g+r -prune -or -print0 \
173
 
        | xargs --null --no-run-if-empty chmod a+rX
 
267
for dir in "${DESTDIR}"/lib* "${DESTDIR}"/usr/lib*; do
 
268
    if [ -d "$dir" ]; then
 
269
        find "$dir" \! -perm -u+rw,g+r -prune -or \! -type l -print0 \
 
270
            | xargs --null --no-run-if-empty chmod a+rX --
 
271
    fi
174
272
done