From 46610792e90f35864ff94c289adecb56cdd8682b Mon Sep 17 00:00:00 2001 From: Alejandro Colomar Date: Mon, 30 Jan 2023 00:54:07 +0100 Subject: [PATCH] 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 --- libmisc/idmapping.c | 22 +++++++++--------- src/groupmod.c | 56 +++++++++++++++++++++++---------------------- 2 files changed, 40 insertions(+), 38 deletions(-) diff --git a/libmisc/idmapping.c b/libmisc/idmapping.c index 57e9ab22..1c6e719f 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 4921aca3..3799235c 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