From: Alejandro Colomar Date: Mon, 15 Jan 2024 15:20:03 +0000 (+0100) Subject: lib/: Call strchrnul(3) instead of open-coding it X-Git-Tag: 4.15.1~21 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5f8f19f2678d29e3ab78d8506fe71da3e48bf283;p=thirdparty%2Fshadow.git lib/: Call strchrnul(3) instead of open-coding it Performance tests made in 2007 are obsolete. We should assume libc is reasonably fast today (otherwise, report a bug to libc). $ git blame -- lib/sgetgrent.c | grep strchr 45c6603cc (nekral-guest 2007-10-07 11:44:02 +0000 30) * WARNING: I profiled this once with and without strchr() calls 6f88bcf58 (nekral-guest 2008-05-26 08:31:14 +0000 97) cp = strchr (cp, ':'); Signed-off-by: Alejandro Colomar --- diff --git a/lib/sgetgrent.c b/lib/sgetgrent.c index 6894baf99..24764ecdd 100644 --- a/lib/sgetgrent.c +++ b/lib/sgetgrent.c @@ -14,6 +14,7 @@ #include #include #include +#include #include "alloc.h" #include "defines.h" @@ -27,14 +28,11 @@ * list() converts the comma-separated list of member names into * an array of character pointers. * - * WARNING: I profiled this once with and without strchr() calls - * and found that using a register variable and an explicit loop - * works best. For large /etc/group files, this is a major win. - * * FINALLY added dynamic allocation. Still need to fix sgetsgent(). * --marekm */ -static char **list (char *s) +static char ** +list(char *s) { static char **members = NULL; static size_t size = 0; /* max members + 1 */ @@ -55,9 +53,7 @@ static char **list (char *s) if (!s || s[0] == '\0') break; members[i++] = s; - while (('\0' != *s) && (',' != *s)) { - s++; - } + s = strchrnul(s, ','); if ('\0' != *s) { *s++ = '\0'; } diff --git a/lib/sgetpwent.c b/lib/sgetpwent.c index 8dba02f82..d60a7fe19 100644 --- a/lib/sgetpwent.c +++ b/lib/sgetpwent.c @@ -12,9 +12,11 @@ #ident "$Id$" #include -#include "defines.h" #include #include +#include + +#include "defines.h" #include "prototypes.h" #include "shadowlog_internal.h" @@ -32,7 +34,8 @@ * performance reasons. I am going to come up with some conditional * compilation glarp to improve on this in the future. */ -struct passwd *sgetpwent (const char *buf) +struct passwd * +sgetpwent(const char *buf) { static struct passwd pwent; static char pwdbuf[PASSWD_ENTRY_MAX_LENGTH]; @@ -60,9 +63,7 @@ struct passwd *sgetpwent (const char *buf) for (cp = pwdbuf, i = 0; (i < NFIELDS) && (NULL != cp); i++) { fields[i] = cp; - while (('\0' != *cp) && (':' != *cp)) { - cp++; - } + cp = strchrnul(cp, ':'); if ('\0' != *cp) { *cp = '\0'; diff --git a/lib/sgetspent.c b/lib/sgetspent.c index 184fbc16d..07104924b 100644 --- a/lib/sgetspent.c +++ b/lib/sgetspent.c @@ -14,17 +14,24 @@ #ident "$Id$" +#include #include +#include + #include "prototypes.h" #include "shadowlog_internal.h" #include "defines.h" -#include + + #define FIELDS 9 #define OFIELDS 5 + + /* * sgetspent - convert string in shadow file format to (struct spwd *) */ -struct spwd *sgetspent (const char *string) +struct spwd * +sgetspent(const char *string) { static char spwbuf[PASSWD_ENTRY_MAX_LENGTH]; static struct spwd spwd; @@ -57,9 +64,7 @@ struct spwd *sgetspent (const char *string) for (cp = spwbuf, i = 0; ('\0' != *cp) && (i < FIELDS); i++) { fields[i] = cp; - while (('\0' != *cp) && (':' != *cp)) { - cp++; - } + cp = strchrnul(cp, ':'); if ('\0' != *cp) { *cp = '\0'; diff --git a/lib/subordinateio.c b/lib/subordinateio.c index 844de5f06..85bc0adc5 100644 --- a/lib/subordinateio.c +++ b/lib/subordinateio.c @@ -16,6 +16,7 @@ #include #include #include +#include #include "alloc.h" #include "string/sprintf.h" @@ -74,7 +75,8 @@ subordinate_free(/*@only@*/void *ent) * in @line, or NULL on failure. Note that the returned value should not * be freed by the caller. */ -static void *subordinate_parse (const char *line) +static void * +subordinate_parse(const char *line) { static struct subordinate_range range; static char rangebuf[1024]; @@ -97,9 +99,7 @@ static void *subordinate_parse (const char *line) for (cp = rangebuf, i = 0; (i < SUBID_NFIELDS) && (NULL != cp); i++) { fields[i] = cp; - while (('\0' != *cp) && (':' != *cp)) { - cp++; - } + cp = strchrnul(cp, ':'); if ('\0' != *cp) { *cp = '\0';