1
# Copyright (C) 2012 Red Hat, Inc. All rights reserved.
3
# This copyrighted material is made available to anyone wishing to use,
4
# modify, copy, or redistribute it subject to the terms and conditions
5
# of the GNU General Public License v.2.
7
# You should have received a copy of the GNU General Public License
8
# along with this program; if not, write to the Free Software Foundation,
9
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15
CHARACTER_WHITELIST="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789#+-.:=@_"
16
FAIL_MIXED_STR="contains mixed mangled and unmangled characters"
17
FAIL_MULTI_STR="seems to be mangled more than once"
18
FAIL_BLACK_STR="should be mangled but it contains blacklisted characters"
19
CORRECT_FORM_STR="name already in correct form"
20
RENAMING_STR="renaming to"
22
function create_dm_dev()
27
if [ $mode = "none" ]; then
28
# there's no mangling done - we must use --verifyudev here in
29
# case we're testing with udev so we have the nodes in place,
30
# udev would not create them - it can't handle unmangled names
31
verify_udev="--verifyudev"
36
dmsetup create "${name_prefix}$name" $verify_udev --manglename $mode --table "0 1 zero"
39
function remove_dm_dev()
44
if [ $mode = "none" ]; then
45
verify_udev="--verifyudev"
50
dmsetup remove $verify_udev --manglename $mode "${name_prefix}$name"
53
function check_create_and_remove()
60
if [ $mode = "none" ]; then
61
verify_udev="--verifyudev"
66
dmsetup create "${name_prefix}$input_name" $verify_udev --manglename $mode --table "0 1 zero" 2>err && \
67
test -b "$DM_DEV_DIR/mapper/${name_prefix}$dm_name" && \
68
dmsetup remove "${name_prefix}$input_name" $verify_udev --manglename $mode || r=1
70
if [ $dm_name = "FAIL_MIXED" ]; then
72
grep "$FAILED_MIXED_STR" err || r=1
73
elif [ $dm_name = "FAIL_MULTI" ]; then
75
grep "$FAILED_MULTI_STR" err || r=1
76
elif [ $dm_name = "FAIL_BLACK" ]; then
78
grep "$FAILED_BLACK_STR" err || r=1
84
function check_dm_field()
91
value=$(dmsetup info --rows --noheadings --manglename $mode -c -o $field "${DM_DEV_DIR}/mapper/${name_prefix}$dm_name" 2> err || true)
93
if [ "$expected" = "FAIL_MIXED" ]; then
94
grep "$FAIL_MIXED_STR" err
95
elif [ "$expected" = "FAIL_MULTI" ]; then
96
grep "$FAIL_MULTI_STR" err
97
elif [ "$expected" = "FAIL_BLACK" ]; then
98
grep "$FAIL_BLACK_STR" err
100
test "$value" = "${name_prefix}$expected"
104
function check_expected_names()
110
create_dm_dev none "$dm_name"
112
test -b "$DM_DEV_DIR/mapper/${name_prefix}$dm_name" && \
113
check_dm_field none "$dm_name" name "$dm_name" && \
114
check_dm_field $mode "$dm_name" name "$3" && \
115
check_dm_field $mode "$dm_name" mangled_name "$4" && \
116
check_dm_field $mode "$dm_name" unmangled_name "$5" || r=1
118
remove_dm_dev none "$dm_name"
123
function check_mangle_cmd()
128
local rename_expected=0
131
create_dm_dev none "$dm_name"
133
dmsetup mangle --manglename $mode "${name_prefix}$dm_name" 1>out 2>err || true;
135
if [ "$expected" = "OK" ]; then
136
grep "$CORRECT_FORM_STR" out || r=1
137
elif [ "$expected" = "FAIL_MIXED" ]; then
138
grep "$FAIL_MIXED_STR" err || r=1
139
elif [ "$expected" = "FAIL_MULTI" ]; then
140
grep "$FAIL_MULTI_STR" err || r=1
143
grep -F "$RENAMING_STR ${name_prefix}$expected" out || r=1
146
if [ $r = 0 -a $rename_expected = 1 ]; then
147
# successfuly renamed to expected name
148
remove_dm_dev none "$expected"
149
elif [ $r = 1 ]; then
150
# failed to rename to expected or renamed when it should not - find the new name
151
new_name=$(sed -e "s/.*: $RENAMING_STR //g" out)
152
# try to remove any of the form - falling back to less probable error scenario
153
dmsetup remove --verifyudev --manglename none "$new_name" || \
154
remove_dm_dev none "$dm_name" || remove_dm_dev none "$expected"
156
# successfuly done nothing
157
remove_dm_dev none "$dm_name"
163
# check dmsetup can process path where the last component is not equal dm name (rhbz #797322)
165
create_dm_dev auto "abc"
166
ln -s ${DM_DEV_DIR}/mapper/${name_prefix}abc ${DM_DEV_DIR}/${name_prefix}xyz
167
dmsetup status ${DM_DEV_DIR}/${name_prefix}xyz || r=1
168
remove_dm_dev auto "abc"
173
### ALL WHITELISTED CHARACTERS ###
174
# none of these should be mangled in any mode
175
name="$CHARACTER_WHITELIST"
176
for mode in auto hex none; do
177
check_expected_names $mode "$name" "$name" "$name" "$name"
178
check_mangle_cmd $mode "$name" "OK"
182
#### NONE MANGLING MODE ###
183
check_create_and_remove none 'a b' 'a b'
184
check_create_and_remove none 'a\x20b' 'a\x20b'
185
check_create_and_remove none 'a b\x20c' 'a b\x20c'
186
check_create_and_remove none 'a\x5cx20b' 'a\x5cx20b'
188
check_expected_names none 'a b' 'a b' 'a\x20b' 'a b'
189
check_expected_names none 'a\x20b' 'a\x20b' 'a\x20b' 'a b'
190
check_expected_names none 'a b\x20c' 'a b\x20c' 'FAIL_MIXED' 'a b c'
191
check_expected_names none 'a\x5cx20b' 'a\x5cx20b' 'a\x5cx20b' 'a\x20b'
193
check_mangle_cmd none 'a b' 'OK'
194
check_mangle_cmd none 'a\x20b' 'a b'
195
check_mangle_cmd none 'a b\x20c' 'a b c'
196
check_mangle_cmd none 'a\x5cx20b' 'a\x20b'
199
### AUTO MANGLING MODE ###
200
check_create_and_remove auto 'a b' 'a\x20b'
201
check_create_and_remove auto 'a\x20b' 'a\x20b'
202
check_create_and_remove auto 'a b\x20c' 'FAIL_MIXED'
203
check_create_and_remove auto 'a\x5cx20b' 'FAIL_MULTI'
205
check_expected_names auto 'a b' 'FAIL_BLACK' 'FAIL_BLACK' 'FAIL_BLACK'
206
check_expected_names auto 'a\x20b' 'a b' 'a\x20b' 'a b'
207
check_expected_names auto 'a b\x20c' 'FAIL_BLACK' 'FAIL_BLACK' 'FAIL_BLACK'
208
check_expected_names auto 'a\x5cx20b' 'FAIL_MULTI' 'FAIL_MULTI' 'FAIL_MULTI'
210
check_mangle_cmd auto 'a b' 'a\x20b'
211
check_mangle_cmd auto 'a\x20b' 'OK'
212
check_mangle_cmd auto 'a b\x20c' 'FAIL_MIXED'
213
check_mangle_cmd auto 'a\x5cx20b' 'FAIL_MULTI'
216
### HEX MANGLING MODE ###
217
check_create_and_remove hex 'a b' 'a\x20b'
218
check_create_and_remove hex 'a\x20b' 'a\x5cx20b'
219
check_create_and_remove hex 'a b\x20c' 'a\x20b\x5cx20c'
220
check_create_and_remove hex 'a\x5cx20b' 'a\x5cx5cx20b'
222
check_expected_names hex 'a b' 'FAIL_BLACK' 'FAIL_BLACK' 'FAIL_BLACK'
223
check_expected_names hex 'a\x20b' 'a b' 'a\x20b' 'a b'
224
check_expected_names hex 'a b\x20c' 'FAIL_BLACK' 'FAIL_BLACK' 'FAIL_BLACK'
225
check_expected_names hex 'a\x5cx20b' 'a\x20b' 'a\x5cx20b' 'a\x20b'
227
check_mangle_cmd hex 'a b' 'a\x20b'
228
check_mangle_cmd hex 'a\x20b' 'OK'
229
check_mangle_cmd hex 'a b\x20c' 'FAIL_MIXED'
230
check_mangle_cmd hex 'a\x5cx20b' 'OK'