blob: ece246e86ce69361bf64e57e27e17d0df5976bd9 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
|
#!/bin/bash
. $(dirname $0)/../../include.rc
. $(dirname $0)/../../volume.rc
. $(dirname $0)/../../nfs.rc
SCRIPT_TIMEOUT=500
#G_TESTDEF_TEST_STATUS_CENTOS6=NFS_TEST
function create_files() {
local first="${1}"
local last="${2}"
local prefix="${3}"
local gid
local file
for gid in $(seq ${first} ${last}); do
file="${prefix}${gid}"
if ! echo 'Hello World!' >"${file}"; then
return 1
fi
if ! chgrp ${gid} "${file}"; then
return 1
fi
if ! chmod 0640 "${file}"; then
return 1
fi
done
return 0
}
function access_files() {
local first="${1}"
local last="${2}"
local prefix="${3}"
local user="${4}"
local gid
local file
local good
local bad
good="0"
bad="0"
for gid in $(seq ${first} ${last}); do
file="${prefix}${gid}"
if su -m ${user} -c "cat ${prefix}${gid} >/dev/null 2>&1"; then
good="$((${good} + 1))"
else
bad="$((${bad} + 1))"
fi
done
echo "${good} ${bad}"
}
cleanup
# prepare the users and groups
NEW_USER=bug1053579
NEW_UID=1053579
NEW_GID=1053579
LAST_GID=1053779
NEW_GIDS=${NEW_GID}
# OS-specific overrides
case $OSTYPE in
NetBSD|Darwin)
# only NGROUPS_MAX=16 secondary groups are supported
LAST_GID=1053593
;;
FreeBSD)
# NGROUPS_MAX=1023 (FreeBSD>=8.0), we can afford 200 groups
;;
Linux)
# NGROUPS_MAX=65536, we can afford 200 groups
;;
*)
;;
esac
# create a user that belongs to many groups
for GID in $(seq ${NEW_GID} ${LAST_GID})
do
groupadd -o -g ${GID} ${NEW_USER}-${GID}
NEW_GIDS="${NEW_GIDS},${NEW_USER}-${GID}"
done
TEST useradd -o -M -u ${NEW_UID} -g ${NEW_GID} -G ${NEW_USER}-${NEW_GIDS} ${NEW_USER}
# preparation done, start the tests
TEST glusterd
TEST pidof glusterd
TEST $CLI volume create $V0 $H0:$B0/${V0}1
TEST $CLI volume set $V0 nfs.disable false
TEST $CLI volume set $V0 nfs.server-aux-gids on
TEST $CLI volume start $V0
EXPECT_WITHIN $NFS_EXPORT_TIMEOUT "1" is_nfs_export_available
# mount the volume
TEST mount_nfs $H0:/$V0 $N0 nolock
TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0
# the actual test, this used to crash
su -m ${NEW_USER} -c "stat $N0/. > /dev/null"
TEST [ $? -eq 0 ]
# create one file for each group of the user
TEST create_files "${NEW_GID}" "${LAST_GID}" "${N0}/file."
# try to access all files as the user
RES=($(access_files "${NEW_GID}" "${LAST_GID}" "${N0}/file." "${NEW_USER}"))
TEST [[ ${RES[0]} -gt 0 ]]
case $OSTYPE in
Linux) # Linux NFS fails with big GID
if [ ${RES[1]} -ne 0 ] ; then
res="Y"
else
res="N"
fi
;;
*) # Other systems should cope better
if [ ${RES[1]} -eq 0 ] ; then
res="Y"
else
res="N"
fi
;;
esac
TEST [ "x$res" = "xY" ]
# enable server.manage-gids and things should work
TEST $CLI volume set $V0 server.manage-gids on
RES=($(access_files "${NEW_GID}" "${LAST_GID}" "${N0}/file." "${NEW_USER}"))
TEST [[ ${RES[0]} -gt 0 ]]
TEST [[ ${RES[1]} -eq 0 ]]
RES=($(access_files "${NEW_GID}" "${LAST_GID}" "${M0}/file." "${NEW_USER}"))
TEST [[ ${RES[0]} -gt 0 ]]
TEST [[ ${RES[1]} -eq 0 ]]
# cleanup
userdel --force ${NEW_USER}
for GID in $(seq ${NEW_GID} ${LAST_GID})
do
groupdel ${NEW_USER}-${GID}
done
rm -f $N0/README
EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $N0
EXPECT_WITHIN $UMOUNT_TIMEOUT "Y" force_umount $M0
TEST $CLI volume stop $V0
TEST $CLI volume delete $V0
cleanup
|