liblxc: Add username and uid lookup/check.
PATCH 1/1 liblxc: Add username and uid lookup/check.
Add the ability to lookup usernames and check uids. Bails out early if the given uid/name does not exist and avoids using atoi() (which is bad because we can't tell if it parsed an int or a pumpkin).
Signed-off-by Matt Helsley <matthltc-r/[email protected]>
---
Also gets rid of a bogus "maybe used uninitialized" warning.
src/lxc/lxc_unshare.c | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-)
src/lxc/lxc_unshare.c +30 -2
@@ -30,6 +30,7 @@#include <errno.h> #include <sys/types.h> #include <sys/wait.h> +#include <pwd.h> #include "lxc_namespace.h"
@@ -48,12 +49,37 @@ void usage(char *cmd)_exit (1 ); } +static uid_t lookup_user (const char *optarg) +{ +char name[sysconf (_SC_LOGIN_NAME_MAX)]; +uid_t uid =-1 ; + +if (!optarg || (optarg[0 ] =='\0' )) +return uid; +if (sscanf (optarg,"%u" , &uid) <1 ) { +struct passwd pwent;/* not a uid -- perhaps a username */ +struct passwd *pent; + +if (sscanf (optarg,"%s" , name) <1 ) +return uid; +if (getpwnam_r (name, &pwent,NULL ,0 , &pent) || !pent) +return uid; + uid = pent->pw_uid; + }else { +if (getpwuid_r (uid,NULL ,NULL ,0 ,NULL )) { + uid =-1 ; +return uid; + } + } +return uid; +} +int main (int argc,char *argv[]) {int opt, nbargs =0 , status =1 , hastofork =0 ;char **args;long flags =0 ; -uid_t uid =0 ; +uid_t uid =-1 ;/* valid only if (flags & CLONE_NEWUSER) */ pid_t pid;while ((opt =getopt (argc, argv,"fmphiu:n" )) !=-1 ) {
@@ -71,8 +97,10 @@ int main(int argc, char *argv[]) flags |=CLONE_NEWIPC ;break ;case 'u' : + uid =lookup_user (optarg); +if (uid ==-1 ) +break ; flags |=CLONE_NEWUSER ; - uid =atoi (optarg);break ;case 'n' : flags |=CLONE_NEWNET ;
A message that is not in the archive (sent off-list or not yet received): 20090226042157.GC11052-r/[email protected]
Daniel Lezcano
AppliedQuoted 6 lines · Matt Helsley
Add the ability to lookup usernames and check uids. Bails out early if the given uid/name does not exist and avoids using
atoi()(which is bad because we can't tell if it parsed an int or a pumpkin).Signed-off-by Matt Helsley <matthltc-r/[email protected]>
Applied. Fixed a space before a tabulation.