| delorie.com/archives/browse.cgi | search |
| X-Recipient: | archive-cygwin AT delorie DOT com |
| DomainKey-Signature: | a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id |
| :list-unsubscribe:list-subscribe:list-archive:list-post | |
| :list-help:sender:references:message-id:date:from:reply-to | |
| :subject:to:in-reply-to:mime-version:content-type | |
| :content-transfer-encoding; q=dns; s=default; b=syF4zF5ZJhZ0cGMx | |
| 3s7XySege/32sPA+OfeCk4idkF9DuTw8q3GCeOzYigBqNqpVc51qjZLdTGe1n1LF | |
| FRe8o5zpy79P8f2T31CGJD02p4H7VxYFJ60VPt5YjF/6suPfpwTs4jtmYIQdOmzy | |
| gEt50sYMaQe45Y+aJLvwqf/w76s= | |
| DKIM-Signature: | v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id |
| :list-unsubscribe:list-subscribe:list-archive:list-post | |
| :list-help:sender:references:message-id:date:from:reply-to | |
| :subject:to:in-reply-to:mime-version:content-type | |
| :content-transfer-encoding; s=default; bh=1XVpUUpCaMmWx3Cs3MjjNA | |
| muE0c=; b=UsysgpPZwSb6HdrG8pGeIM2zJVbesoLBJhziyo84JK9badagBmM8Je | |
| WHaVkgawyPw8e1ihTR0aq1OCKfOnBsa81J/z+f2O4h68riDUBvS+lTQd8x4NQ+cr | |
| X+A1ZTniulBUqePzIXBOLd+hus3Kp013QxFE6o0mWkEhs9DoG+zPU= | |
| Mailing-List: | contact cygwin-help AT cygwin DOT com; run by ezmlm |
| List-Id: | <cygwin.cygwin.com> |
| List-Subscribe: | <mailto:cygwin-subscribe AT cygwin DOT com> |
| List-Archive: | <http://sourceware.org/ml/cygwin/> |
| List-Post: | <mailto:cygwin AT cygwin DOT com> |
| List-Help: | <mailto:cygwin-help AT cygwin DOT com>, <http://sourceware.org/ml/#faqs> |
| Sender: | cygwin-owner AT cygwin DOT com |
| Mail-Followup-To: | cygwin AT cygwin DOT com |
| Delivered-To: | mailing list cygwin AT cygwin DOT com |
| Authentication-Results: | sourceware.org; auth=none |
| X-Virus-Found: | No |
| X-Spam-SWARE-Status: | No, score=0.7 required=5.0 tests=AWL,BAYES_00,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,FREEMAIL_REPLYTO_END_DIGIT,RCVD_IN_DNSWL_NONE,RP_MATCHES_RCVD,SPF_PASS autolearn=no version=3.3.2 |
| X-HELO: | nm34-vm5.bullet.mail.bf1.yahoo.com |
| References: | <1397248059 DOT 12764 DOT YahooMailNeo AT web140001 DOT mail DOT bf1 DOT yahoo DOT com> |
| Message-ID: | <1397248902.21653.YahooMailNeo@web140004.mail.bf1.yahoo.com> |
| Date: | Fri, 11 Apr 2014 13:41:42 -0700 (PDT) |
| From: | q q <miska0000 AT yahoo DOT com> |
| Reply-To: | q q <miska0000 AT yahoo DOT com> |
| Subject: | Two problems getting user and group info from /etc/{passwd,group} |
| To: | "cygwin AT cygwin DOT com" <cygwin AT cygwin DOT com> |
| In-Reply-To: | <1397248059.12764.YahooMailNeo@web140001.mail.bf1.yahoo.com> |
| MIME-Version: | 1.0 |
| X-MIME-Autoconverted: | from quoted-printable to 8bit by delorie.com id s3BKfwGh008707 |
Dear Cygwin developers,
Can you please take a look? - We came across a couple problems (times two, because they're identical for /etc/group as well):
1. When '/etc/passwd' gets reloaded, it can't add the last (default) line for uid=-1 because pretty_ls[] has already been parsed (':'s replaced with '\0'), and can't be parsed again.
2. When there's fork(), a fresh copy of the pretty_ls seems to be loaded, which does not have '\0's in place of ':'s, while the parsed addressed are kept on heap and are still valid.
NOTE. The default entry (uid=-1) is needed in case when code runs from a service account(NT SERVICE\...), which can't map to any POSIX UID/GID, so they fail back to -1.
The exposition is below, for each bug (WARNING: BUG1 will cause /etc/passwd to be "touch"ed):
$ gcc -DBUG1 pwd.c
$ ./a.exe
pw_name = (0x6118ad2c)????????
pw_passwd = (0x6118ad35)*
pw_uid = 4294967295
pw_gid = 4294967295
pw_gecos = (0x6118ad3d)
pw_dir = (0x6118ad3e)
pw_shell = (0x6118ad3f)
pwd = NULL
$ gcc -DBUG2 pwd.c
$ ./a.exe
pw_name = (0x6118ad2c)????????
pw_passwd = (0x6118ad35)*
pw_uid = 4294967295
pw_gid = 4294967295
pw_gecos = (0x6118ad3d)
pw_dir = (0x6118ad3e)
pw_shell = (0x6118ad3f)
pw_name = (0x6118ad2c)????????:*:-1:-1:::
pw_passwd = (0x6118ad35)*:-1:-1:::
pw_uid = 4294967295
pw_gid = 4294967295
pw_gecos = (0x6118ad3d)::
pw_dir = (0x6118ad3e):
pw_shell = (0x6118ad3f)
Best regards,
Q.
---------------------------------------
#include <pwd.h>
#include <grp.h>
#include <time.h>
#include <stdio.h>
#include <string.h>
#include <utime.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/time.h>
//#define BUG1
//#define BUG2
static void s_GetPwUid(uid_t uid)
{
const struct passwd* pwd = getpwuid(uid);
if (pwd) {
printf("pw_name = (%p)%s\n"
"pw_passwd = (%p)%s\n"
"pw_uid = %u\n"
"pw_gid = %u\n"
"pw_gecos = (%p)%s\n"
"pw_dir = (%p)%s\n"
"pw_shell = (%p)%s\n\n",
pwd->pw_name, pwd->pw_name ? pwd->pw_name : "NULL",
pwd->pw_passwd, pwd->pw_passwd ? pwd->pw_passwd : "NULL",
(unsigned int) pwd->pw_uid,
(unsigned int) pwd->pw_gid,
pwd->pw_gecos, pwd->pw_gecos ? pwd->pw_gecos : "NULL",
pwd->pw_dir, pwd->pw_dir ? pwd->pw_dir : "NULL",
pwd->pw_shell, pwd->pw_shell ? pwd->pw_shell : "NULL");
} else {
printf("pwd = NULL\n\n");
}
}
int main(void)
{
s_GetPwUid(-1);
#ifdef BUG1
{
time_t t;
struct timeval tv[2];
sleep(2);
t = time(0);
memset(tv, 0, sizeof(tv));
tv[0].tv_sec = t;
tv[1].tv_sec = t;
utimes("/etc/passwd", tv);
s_GetPwUid(-1);
}
#endif
#ifdef BUG2
if (fork())
return 0;
s_GetPwUid(-1);
#endif
return 0;
}
--
Problem reports: http://cygwin.com/problems.html
FAQ: http://cygwin.com/faq/
Documentation: http://cygwin.com/docs.html
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
| webmaster | delorie software privacy |
| Copyright © 2019 by DJ Delorie | Updated Jul 2019 |