From fea48988ea866e6ef4f29247a13a8b28eb9be7ce Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Mon, 27 Jan 2003 00:16:01 +0000 Subject: [PATCH] * strings.h (strechr): New function. * uinfo.cc (pwdgrp::next_str): Search only for input char in string. Return EOS on failure. Don't check for NULL since it shouldn't be possible. (pwdgrp::add_line): Revert to replacing '\n' in input line with '\0'. (pwdgrp::next_num): Pass explicit separator character to next_str. * grp.cc (pwdgrp::parse_group): Ditto. * passwd.cc (pwdgrp::parse_passwd): Ditto. Revamp test for garbage input. * pwdgrp.h (pwdgrp::next_str): Don't use default parameter. --- winsup/cygwin/ChangeLog | 13 +++++++++++++ winsup/cygwin/grp.cc | 4 ++-- winsup/cygwin/passwd.cc | 17 ++++++++--------- winsup/cygwin/pwdgrp.h | 2 +- winsup/cygwin/string.h | 21 +++++++++++++++++++++ winsup/cygwin/uinfo.cc | 23 +++++++++-------------- 6 files changed, 54 insertions(+), 26 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 7ad151b88..b965d82fa 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,16 @@ +2003-01-26 Christopher Faylor + + * strings.h (strechr): New function. + * uinfo.cc (pwdgrp::next_str): Search only for input char in string. + Return EOS on failure. Don't check for NULL since it shouldn't be + possible. + (pwdgrp::add_line): Revert to replacing '\n' in input line with '\0'. + (pwdgrp::next_num): Pass explicit separator character to next_str. + * grp.cc (pwdgrp::parse_group): Ditto. + * passwd.cc (pwdgrp::parse_passwd): Ditto. Revamp test for garbage + input. + * pwdgrp.h (pwdgrp::next_str): Don't use default parameter. + 2003-01-26 Christopher Faylor * uinfo.cc (pwdgrp::load): Regularize strace output. Add warning for diff --git a/winsup/cygwin/grp.cc b/winsup/cygwin/grp.cc index 44abc9745..35bba1fe2 100644 --- a/winsup/cygwin/grp.cc +++ b/winsup/cygwin/grp.cc @@ -37,11 +37,11 @@ bool pwdgrp::parse_group () { # define grp (*group_buf)[curr_lines] - grp.gr_name = next_str (); + grp.gr_name = next_str (':'); if (!*grp.gr_name) return false; - grp.gr_passwd = next_str (); + grp.gr_passwd = next_str (':'); if (!next_num (grp.gr_gid)) return false; diff --git a/winsup/cygwin/passwd.cc b/winsup/cygwin/passwd.cc index 113f92acf..c257bd640 100644 --- a/winsup/cygwin/passwd.cc +++ b/winsup/cygwin/passwd.cc @@ -38,18 +38,17 @@ bool pwdgrp::parse_passwd () { # define res (*passwd_buf)[curr_lines] - res.pw_name = next_str (); - res.pw_passwd = next_str (); - - if (res.pw_name == res.pw_passwd) - return false; - + res.pw_name = next_str (':'); + res.pw_passwd = next_str (':'); + char *p = raw_ptr (); (void) next_num (res.pw_uid); + if (p == raw_ptr ()) + return false; /* parsing did not advance. line is garbage */ (void) next_num (res.pw_gid); res.pw_comment = NULL; - res.pw_gecos = next_str (); - res.pw_dir = next_str (); - res.pw_shell = next_str (); + res.pw_gecos = next_str (':'); + res.pw_dir = next_str (':'); + res.pw_shell = next_str (':'); return true; # undef res } diff --git a/winsup/cygwin/pwdgrp.h b/winsup/cygwin/pwdgrp.h index a5fdc1953..73d41a097 100644 --- a/winsup/cygwin/pwdgrp.h +++ b/winsup/cygwin/pwdgrp.h @@ -46,7 +46,7 @@ class pwdgrp void read_group (); char *add_line (char *); char *raw_ptr () const {return lptr;} - char *next_str (char = 0); + char *next_str (char); bool next_num (unsigned long&); bool next_num (unsigned int& i) { diff --git a/winsup/cygwin/string.h b/winsup/cygwin/string.h index 6e410249b..0ac9745ad 100644 --- a/winsup/cygwin/string.h +++ b/winsup/cygwin/string.h @@ -38,6 +38,27 @@ strchr (const char *s, int c) return res; } +#undef strechr +#define strechr cygwin_strechr +static inline __stdcall char * +strechr (const char *s, int c) +{ + register char * res; + __asm__ __volatile__ ("\ + movb %%al,%%ah\n\ +1: movb (%1),%%al\n\ + cmpb %%ah,%%al\n\ + je 2f\n\ + incl %1\n\ + testb %%al,%%al\n\ + jne 1b\n\ + decl %1\n\ +2: movl %1,%0\n\ + ":"=a" (res), "=r" (s) + :"0" (c), "1" (s)); + return res; +} + extern const char isalpha_array[]; #undef strcasematch diff --git a/winsup/cygwin/uinfo.cc b/winsup/cygwin/uinfo.cc index 82712d9d4..a6831e2a9 100644 --- a/winsup/cygwin/uinfo.cc +++ b/winsup/cygwin/uinfo.cc @@ -394,24 +394,17 @@ cygheap_user::env_name (const char *name, size_t namelen) char * pwdgrp::next_str (char c) { - if (!lptr) - return NULL; - char search[] = ":\n\0\0"; - search[2] = c; char *res = lptr; - char *p = strpbrk (lptr, search); - if (p) - { - lptr = (*p == '\n') ? p : p + 1; - *p = '\0'; - } + lptr = strechr (lptr, c); + if (*lptr) + *lptr++ = '\0'; return res; } bool pwdgrp::next_num (unsigned long& n) { - char *p = next_str (); + char *p = next_str (':'); if (!p) return -1; char *cp; @@ -425,11 +418,13 @@ pwdgrp::add_line (char *eptr) if (eptr) { lptr = eptr; - eptr = strchr (lptr, '\n'); - if (eptr) + eptr = strechr (lptr, '\n'); + if (*eptr) { if (eptr > lptr && eptr[-1] == '\r') - eptr[-1] = '\n'; + eptr[-1] = '\0'; + else + *eptr = '\0'; eptr++; } if (curr_lines >= max_lines)