@@ -278,48 +278,52 @@ write_pid(const char *file_name) {
278278}
279279
280280int
281- set_user_and_group (uid_t pw_uid , gid_t pw_gid ) {
281+ set_user_and_group (const uid_t pw_uid , const gid_t pw_gid ) {
282282 int error ;
283283 struct passwd * pwd , pwd_buf ;
284- char buffer [4096 ], err_descr [256 ];
284+ char buf [4096 ], err_descr [256 ];
285285
286- if (0 == pw_uid || 0 == pw_gid )
286+ if (0 == pw_uid )
287287 return (EINVAL );
288288
289- error = getpwuid_r (pw_uid , & pwd_buf , buffer , sizeof (buffer ), & pwd );
289+ error = getpwuid_r (pw_uid , & pwd_buf , buf , sizeof (buf ), & pwd );
290290 if (0 != error ) {
291291 strerror_r (error , err_descr , sizeof (err_descr ));
292- fprintf (stderr , "set_user_and_group : getpwuid_r() error %i: %s\n" ,
293- error , err_descr );
292+ fprintf (stderr , "%s : getpwuid_r() error %i: %s\n" ,
293+ __FUNCTION__ , error , err_descr );
294294 return (error );
295295 }
296296
297- if (0 != setgid (pw_gid )) {
297+ /* Drop all supplementary groups immediately. */
298+ if (0 != setgroups (0 , NULL )) {
298299 error = errno ;
299300 strerror_r (error , err_descr , sizeof (err_descr ));
300- fprintf (stderr , "set_user_and_group: setgid( ) error %i: %s\n" ,
301- error , err_descr );
301+ fprintf (stderr , "%s: setgroups(0, NULL ) error %i: %s\n" ,
302+ __FUNCTION__ , error , err_descr );
302303 return (error );
303304 }
304- if (0 != initgroups (pwd -> pw_name , pw_gid )) {
305+ /* Set the Primary Group ID. */
306+ if (0 != setgid (((0 != pw_gid ) ? pw_gid : pwd -> pw_gid ))) {
305307 error = errno ;
306308 strerror_r (error , err_descr , sizeof (err_descr ));
307- fprintf (stderr , "set_user_and_group: initgroups () error %i: %s\n" ,
308- error , err_descr );
309+ fprintf (stderr , "%s: setgid () error %i: %s\n" ,
310+ __FUNCTION__ , error , err_descr );
309311 return (error );
310312 }
311- if (0 != setgroups (1 , & pwd -> pw_gid )) {
313+ /* Initialize Supplementary Groups defined in /etc/group. */
314+ if (0 != initgroups (pwd -> pw_name , pwd -> pw_gid )) {
312315 error = errno ;
313316 strerror_r (error , err_descr , sizeof (err_descr ));
314- fprintf (stderr , "set_user_and_group: setgroups () error %i: %s\n" ,
315- error , err_descr );
317+ fprintf (stderr , "%s: initgroups () error %i: %s\n" ,
318+ __FUNCTION__ , error , err_descr );
316319 return (error );
317320 }
321+ /* Drop User ID. */
318322 if (0 != setuid (pw_uid )) {
319323 error = errno ;
320324 strerror_r (error , err_descr , sizeof (err_descr ));
321- fprintf (stderr , "set_user_and_group : setuid() error %i: %s\n" ,
322- error , err_descr );
325+ fprintf (stderr , "%s : setuid() error %i: %s\n" ,
326+ __FUNCTION__ , error , err_descr );
323327 return (error );
324328 }
325329
0 commit comments