26
26
#include "container.h"
27
27
#include "../config.h"
28
28
29
+ #define INVALID_UGID (~0UL)
30
+
29
31
int hyper_setup_env (struct env * envs , int num , bool setPATH )
30
32
{
31
33
int i , ret = 0 ;
@@ -152,17 +154,22 @@ bool hyper_name_to_id(const char *name, unsigned long *val)
152
154
// the same as getpwnam(), but it only parses /etc/passwd and allows name to be id string
153
155
struct passwd * hyper_getpwnam (const char * name )
154
156
{
155
- uid_t uid = (uid_t )id_or_max (name );
156
- FILE * file = fopen ("/etc/passwd" , "r" );
157
+ uid_t uid ;
158
+ FILE * file ;
159
+ struct passwd * pwd ;
160
+
161
+ uid = (uid_t )id_or_max (name );
162
+ file = fopen ("/etc/passwd" , "r" );
157
163
if (!file ) {
158
164
perror ("faile to open /etc/passwd" );
159
165
return NULL ;
160
166
}
161
167
for (;;) {
162
- struct passwd * pwd = fgetpwent (file );
168
+ pwd = fgetpwent (file );
163
169
if (!pwd )
164
170
break ;
165
- if (!strcmp (pwd -> pw_name , name ) || pwd -> pw_uid == uid ) {
171
+ if (pwd -> pw_uid == uid ||
172
+ (!strcmp (pwd -> pw_name , name ) && (uid_t )INVALID_UGID == uid )) {
166
173
fclose (file );
167
174
return pwd ;
168
175
}
@@ -174,17 +181,22 @@ struct passwd *hyper_getpwnam(const char *name)
174
181
// the same as getgrnam(), but it only parses /etc/group and allows the name to be id string
175
182
struct group * hyper_getgrnam (const char * name )
176
183
{
177
- gid_t gid = (gid_t )id_or_max (name );
178
- FILE * file = fopen ("/etc/group" , "r" );
184
+ gid_t gid ;
185
+ FILE * file ;
186
+ struct group * gr = NULL ;
187
+
188
+ gid = (gid_t )id_or_max (name );
189
+ file = fopen ("/etc/group" , "r" );
179
190
if (!file ) {
180
191
perror ("faile to open /etc/group" );
181
192
return NULL ;
182
193
}
183
194
for (;;) {
184
- struct group * gr = fgetgrent (file );
195
+ gr = fgetgrent (file );
185
196
if (!gr )
186
197
break ;
187
- if (!strcmp (gr -> gr_name , name ) || gr -> gr_gid == gid ) {
198
+ if (gr -> gr_gid == gid ||
199
+ (!strcmp (gr -> gr_name , name ) && (gid_t )INVALID_UGID == gid )) {
188
200
fclose (file );
189
201
return gr ;
190
202
}
0 commit comments