mirror of
https://github.com/sheumann/hush.git
synced 2024-12-26 10:32:02 +00:00
bb_getpwuid, bb_getgrgid: change order of arguments to more intuitive one;
comment thoroughly when they die and when they dont.
This commit is contained in:
parent
661f6fad77
commit
3734b946bf
@ -20,13 +20,13 @@
|
||||
#define JUST_USER 4
|
||||
#define JUST_GROUP 8
|
||||
#if ENABLE_SELINUX
|
||||
#define JUST_CONTEXT 16
|
||||
#define JUST_CONTEXT 16
|
||||
#endif
|
||||
|
||||
static short printf_full(unsigned int id, const char *arg, const char prefix)
|
||||
static int printf_full(unsigned int id, const char *arg, const char prefix)
|
||||
{
|
||||
const char *fmt = "%cid=%u";
|
||||
short status = EXIT_FAILURE;
|
||||
int status = EXIT_FAILURE;
|
||||
|
||||
if (arg) {
|
||||
fmt = "%cid=%u(%s)";
|
||||
@ -71,8 +71,8 @@ int id_main(int argc, char **argv)
|
||||
if (flags & (JUST_GROUP | JUST_USER USE_SELINUX(| JUST_CONTEXT))) {
|
||||
/* JUST_GROUP and JUST_USER are mutually exclusive */
|
||||
if (flags & NAME_NOT_NUMBER) {
|
||||
/* bb_getpwuid and bb_getgrgid exit on failure so puts cannot segfault */
|
||||
puts((flags & JUST_USER) ? bb_getpwuid(NULL, uid, -1 ) : bb_getgrgid(NULL, gid, -1 ));
|
||||
/* bb_getXXXid(-1) exit on failure, puts cannot segfault */
|
||||
puts((flags & JUST_USER) ? bb_getpwuid(NULL, -1, uid) : bb_getgrgid(NULL, -1, gid));
|
||||
} else {
|
||||
if (flags & JUST_USER) {
|
||||
printf("%u\n", uid);
|
||||
@ -100,11 +100,10 @@ int id_main(int argc, char **argv)
|
||||
}
|
||||
|
||||
/* Print full info like GNU id */
|
||||
/* bb_getpwuid doesn't exit on failure here */
|
||||
status = printf_full(uid, bb_getpwuid(NULL, uid, 0), 'u');
|
||||
/* bb_getpwuid(0) doesn't exit on failure (returns NULL) */
|
||||
status = printf_full(uid, bb_getpwuid(NULL, 0, uid), 'u');
|
||||
putchar(' ');
|
||||
/* bb_getgrgid doesn't exit on failure here */
|
||||
status |= printf_full(gid, bb_getgrgid(NULL, gid, 0), 'g');
|
||||
status |= printf_full(gid, bb_getgrgid(NULL, 0, gid), 'g');
|
||||
|
||||
#if ENABLE_SELINUX
|
||||
if (is_selinux_enabled()) {
|
||||
|
@ -19,7 +19,8 @@ int whoami_main(int argc, char **argv)
|
||||
if (argc > 1)
|
||||
bb_show_usage();
|
||||
|
||||
puts(bb_getpwuid(NULL, geteuid(), -1));
|
||||
/* Will complain and die if username not found */
|
||||
puts(bb_getpwuid(NULL, -1, geteuid()));
|
||||
|
||||
return fflush(stdout);
|
||||
}
|
||||
|
@ -481,10 +481,14 @@ struct bb_uidgid_t {
|
||||
int get_uidgid(struct bb_uidgid_t*, const char*, int numeric_ok);
|
||||
/* chown-like handling of "user[:[group]" */
|
||||
void parse_chown_usergroup_or_die(struct bb_uidgid_t *u, char *user_group);
|
||||
/* what is this? */
|
||||
/*extern char *bb_getug(char *buffer, char *idname, long id, int bufsize, char prefix);*/
|
||||
char *bb_getpwuid(char *name, long uid, int bufsize);
|
||||
char *bb_getgrgid(char *group, long gid, int bufsize);
|
||||
/* bb_getpwuid, bb_getgrgid:
|
||||
bb_getXXXid(buf, bufsz, id) - copy user/group name or id
|
||||
as a string to buf, return user/group name or NULL
|
||||
bb_getXXXid(NULL, 0, id) - return user/group name or NULL
|
||||
bb_getXXXid(NULL, -1, id) - return user/group name or exit
|
||||
*/
|
||||
char *bb_getpwuid(char *name, int bufsize, long uid);
|
||||
char *bb_getgrgid(char *group, int bufsize, long gid);
|
||||
/* versions which cache results (useful for ps, ls etc) */
|
||||
const char* get_cached_username(uid_t uid);
|
||||
const char* get_cached_groupname(gid_t gid);
|
||||
@ -596,6 +600,7 @@ extern const char *opt_complementary;
|
||||
extern const char *applet_long_options;
|
||||
#endif
|
||||
extern uint32_t option_mask32;
|
||||
/* TODO: don't pass argc, determine it by looking at argv */
|
||||
extern uint32_t getopt32(int argc, char **argv, const char *applet_opts, ...);
|
||||
|
||||
|
||||
|
@ -11,22 +11,20 @@
|
||||
|
||||
#define assert(x) ((void)0)
|
||||
|
||||
/*
|
||||
* if bufsize is > 0 char *buffer cannot be set to NULL.
|
||||
* If idname is not NULL it is written on the static
|
||||
* allocated buffer (and a pointer to it is returned).
|
||||
* if idname is NULL, id as string is written to the static
|
||||
* allocated buffer and NULL is returned.
|
||||
* if bufsize is = 0 char *buffer can be set to NULL.
|
||||
* If idname exists a pointer to it is returned,
|
||||
* else NULL is returned.
|
||||
* if bufsize is < 0 char *buffer can be set to NULL.
|
||||
* If idname exists a pointer to it is returned,
|
||||
* else an error message is printed and the program exits.
|
||||
*/
|
||||
|
||||
/* internal function for bb_getpwuid and bb_getgrgid */
|
||||
static char* bb_getug(char *buffer, char *idname, long id, int bufsize, char prefix)
|
||||
/* Hacked by Tito Ragusa (c) 2004 <farmatito@tiscali.it> to make it more
|
||||
* flexible:
|
||||
*
|
||||
* bufsize > 0: If idname is not NULL it is copied to buffer,
|
||||
* and buffer is returned. Else id as string is written
|
||||
* to buffer, and NULL is returned.
|
||||
*
|
||||
* bufsize == 0: idname is returned.
|
||||
*
|
||||
* bufsize < 0: If idname is not NULL it is returned.
|
||||
* Else an error message is printed and the program exits.
|
||||
*/
|
||||
static char* bb_getug(char *buffer, int bufsize, char *idname, long id, char prefix)
|
||||
{
|
||||
if (bufsize > 0) {
|
||||
assert(buffer != NULL);
|
||||
@ -40,31 +38,29 @@ static char* bb_getug(char *buffer, char *idname, long id, int bufsize, char pre
|
||||
return idname;
|
||||
}
|
||||
|
||||
/* Hacked by Tito Ragusa (c) 2004 <farmatito@tiscali.it> to make it more
|
||||
* flexible :
|
||||
*
|
||||
* if bufsize is > 0 char *group cannot be set to NULL.
|
||||
* On success groupname is written on static allocated buffer
|
||||
* group (and a pointer to it is returned).
|
||||
* On failure gid as string is written to static allocated
|
||||
* buffer group and NULL is returned.
|
||||
* if bufsize is = 0 char *group can be set to NULL.
|
||||
* On success groupname is returned.
|
||||
* On failure NULL is returned.
|
||||
* if bufsize is < 0 char *group can be set to NULL.
|
||||
* On success groupname is returned.
|
||||
* On failure an error message is printed and
|
||||
* the program exits.
|
||||
/* bb_getpwuid, bb_getgrgid:
|
||||
* bb_getXXXid(buf, bufsz, id) - copy user/group name or id
|
||||
* as a string to buf, return user/group name or NULL
|
||||
* bb_getXXXid(NULL, 0, id) - return user/group name or NULL
|
||||
* bb_getXXXid(NULL, -1, id) - return user/group name or exit
|
||||
*/
|
||||
/* gets a username given a uid */
|
||||
char* bb_getpwuid(char *name, int bufsize, long uid)
|
||||
{
|
||||
struct passwd *myuser = getpwuid(uid);
|
||||
|
||||
return bb_getug(name, bufsize,
|
||||
(myuser ? myuser->pw_name : (char*)myuser),
|
||||
uid, 'u');
|
||||
}
|
||||
/* gets a groupname given a gid */
|
||||
char* bb_getgrgid(char *group, long gid, int bufsize)
|
||||
char* bb_getgrgid(char *group, int bufsize, long gid)
|
||||
{
|
||||
struct group *mygroup = getgrgid(gid);
|
||||
|
||||
return bb_getug(group,
|
||||
mygroup ? mygroup->gr_name : (char *)mygroup,
|
||||
gid, bufsize, 'g');
|
||||
return bb_getug(group, bufsize,
|
||||
(mygroup ? mygroup->gr_name : (char*)mygroup),
|
||||
gid, 'g');
|
||||
}
|
||||
|
||||
/* returns a gid given a group name */
|
||||
@ -91,32 +87,6 @@ long xuname2uid(const char *name)
|
||||
return myuser->pw_uid;
|
||||
}
|
||||
|
||||
/* Hacked by Tito Ragusa (c) 2004 <farmatito@tiscali.it> to make it more
|
||||
* flexible :
|
||||
*
|
||||
* if bufsize is > 0 char *name cannot be set to NULL.
|
||||
* On success username is written on the static allocated
|
||||
* buffer name (and a pointer to it is returned).
|
||||
* On failure uid as string is written to the static
|
||||
* allocated buffer name and NULL is returned.
|
||||
* if bufsize is = 0 char *name can be set to NULL.
|
||||
* On success username is returned.
|
||||
* On failure NULL is returned.
|
||||
* if bufsize is < 0 char *name can be set to NULL
|
||||
* On success username is returned.
|
||||
* On failure an error message is printed and
|
||||
* the program exits.
|
||||
*/
|
||||
|
||||
/* gets a username given a uid */
|
||||
char* bb_getpwuid(char *name, long uid, int bufsize)
|
||||
{
|
||||
struct passwd *myuser = getpwuid(uid);
|
||||
|
||||
return bb_getug(name, myuser ? myuser->pw_name : (char *)myuser,
|
||||
uid, bufsize, 'u');
|
||||
}
|
||||
|
||||
unsigned long get_ug_id(const char *s,
|
||||
long (*xname2id)(const char *))
|
||||
{
|
||||
|
@ -52,7 +52,7 @@ static int get_cached(cache_t *cp, unsigned id)
|
||||
}
|
||||
#endif
|
||||
|
||||
typedef char* ug_func(char *name, long uid, int bufsize);
|
||||
typedef char* ug_func(char *name, int bufsize, long uid);
|
||||
static char* get_cached(cache_t *cp, unsigned id, ug_func* fp)
|
||||
{
|
||||
int i;
|
||||
@ -62,7 +62,8 @@ static char* get_cached(cache_t *cp, unsigned id, ug_func* fp)
|
||||
i = cp->size++;
|
||||
cp->cache = xrealloc(cp->cache, cp->size * sizeof(*cp->cache));
|
||||
cp->cache[i].id = id;
|
||||
fp(cp->cache[i].name, id, sizeof(cp->cache[i].name));
|
||||
/* Never fails. Generates numeric string if name isn't found */
|
||||
fp(cp->cache[i].name, sizeof(cp->cache[i].name), id);
|
||||
return cp->cache[i].name;
|
||||
}
|
||||
const char* get_cached_username(uid_t uid)
|
||||
|
@ -51,13 +51,13 @@ static char* new_password(const struct passwd *pw, uid_t myuid, int algo)
|
||||
goto err_ret;
|
||||
}
|
||||
|
||||
/*memset(salt, 0, sizeof(salt)); - why?*/
|
||||
crypt_make_salt(salt, 1, 0); /* des */
|
||||
if (algo) { /* MD5 */
|
||||
strcpy(salt, "$1$");
|
||||
crypt_make_salt(salt + 3, 4, 0);
|
||||
}
|
||||
ret = xstrdup(pw_encrypt(newp, salt)); /* returns ptr to static */
|
||||
/* pw_encrypt returns ptr to static */
|
||||
ret = xstrdup(pw_encrypt(newp, salt));
|
||||
/* whee, success! */
|
||||
|
||||
err_ret:
|
||||
@ -80,7 +80,7 @@ int passwd_main(int argc, char **argv)
|
||||
OPT_delete = 0x8, /* -d - delete password */
|
||||
OPT_lud = 0xe,
|
||||
STATE_ALGO_md5 = 0x10,
|
||||
/*STATE_ALGO_des = 0x20, not needed yet */
|
||||
//STATE_ALGO_des = 0x20, not needed yet
|
||||
};
|
||||
unsigned opt;
|
||||
int rc;
|
||||
@ -104,7 +104,7 @@ int passwd_main(int argc, char **argv)
|
||||
logmode = LOGMODE_BOTH;
|
||||
openlog(applet_name, LOG_NOWAIT, LOG_AUTH);
|
||||
opt = getopt32(argc, argv, "a:lud", &opt_a);
|
||||
argc -= optind;
|
||||
//argc -= optind;
|
||||
argv += optind;
|
||||
|
||||
if (strcasecmp(opt_a, "des") != 0) /* -a */
|
||||
@ -112,11 +112,13 @@ int passwd_main(int argc, char **argv)
|
||||
//else
|
||||
// opt |= STATE_ALGO_des;
|
||||
myuid = getuid();
|
||||
if ((opt & OPT_lud) && (!argc || myuid))
|
||||
/* -l, -u, -d require root priv and username argument */
|
||||
if ((opt & OPT_lud) && (myuid || !argv[0]))
|
||||
bb_show_usage();
|
||||
|
||||
myname = xstrdup(bb_getpwuid(NULL, myuid, -1));
|
||||
name = argc ? argv[0] : myname;
|
||||
/* Will complain and die if username not found */
|
||||
myname = xstrdup(bb_getpwuid(NULL, -1, myuid));
|
||||
name = argv[0] ? argv[0] : myname;
|
||||
|
||||
pw = getpwnam(name);
|
||||
if (!pw) bb_error_msg_and_die("unknown user %s", name);
|
||||
@ -158,9 +160,12 @@ int passwd_main(int argc, char **argv)
|
||||
newp = xasprintf("!%s", pw->pw_passwd);
|
||||
} else if (opt & OPT_unlock) {
|
||||
if (c) goto skip; /* not '!' */
|
||||
/* pw->pw_passwd pints to static storage,
|
||||
* strdup'ing to avoid nasty surprizes */
|
||||
newp = xstrdup(&pw->pw_passwd[1]);
|
||||
} else if (opt & OPT_delete) {
|
||||
newp = xstrdup("");
|
||||
//newp = xstrdup("");
|
||||
newp = (char*)"";
|
||||
}
|
||||
|
||||
rlimit_fsize.rlim_cur = rlimit_fsize.rlim_max = 512L * 30000;
|
||||
@ -177,8 +182,8 @@ int passwd_main(int argc, char **argv)
|
||||
filename);
|
||||
bb_info_msg("Password for %s changed by %s", name, myname);
|
||||
|
||||
if (ENABLE_FEATURE_CLEAN_UP) free(newp);
|
||||
skip:
|
||||
//if (ENABLE_FEATURE_CLEAN_UP) free(newp);
|
||||
skip:
|
||||
if (!newp) {
|
||||
bb_error_msg_and_die("password for %s is already %slocked",
|
||||
name, (opt & OPT_unlock) ? "un" : "");
|
||||
|
@ -89,7 +89,7 @@ int logger_main(int argc, char **argv)
|
||||
char name[80];
|
||||
|
||||
/* Fill out the name string early (may be overwritten later) */
|
||||
bb_getpwuid(name, geteuid(), sizeof(name));
|
||||
bb_getpwuid(name, sizeof(name), geteuid());
|
||||
str_t = name;
|
||||
|
||||
/* Parse any options */
|
||||
|
Loading…
Reference in New Issue
Block a user