Fix broken PSID problem on cygheap in account handling

* pwdgrp.h: Add comment to explain below change.
        (struct pg_pwd): Convert sid member to BYTE array.
        (struct pg_grp): Ditto.
        * grp.cc (pwdgrp::parse_group): Accommodate above change.
        * passwd.cc (pwdgrp::parse_passwd): Ditto.

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
Corinna Vinschen 2015-04-17 11:56:15 +02:00
parent 023be4aedb
commit 83b3f891c4
4 changed files with 20 additions and 4 deletions

View File

@ -1,3 +1,11 @@
2015-04-17 Corinna Vinschen <corinna@vinschen.de>
* pwdgrp.h: Add comment to explain below change.
(struct pg_pwd): Convert sid member to BYTE array.
(struct pg_grp): Ditto.
* grp.cc (pwdgrp::parse_group): Accommodate above change.
* passwd.cc (pwdgrp::parse_passwd): Ditto.
2015-04-12 Corinna Vinschen <corinna@vinschen.de>
* shm.cc (shmget): Fetch segment size from server rather than using

View File

@ -47,7 +47,9 @@ pwdgrp::parse_group ()
return false;
/* Don't generate gr_mem entries. */
grp.g.gr_mem = &null_ptr;
grp.sid.getfromgr_passwd (&grp.g);
cygsid csid;
csid.getfromgr_passwd (&grp.g);
RtlCopySid (SECURITY_MAX_SID_SIZE, grp.sid, csid);
return true;
}

View File

@ -40,7 +40,9 @@ pwdgrp::parse_passwd ()
res.p.pw_gecos = next_str (':');
res.p.pw_dir = next_str (':');
res.p.pw_shell = next_str (':');
res.sid.getfrompw_gecos (&res.p);
cygsid csid;
csid.getfrompw_gecos (&res.p);
RtlCopySid (SECURITY_MAX_SID_SIZE, res.sid, csid);
/* lptr points to the \0 after pw_shell. Increment by one to get the correct
required buffer len in getpw_cp. */
res.len = lptr - res.p.pw_name + 1;

View File

@ -38,17 +38,21 @@ void *setgrent_filtered (int enums, PCWSTR enum_tdoms);
void *getgrent_filtered (void *gr);
void endgrent_filtered (void *gr);
/* NOTE: The below sid members were cygsid's originally. Don't do that.
cygsid's are pointer based. When adding new entries to the passwd or
group caches, a crealloc call potenitally moves the entries and then
the cygsid pointers point into neverneverland. */
struct pg_pwd
{
struct passwd p;
cygsid sid;
BYTE sid[SECURITY_MAX_SID_SIZE];
size_t len;
};
struct pg_grp
{
struct group g;
cygsid sid;
BYTE sid[SECURITY_MAX_SID_SIZE];
size_t len;
};