From: Alejandro Colomar Date: Sun, 29 Jan 2023 23:54:07 +0000 (+0100) Subject: Use stpeprintf() where appropriate X-Git-Tag: 4.14.0-rc1~182 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=46610792e90f35864ff94c289adecb56cdd8682b;p=thirdparty%2Fshadow.git Use stpeprintf() where appropriate This function allows reducing error checking (since errors are propagated across chained calls), and also simplifies the calculation of the start and end of the buffer where the string should be written. Moreover, the new code is more optimized, since many calls to strlen(3) have been removed. Signed-off-by: Alejandro Colomar --- diff --git a/libmisc/idmapping.c b/libmisc/idmapping.c index 57e9ab229..1c6e719f0 100644 --- a/libmisc/idmapping.c +++ b/libmisc/idmapping.c @@ -12,6 +12,7 @@ #include #include #include "prototypes.h" +#include "stpeprintf.h" #include "idmapping.h" #if HAVE_SYS_CAPABILITY_H #include @@ -141,7 +142,7 @@ void write_mapping(int proc_dir_fd, int ranges, const struct map_range *mappings int idx; const struct map_range *mapping; size_t bufsize; - char *buf, *pos; + char *buf, *pos, *end; int fd; #if HAVE_SYS_CAPABILITY_H @@ -189,21 +190,20 @@ void write_mapping(int proc_dir_fd, int ranges, const struct map_range *mappings bufsize = ranges * ((ULONG_DIGITS + 1) * 3); pos = buf = xmalloc(bufsize); + end = buf + bufsize; /* Build the mapping command */ mapping = mappings; for (idx = 0; idx < ranges; idx++, mapping++) { /* Append this range to the string that will be written */ - int written = snprintf(pos, bufsize - (pos - buf), - "%lu %lu %lu\n", - mapping->upper, - mapping->lower, - mapping->count); - if ((written <= 0) || ((size_t)written >= (bufsize - (pos - buf)))) { - fprintf(log_get_logfd(), _("%s: snprintf failed!\n"), log_get_progname()); - exit(EXIT_FAILURE); - } - pos += written; + pos = stpeprintf(pos, end, "%lu %lu %lu\n", + mapping->upper, + mapping->lower, + mapping->count); + } + if (pos == end || pos == NULL) { + fprintf(log_get_logfd(), _("%s: stpeprintf failed!\n"), log_get_progname()); + exit(EXIT_FAILURE); } /* Write the mapping to the mapping file */ diff --git a/src/groupmod.c b/src/groupmod.c index 4921aca3f..3799235cd 100644 --- a/src/groupmod.c +++ b/src/groupmod.c @@ -35,6 +35,7 @@ #include "sgroupio.h" #endif #include "shadowlog.h" +#include "stpeprintf.h" /* * exit status values */ @@ -543,46 +544,49 @@ static void close_files (void) */ static void prepare_failure_reports (void) { + char *gr, *gr_end; +#ifdef SHADOWGRP + char *sgr, *sgr_end; +#endif + char *pw, *pw_end; + info_group.name = group_name; #ifdef SHADOWGRP info_gshadow.name = group_name; #endif info_passwd.name = group_name; - info_group.audit_msg = xmalloc (512); + gr = xmalloc (512); + info_group.audit_msg = gr; + gr_end = gr + 512; #ifdef SHADOWGRP - info_gshadow.audit_msg = xmalloc (512); + sgr = xmalloc (512); + info_gshadow.audit_msg = sgr; + sgr_end = sgr + 512; #endif - info_passwd.audit_msg = xmalloc (512); + pw = xmalloc (512); + info_passwd.audit_msg = pw; + pw_end = pw + 512; - (void) snprintf (info_group.audit_msg, 512, - "changing %s; ", gr_dbname ()); + gr = stpeprintf(gr, gr_end, "changing %s; ", gr_dbname ()); #ifdef SHADOWGRP - (void) snprintf (info_gshadow.audit_msg, 512, - "changing %s; ", sgr_dbname ()); + sgr = stpeprintf(sgr, sgr_end, "changing %s; ", sgr_dbname ()); #endif - (void) snprintf (info_passwd.audit_msg, 512, - "changing %s; ", pw_dbname ()); + pw = stpeprintf(pw, pw_end, "changing %s; ", pw_dbname ()); - info_group.action = info_group.audit_msg - + strlen (info_group.audit_msg); + info_group.action = gr; #ifdef SHADOWGRP - info_gshadow.action = info_gshadow.audit_msg - + strlen (info_gshadow.audit_msg); + info_gshadow.action = sgr; #endif - info_passwd.action = info_passwd.audit_msg - + strlen (info_passwd.audit_msg); + info_passwd.action = pw; - (void) snprintf (info_group.action, - 512 - strlen (info_group.audit_msg), + gr = stpeprintf(gr, gr_end, "group %s/%ju", group_name, (uintmax_t) group_id); #ifdef SHADOWGRP - (void) snprintf (info_gshadow.action, - 512 - strlen (info_gshadow.audit_msg), + sgr = stpeprintf(sgr, sgr_end, "group %s", group_name); #endif - (void) snprintf (info_passwd.action, - 512 - strlen (info_passwd.audit_msg), + pw = stpeprintf(pw, pw_end, "group %s/%ju", group_name, (uintmax_t) group_id); if (nflg) { @@ -615,15 +619,13 @@ static void prepare_failure_reports (void) if (gflg) { strncat (info_group.action, ", new gid: ", 511 - strlen (info_group.audit_msg)); - (void) snprintf (info_group.action+strlen (info_group.action), - 512 - strlen (info_group.audit_msg), - "%ju", (uintmax_t) group_newid); + stpeprintf(info_group.action+strlen (info_group.action), + gr_end, "%ju", (uintmax_t) group_newid); strncat (info_passwd.action, ", new gid: ", 511 - strlen (info_passwd.audit_msg)); - (void) snprintf (info_passwd.action+strlen (info_passwd.action), - 512 - strlen (info_passwd.audit_msg), - "%ju", (uintmax_t) group_newid); + stpeprintf(info_passwd.action+strlen (info_passwd.action), + pw_end, "%ju", (uintmax_t) group_newid); } info_group.audit_msg[511] = '\0'; #ifdef SHADOWGRP