Use macros where possible for sudo_grdup() like sudo_pwdup().
This commit is contained in:
84
pwutil.c
84
pwutil.c
@@ -113,19 +113,19 @@ cmp_pwnam(v1, v2)
|
|||||||
return(strcmp(pw1->pw_name, pw2->pw_name));
|
return(strcmp(pw1->pw_name, pw2->pw_name));
|
||||||
}
|
}
|
||||||
|
|
||||||
#define PW_SIZE(name, size) \
|
#define FIELD_SIZE(src, name, size) \
|
||||||
do { \
|
do { \
|
||||||
if (pw->name) { \
|
if (src->name) { \
|
||||||
size = strlen(pw->name) + 1; \
|
size = strlen(src->name) + 1; \
|
||||||
total += size; \
|
total += size; \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define PW_COPY(name, size) \
|
#define FIELD_COPY(src, dst, name, size) \
|
||||||
do { \
|
do { \
|
||||||
if (pw->name) { \
|
if (src->name) { \
|
||||||
memcpy(cp, pw->name, size); \
|
memcpy(cp, src->name, size); \
|
||||||
newpw->name = cp; \
|
dst->name = cp; \
|
||||||
cp += size; \
|
cp += size; \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
@@ -150,14 +150,14 @@ sudo_pwdup(pw)
|
|||||||
/* Allocate in one big chunk for easy freeing. */
|
/* Allocate in one big chunk for easy freeing. */
|
||||||
nsize = psize = csize = gsize = dsize = ssize = 0;
|
nsize = psize = csize = gsize = dsize = ssize = 0;
|
||||||
total = sizeof(struct passwd);
|
total = sizeof(struct passwd);
|
||||||
PW_SIZE(pw_name, nsize);
|
FIELD_SIZE(pw, pw_name, nsize);
|
||||||
PW_SIZE(pw_passwd, psize);
|
FIELD_SIZE(pw, pw_passwd, psize);
|
||||||
#ifdef HAVE_LOGIN_CAP_H
|
#ifdef HAVE_LOGIN_CAP_H
|
||||||
PW_SIZE(pw_class, csize);
|
FIELD_SIZE(pw, pw_class, csize);
|
||||||
#endif
|
#endif
|
||||||
PW_SIZE(pw_gecos, gsize);
|
FIELD_SIZE(pw, pw_gecos, gsize);
|
||||||
PW_SIZE(pw_dir, dsize);
|
FIELD_SIZE(pw, pw_dir, dsize);
|
||||||
PW_SIZE(pw_shell, ssize);
|
FIELD_SIZE(pw, pw_shell, ssize);
|
||||||
|
|
||||||
if ((cp = malloc(total)) == NULL)
|
if ((cp = malloc(total)) == NULL)
|
||||||
return(NULL);
|
return(NULL);
|
||||||
@@ -169,14 +169,14 @@ sudo_pwdup(pw)
|
|||||||
*/
|
*/
|
||||||
memcpy(newpw, pw, sizeof(struct passwd));
|
memcpy(newpw, pw, sizeof(struct passwd));
|
||||||
cp += sizeof(struct passwd);
|
cp += sizeof(struct passwd);
|
||||||
PW_COPY(pw_name, nsize);
|
FIELD_COPY(pw, newpw, pw_name, nsize);
|
||||||
PW_COPY(pw_passwd, psize);
|
FIELD_COPY(pw, newpw, pw_passwd, psize);
|
||||||
#ifdef HAVE_LOGIN_CAP_H
|
#ifdef HAVE_LOGIN_CAP_H
|
||||||
PW_COPY(pw_class, csize);
|
FIELD_COPY(pw, newpw, pw_class, csize);
|
||||||
#endif
|
#endif
|
||||||
PW_COPY(pw_gecos, gsize);
|
FIELD_COPY(pw, newpw, pw_gecos, gsize);
|
||||||
PW_COPY(pw_dir, dsize);
|
FIELD_COPY(pw, newpw, pw_dir, dsize);
|
||||||
PW_COPY(pw_shell, ssize);
|
FIELD_COPY(pw, newpw, pw_shell, ssize);
|
||||||
|
|
||||||
return(newpw);
|
return(newpw);
|
||||||
}
|
}
|
||||||
@@ -398,25 +398,19 @@ sudo_grdup(gr)
|
|||||||
const struct group *gr;
|
const struct group *gr;
|
||||||
{
|
{
|
||||||
char *cp;
|
char *cp;
|
||||||
size_t nsize, psize, csize, num, total, len;
|
size_t nsize, psize, nmem, total, len;
|
||||||
struct group *newgr;
|
struct group *newgr;
|
||||||
|
|
||||||
/* Allocate in one big chunk for easy freeing. */
|
/* Allocate in one big chunk for easy freeing. */
|
||||||
nsize = psize = csize = num = 0;
|
nsize = psize = nmem = 0;
|
||||||
total = sizeof(struct group);
|
total = sizeof(struct group);
|
||||||
if (gr->gr_name) {
|
FIELD_SIZE(gr, gr_name, nsize);
|
||||||
nsize = strlen(gr->gr_name) + 1;
|
FIELD_SIZE(gr, gr_passwd, psize);
|
||||||
total += nsize;
|
|
||||||
}
|
|
||||||
if (gr->gr_passwd) {
|
|
||||||
psize = strlen(gr->gr_passwd) + 1;
|
|
||||||
total += psize;
|
|
||||||
}
|
|
||||||
if (gr->gr_mem) {
|
if (gr->gr_mem) {
|
||||||
for (num = 0; gr->gr_mem[num] != NULL; num++)
|
for (nmem = 0; gr->gr_mem[nmem] != NULL; nmem++)
|
||||||
total += strlen(gr->gr_mem[num]) + 1;
|
total += strlen(gr->gr_mem[nmem]) + 1;
|
||||||
num++;
|
nmem++;
|
||||||
total += sizeof(char *) * num;
|
total += sizeof(char *) * nmem;
|
||||||
}
|
}
|
||||||
if ((cp = malloc(total)) == NULL)
|
if ((cp = malloc(total)) == NULL)
|
||||||
return(NULL);
|
return(NULL);
|
||||||
@@ -428,26 +422,18 @@ sudo_grdup(gr)
|
|||||||
*/
|
*/
|
||||||
(void)memcpy(newgr, gr, sizeof(struct group));
|
(void)memcpy(newgr, gr, sizeof(struct group));
|
||||||
cp += sizeof(struct group);
|
cp += sizeof(struct group);
|
||||||
if (nsize) {
|
FIELD_COPY(gr, newgr, gr_name, nsize);
|
||||||
(void)memcpy(cp, gr->gr_name, nsize);
|
FIELD_COPY(gr, newgr, gr_passwd, psize);
|
||||||
newgr->gr_name = cp;
|
|
||||||
cp += nsize;
|
|
||||||
}
|
|
||||||
if (psize) {
|
|
||||||
(void)memcpy(cp, gr->gr_passwd, psize);
|
|
||||||
newgr->gr_passwd = cp;
|
|
||||||
cp += psize;
|
|
||||||
}
|
|
||||||
if (gr->gr_mem) {
|
if (gr->gr_mem) {
|
||||||
newgr->gr_mem = (char **)cp;
|
newgr->gr_mem = (char **)cp;
|
||||||
cp += sizeof(char *) * num;
|
cp += sizeof(char *) * nmem;
|
||||||
for (num = 0; gr->gr_mem[num] != NULL; num++) {
|
for (nmem = 0; gr->gr_mem[nmem] != NULL; nmem++) {
|
||||||
len = strlen(gr->gr_mem[num]) + 1;
|
len = strlen(gr->gr_mem[nmem]) + 1;
|
||||||
memcpy(cp, gr->gr_mem[num], len);
|
memcpy(cp, gr->gr_mem[nmem], len);
|
||||||
newgr->gr_mem[num] = cp;
|
newgr->gr_mem[nmem] = cp;
|
||||||
cp += len;
|
cp += len;
|
||||||
}
|
}
|
||||||
newgr->gr_mem[num] = NULL;
|
newgr->gr_mem[nmem] = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return(newgr);
|
return(newgr);
|
||||||
|
Reference in New Issue
Block a user