* grp.cc (pwdgrp::parse_group): Set grp.len. Drop generating any
gr_mem entries. (getgrgid_r): Don't try to copy gr_mem entries. Always set gr_mem to an empty list. (getgrnam_r): Ditto. (app_gr): New static struct to store group data propagated to the calling application via getgrgid/getgrnam. (getgr_cp): Fill app_gr and return pointer to app_gr.g. (getgrgid32): Call getgr_cp. (getgrnam32): Ditto. * passwd.cc (pwdgrp::parse_passwd): Set res.len. (app_pw): New static struct to store passwd data propagated to the calling application via getpwuid/getpwnam. (getpw_cp): Fill app_pw and return pointer to app_pw.p. (getpwuid32): Cal getpw_cp. (getpwnam): Ditto. * pwdgrp.h (struct pg_pwd): Add len member. (struct pg_grp): Ditto.
This commit is contained in:
parent
fc3a3524b2
commit
20de26ebf9
@ -1,3 +1,24 @@
|
|||||||
|
2014-05-07 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
|
* grp.cc (pwdgrp::parse_group): Set grp.len. Drop generating any
|
||||||
|
gr_mem entries.
|
||||||
|
(getgrgid_r): Don't try to copy gr_mem entries. Always set gr_mem
|
||||||
|
to an empty list.
|
||||||
|
(getgrnam_r): Ditto.
|
||||||
|
(app_gr): New static struct to store group data propagated to the
|
||||||
|
calling application via getgrgid/getgrnam.
|
||||||
|
(getgr_cp): Fill app_gr and return pointer to app_gr.g.
|
||||||
|
(getgrgid32): Call getgr_cp.
|
||||||
|
(getgrnam32): Ditto.
|
||||||
|
* passwd.cc (pwdgrp::parse_passwd): Set res.len.
|
||||||
|
(app_pw): New static struct to store passwd data propagated to the
|
||||||
|
calling application via getpwuid/getpwnam.
|
||||||
|
(getpw_cp): Fill app_pw and return pointer to app_pw.p.
|
||||||
|
(getpwuid32): Cal getpw_cp.
|
||||||
|
(getpwnam): Ditto.
|
||||||
|
* pwdgrp.h (struct pg_pwd): Add len member.
|
||||||
|
(struct pg_grp): Ditto.
|
||||||
|
|
||||||
2014-05-06 Corinna Vinschen <corinna@vinschen.de>
|
2014-05-06 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
* security.h (MAX_SUBAUTH_CNT): Drop. Use SID_MAX_SUB_AUTHORITIES
|
* security.h (MAX_SUBAUTH_CNT): Drop. Use SID_MAX_SUB_AUTHORITIES
|
||||||
|
@ -38,23 +38,14 @@ pwdgrp::parse_group ()
|
|||||||
if (!*grp.g.gr_name)
|
if (!*grp.g.gr_name)
|
||||||
return false;
|
return false;
|
||||||
grp.g.gr_passwd = next_str (':');
|
grp.g.gr_passwd = next_str (':');
|
||||||
|
/* Note that lptr points to the first byte of the gr_gid field.
|
||||||
|
We deliberately ignore the gr_gid and gr_mem entries when copying
|
||||||
|
the buffer content since they are not referenced anymore. */
|
||||||
|
grp.len = lptr - grp.g.gr_name;
|
||||||
if (!next_num (grp.g.gr_gid))
|
if (!next_num (grp.g.gr_gid))
|
||||||
return false;
|
return false;
|
||||||
int n;
|
/* Don't generate gr_mem entries. */
|
||||||
char *dp = raw_ptr ();
|
|
||||||
for (n = 0; *next_str (','); n++)
|
|
||||||
continue;
|
|
||||||
grp.g.gr_mem = &null_ptr;
|
grp.g.gr_mem = &null_ptr;
|
||||||
if (n)
|
|
||||||
{
|
|
||||||
char **namearray = (char **) ccalloc (HEAP_BUF, n + 1, sizeof (char *));
|
|
||||||
if (namearray)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < n; i++, dp = strchr (dp, '\0') + 1)
|
|
||||||
namearray[i] = dp;
|
|
||||||
grp.g.gr_mem = namearray;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
grp.sid.getfromgr (&grp.g);
|
grp.sid.getfromgr (&grp.g);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -228,32 +219,60 @@ getgrgid_r (gid_t gid, struct group *grp, char *buffer, size_t bufsize,
|
|||||||
if (!tempgr)
|
if (!tempgr)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* check needed buffer size. */
|
/* Check needed buffer size. Deliberately ignore gr_mem. */
|
||||||
int i;
|
|
||||||
size_t needsize = strlen (tempgr->gr_name) + strlen (tempgr->gr_passwd)
|
size_t needsize = strlen (tempgr->gr_name) + strlen (tempgr->gr_passwd)
|
||||||
+ 2 + sizeof (char *);
|
+ 2 + sizeof (char *);
|
||||||
for (i = 0; tempgr->gr_mem[i]; ++i)
|
|
||||||
needsize += strlen (tempgr->gr_mem[i]) + 1 + sizeof (char *);
|
|
||||||
if (needsize > bufsize)
|
if (needsize > bufsize)
|
||||||
return ERANGE;
|
return ERANGE;
|
||||||
|
|
||||||
/* make a copy of tempgr */
|
/* Make a copy of tempgr. Deliberately ignore gr_mem. */
|
||||||
*result = grp;
|
*result = grp;
|
||||||
grp->gr_gid = tempgr->gr_gid;
|
grp->gr_gid = tempgr->gr_gid;
|
||||||
buffer = stpcpy (grp->gr_name = buffer, tempgr->gr_name);
|
buffer = stpcpy (grp->gr_name = buffer, tempgr->gr_name);
|
||||||
buffer = stpcpy (grp->gr_passwd = buffer + 1, tempgr->gr_passwd);
|
buffer = stpcpy (grp->gr_passwd = buffer + 1, tempgr->gr_passwd);
|
||||||
grp->gr_mem = (char **) (buffer + 1);
|
grp->gr_mem = (char **) (buffer + 1);
|
||||||
buffer = (char *) grp->gr_mem + (i + 1) * sizeof (char *);
|
grp->gr_mem[0] = NULL;
|
||||||
for (i = 0; tempgr->gr_mem[i]; ++i)
|
|
||||||
buffer = stpcpy (grp->gr_mem[i] = buffer, tempgr->gr_mem[i]) + 1;
|
|
||||||
grp->gr_mem[i] = NULL;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* getgrgid/getgrnam are not reentrant. */
|
||||||
|
static struct {
|
||||||
|
struct group g;
|
||||||
|
char *buf;
|
||||||
|
size_t bufsiz;
|
||||||
|
} app_gr;
|
||||||
|
|
||||||
|
static struct group *
|
||||||
|
getgr_cp (struct group *tempgr)
|
||||||
|
{
|
||||||
|
if (!tempgr)
|
||||||
|
return NULL;
|
||||||
|
pg_grp *gr = (pg_grp *) tempgr;
|
||||||
|
if (app_gr.bufsiz < gr->len)
|
||||||
|
{
|
||||||
|
char *newbuf = (char *) realloc (app_gr.buf, gr->len);
|
||||||
|
if (!newbuf)
|
||||||
|
{
|
||||||
|
set_errno (ENOMEM);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
app_gr.buf = newbuf;
|
||||||
|
app_gr.bufsiz = gr->len;
|
||||||
|
}
|
||||||
|
memcpy (app_gr.buf, gr->g.gr_name, gr->len);
|
||||||
|
memcpy (&app_gr.g, &gr->g, sizeof gr->g);
|
||||||
|
ptrdiff_t diff = app_gr.buf - gr->g.gr_name;
|
||||||
|
app_gr.g.gr_name += diff;
|
||||||
|
app_gr.g.gr_passwd += diff;
|
||||||
|
return &app_gr.g;
|
||||||
|
}
|
||||||
|
|
||||||
extern "C" struct group *
|
extern "C" struct group *
|
||||||
getgrgid32 (gid_t gid)
|
getgrgid32 (gid_t gid)
|
||||||
{
|
{
|
||||||
return internal_getgrgid (gid);
|
struct group *tempgr = internal_getgrgid (gid);
|
||||||
|
pthread_testcancel ();
|
||||||
|
return getgr_cp (tempgr);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __x86_64__
|
#ifdef __x86_64__
|
||||||
@ -282,32 +301,28 @@ getgrnam_r (const char *nam, struct group *grp, char *buffer,
|
|||||||
if (!tempgr)
|
if (!tempgr)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* check needed buffer size. */
|
/* Check needed buffer size. Deliberately ignore gr_mem. */
|
||||||
int i;
|
|
||||||
size_t needsize = strlen (tempgr->gr_name) + strlen (tempgr->gr_passwd)
|
size_t needsize = strlen (tempgr->gr_name) + strlen (tempgr->gr_passwd)
|
||||||
+ 2 + sizeof (char *);
|
+ 2 + sizeof (char *);
|
||||||
for (i = 0; tempgr->gr_mem[i]; ++i)
|
|
||||||
needsize += strlen (tempgr->gr_mem[i]) + 1 + sizeof (char *);
|
|
||||||
if (needsize > bufsize)
|
if (needsize > bufsize)
|
||||||
return ERANGE;
|
return ERANGE;
|
||||||
|
|
||||||
/* make a copy of tempgr */
|
/* Make a copy of tempgr. Deliberately ignore gr_mem. */
|
||||||
*result = grp;
|
*result = grp;
|
||||||
grp->gr_gid = tempgr->gr_gid;
|
grp->gr_gid = tempgr->gr_gid;
|
||||||
buffer = stpcpy (grp->gr_name = buffer, tempgr->gr_name);
|
buffer = stpcpy (grp->gr_name = buffer, tempgr->gr_name);
|
||||||
buffer = stpcpy (grp->gr_passwd = buffer + 1, tempgr->gr_passwd);
|
buffer = stpcpy (grp->gr_passwd = buffer + 1, tempgr->gr_passwd);
|
||||||
grp->gr_mem = (char **) (buffer + 1);
|
grp->gr_mem = (char **) (buffer + 1);
|
||||||
buffer = (char *) grp->gr_mem + (i + 1) * sizeof (char *);
|
grp->gr_mem[0] = NULL;
|
||||||
for (i = 0; tempgr->gr_mem[i]; ++i)
|
|
||||||
buffer = stpcpy (grp->gr_mem[i] = buffer, tempgr->gr_mem[i]) + 1;
|
|
||||||
grp->gr_mem[i] = NULL;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" struct group *
|
extern "C" struct group *
|
||||||
getgrnam32 (const char *name)
|
getgrnam32 (const char *name)
|
||||||
{
|
{
|
||||||
return internal_getgrnam (name);
|
struct group *tempgr = internal_getgrnam (name);
|
||||||
|
pthread_testcancel ();
|
||||||
|
return getgr_cp (tempgr);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __x86_64__
|
#ifdef __x86_64__
|
||||||
|
@ -41,6 +41,7 @@ pwdgrp::parse_passwd ()
|
|||||||
res.p.pw_dir = next_str (':');
|
res.p.pw_dir = next_str (':');
|
||||||
res.p.pw_shell = next_str (':');
|
res.p.pw_shell = next_str (':');
|
||||||
res.sid.getfrompw (&res.p);
|
res.sid.getfrompw (&res.p);
|
||||||
|
res.len = lptr - res.p.pw_name;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -180,12 +181,47 @@ internal_getpwuid (uid_t uid, cyg_ldap *pldap)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* getpwuid/getpwnam are not reentrant. */
|
||||||
|
static struct {
|
||||||
|
struct passwd p;
|
||||||
|
char *buf;
|
||||||
|
size_t bufsiz;
|
||||||
|
} app_pw;
|
||||||
|
|
||||||
|
static struct passwd *
|
||||||
|
getpw_cp (struct passwd *temppw)
|
||||||
|
{
|
||||||
|
if (!temppw)
|
||||||
|
return NULL;
|
||||||
|
pg_pwd *pw = (pg_pwd *) temppw;
|
||||||
|
if (app_pw.bufsiz < pw->len)
|
||||||
|
{
|
||||||
|
char *newbuf = (char *) realloc (app_pw.buf, pw->len);
|
||||||
|
if (!newbuf)
|
||||||
|
{
|
||||||
|
set_errno (ENOMEM);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
app_pw.buf = newbuf;
|
||||||
|
app_pw.bufsiz = pw->len;
|
||||||
|
}
|
||||||
|
memcpy (app_pw.buf, pw->p.pw_name, pw->len);
|
||||||
|
memcpy (&app_pw.p, &pw->p, sizeof pw->p);
|
||||||
|
ptrdiff_t diff = app_pw.buf - pw->p.pw_name;
|
||||||
|
app_pw.p.pw_name += diff;
|
||||||
|
app_pw.p.pw_passwd += diff;
|
||||||
|
app_pw.p.pw_gecos += diff;
|
||||||
|
app_pw.p.pw_dir += diff;
|
||||||
|
app_pw.p.pw_shell += diff;
|
||||||
|
return &app_pw.p;
|
||||||
|
}
|
||||||
|
|
||||||
extern "C" struct passwd *
|
extern "C" struct passwd *
|
||||||
getpwuid32 (uid_t uid)
|
getpwuid32 (uid_t uid)
|
||||||
{
|
{
|
||||||
struct passwd *temppw = internal_getpwuid (uid);
|
struct passwd *temppw = internal_getpwuid (uid);
|
||||||
pthread_testcancel ();
|
pthread_testcancel ();
|
||||||
return temppw;
|
return getpw_cp (temppw);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __x86_64__
|
#ifdef __x86_64__
|
||||||
@ -246,7 +282,7 @@ getpwnam (const char *name)
|
|||||||
{
|
{
|
||||||
struct passwd *temppw = internal_getpwnam (name);
|
struct passwd *temppw = internal_getpwnam (name);
|
||||||
pthread_testcancel ();
|
pthread_testcancel ();
|
||||||
return temppw;
|
return getpw_cp (temppw);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -59,12 +59,14 @@ struct pg_pwd
|
|||||||
{
|
{
|
||||||
struct passwd p;
|
struct passwd p;
|
||||||
cygsid sid;
|
cygsid sid;
|
||||||
|
size_t len;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct pg_grp
|
struct pg_grp
|
||||||
{
|
{
|
||||||
struct group g;
|
struct group g;
|
||||||
cygsid sid;
|
cygsid sid;
|
||||||
|
size_t len;
|
||||||
};
|
};
|
||||||
|
|
||||||
class pwdgrp
|
class pwdgrp
|
||||||
|
Loading…
x
Reference in New Issue
Block a user