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 <alx@kernel.org>
This commit is contained in:
parent
7e213cfb50
commit
46610792e9
@ -12,6 +12,7 @@
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include "prototypes.h"
|
||||
#include "stpeprintf.h"
|
||||
#include "idmapping.h"
|
||||
#if HAVE_SYS_CAPABILITY_H
|
||||
#include <sys/prctl.h>
|
||||
@ -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",
|
||||
pos = stpeprintf(pos, end, "%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;
|
||||
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 */
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user