lib/, src/: Use SNPRINTF() instead of its pattern
The variable declarations for the buffers have been aligned in this commit, so that they appear in the diff, making it easier to review. Some important but somewhat tangent changes included in this commit: - lib/nss.c: The size was being defined as 65, but then used as 64. That was a bug, although not an important one; we were just wasting one byte. Fix that while we replace snprintf() by SNPRINTF(), which will get the size from sizeof(), and thus will use the real size. Signed-off-by: Alejandro Colomar <alx@kernel.org>
This commit is contained in:
committed by
Iker Pedrosa
parent
8c6634d9bc
commit
cf9cc6963c
+13
-14
@@ -32,6 +32,7 @@
|
||||
#include "prototypes.h"
|
||||
#include "commonio.h"
|
||||
#include "shadowlog_internal.h"
|
||||
#include "string/sprintf.h"
|
||||
|
||||
|
||||
/* local function prototypes */
|
||||
@@ -123,11 +124,11 @@ static int check_link_count (const char *file, bool log)
|
||||
|
||||
static int do_lock_file (const char *file, const char *lock, bool log)
|
||||
{
|
||||
int fd;
|
||||
pid_t pid;
|
||||
ssize_t len;
|
||||
int retval;
|
||||
char buf[32];
|
||||
int fd;
|
||||
int retval;
|
||||
char buf[32];
|
||||
pid_t pid;
|
||||
ssize_t len;
|
||||
|
||||
fd = open (file, O_CREAT | O_TRUNC | O_WRONLY, 0600);
|
||||
if (-1 == fd) {
|
||||
@@ -140,7 +141,7 @@ static int do_lock_file (const char *file, const char *lock, bool log)
|
||||
}
|
||||
|
||||
pid = getpid ();
|
||||
snprintf (buf, sizeof buf, "%lu", (unsigned long) pid);
|
||||
SNPRINTF(buf, "%lu", (unsigned long) pid);
|
||||
len = (ssize_t) strlen (buf) + 1;
|
||||
if (write_full(fd, buf, len) == -1) {
|
||||
if (log) {
|
||||
@@ -341,7 +342,7 @@ static void free_linked_list (struct commonio_db *db)
|
||||
|
||||
int commonio_setname (struct commonio_db *db, const char *name)
|
||||
{
|
||||
snprintf (db->filename, sizeof (db->filename), "%s", name);
|
||||
SNPRINTF(db->filename, "%s", name);
|
||||
db->setname = true;
|
||||
return 1;
|
||||
}
|
||||
@@ -467,7 +468,7 @@ static void dec_lock_count (void)
|
||||
|
||||
int commonio_unlock (struct commonio_db *db)
|
||||
{
|
||||
char lock[1029];
|
||||
char lock[1029];
|
||||
|
||||
if (db->isopen) {
|
||||
db->readonly = true;
|
||||
@@ -484,7 +485,7 @@ int commonio_unlock (struct commonio_db *db)
|
||||
* then call ulckpwdf() (if used) on last unlock.
|
||||
*/
|
||||
db->locked = false;
|
||||
snprintf (lock, sizeof lock, "%s.lock", db->filename);
|
||||
SNPRINTF(lock, "%s.lock", db->filename);
|
||||
unlink (lock);
|
||||
dec_lock_count ();
|
||||
return 1;
|
||||
@@ -893,7 +894,7 @@ static int write_all (const struct commonio_db *db)
|
||||
|
||||
int commonio_close (struct commonio_db *db)
|
||||
{
|
||||
int errors = 0, r;
|
||||
int errors = 0;
|
||||
char buf[1024];
|
||||
struct stat sb;
|
||||
|
||||
@@ -926,8 +927,7 @@ int commonio_close (struct commonio_db *db)
|
||||
/*
|
||||
* Create backup file.
|
||||
*/
|
||||
r = snprintf (buf, sizeof buf, "%s-", db->filename);
|
||||
if (r < 0 || (size_t)r >= sizeof buf) {
|
||||
if (SNPRINTF(buf, "%s-", db->filename) == -1) {
|
||||
(void) fclose (db->fp);
|
||||
db->fp = NULL;
|
||||
goto fail;
|
||||
@@ -964,8 +964,7 @@ int commonio_close (struct commonio_db *db)
|
||||
sb.st_gid = db->st_gid;
|
||||
}
|
||||
|
||||
r = snprintf (buf, sizeof buf, "%s+", db->filename);
|
||||
if (r < 0 || (size_t)r >= sizeof buf)
|
||||
if (SNPRINTF(buf, "%s+", db->filename) == -1)
|
||||
goto fail;
|
||||
|
||||
#ifdef WITH_SELINUX
|
||||
|
||||
@@ -166,9 +166,9 @@ void addenv (const char *string, /*@null@*/const char *value)
|
||||
*/
|
||||
void set_env (int argc, char *const *argv)
|
||||
{
|
||||
int noname = 1;
|
||||
char variable[1024];
|
||||
char *cp;
|
||||
int noname = 1;
|
||||
char variable[1024];
|
||||
char *cp;
|
||||
|
||||
for (; argc > 0; argc--, argv++) {
|
||||
if (strlen (*argv) >= sizeof variable) {
|
||||
@@ -177,9 +177,7 @@ void set_env (int argc, char *const *argv)
|
||||
|
||||
cp = strchr (*argv, '=');
|
||||
if (NULL == cp) {
|
||||
int wlen;
|
||||
wlen = snprintf (variable, sizeof variable, "L%d", noname);
|
||||
assert (wlen < (int) sizeof(variable));
|
||||
assert(SNPRINTF(variable, "L%d", noname) != -1);
|
||||
noname++;
|
||||
addenv (variable, *argv);
|
||||
} else {
|
||||
|
||||
+4
-4
@@ -14,6 +14,9 @@
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include "string/sprintf.h"
|
||||
|
||||
|
||||
int get_pid (const char *pidstr, pid_t *pid)
|
||||
{
|
||||
long long val;
|
||||
@@ -76,7 +79,6 @@ int get_pidfd_from_fd(const char *pidfdstr)
|
||||
int open_pidfd(const char *pidstr)
|
||||
{
|
||||
int proc_dir_fd;
|
||||
int written;
|
||||
char proc_dir_name[32];
|
||||
pid_t target;
|
||||
|
||||
@@ -84,9 +86,7 @@ int open_pidfd(const char *pidstr)
|
||||
return -ENOENT;
|
||||
|
||||
/* max string length is 6 + 10 + 1 + 1 = 18, allocate 32 bytes */
|
||||
written = snprintf(proc_dir_name, sizeof(proc_dir_name), "/proc/%u/",
|
||||
target);
|
||||
if ((written <= 0) || ((size_t)written >= sizeof(proc_dir_name))) {
|
||||
if (SNPRINTF(proc_dir_name, "/proc/%u/", target) == -1) {
|
||||
fprintf(stderr, "snprintf of proc path failed for %u: %s\n",
|
||||
target, strerror(errno));
|
||||
return -EINVAL;
|
||||
|
||||
+9
-6
@@ -18,6 +18,9 @@
|
||||
#include "defines.h"
|
||||
#include "prototypes.h"
|
||||
#include "getdef.h"
|
||||
#include "string/sprintf.h"
|
||||
|
||||
|
||||
/*
|
||||
* hushed - determine if a user receives login messages
|
||||
*
|
||||
@@ -26,11 +29,11 @@
|
||||
*/
|
||||
bool hushed (const char *username)
|
||||
{
|
||||
struct passwd *pw;
|
||||
const char *hushfile;
|
||||
char buf[BUFSIZ];
|
||||
bool found;
|
||||
FILE *fp;
|
||||
bool found;
|
||||
char buf[BUFSIZ];
|
||||
FILE *fp;
|
||||
const char *hushfile;
|
||||
struct passwd *pw;
|
||||
|
||||
/*
|
||||
* Get the name of the file to use. If this option is not
|
||||
@@ -53,7 +56,7 @@ bool hushed (const char *username)
|
||||
*/
|
||||
|
||||
if (hushfile[0] != '/') {
|
||||
(void) snprintf (buf, sizeof (buf), "%s/%s", pw->pw_dir, hushfile);
|
||||
SNPRINTF(buf, "%s/%s", pw->pw_dir, hushfile);
|
||||
return (access (buf, F_OK) == 0);
|
||||
}
|
||||
|
||||
|
||||
@@ -14,6 +14,8 @@
|
||||
#include "../libsubid/subid.h"
|
||||
#include "shadowlog_internal.h"
|
||||
#include "shadowlog.h"
|
||||
#include "string/sprintf.h"
|
||||
|
||||
|
||||
#define NSSWITCH "/etc/nsswitch.conf"
|
||||
|
||||
@@ -45,7 +47,7 @@ static void nss_exit(void) {
|
||||
// nsswitch_path is an argument only to support testing.
|
||||
void nss_init(const char *nsswitch_path) {
|
||||
char *line = NULL, *p, *token, *saveptr;
|
||||
char libname[65];
|
||||
char libname[64];
|
||||
FILE *nssfp = NULL;
|
||||
FILE *shadow_logfd = log_get_logfd();
|
||||
void *h;
|
||||
@@ -103,7 +105,7 @@ void nss_init(const char *nsswitch_path) {
|
||||
fprintf(shadow_logfd, "Using files\n");
|
||||
goto null_subid;
|
||||
}
|
||||
snprintf(libname, 64, "libsubid_%s.so", token);
|
||||
SNPRINTF(libname, "libsubid_%s.so", token);
|
||||
h = dlopen(libname, RTLD_LAZY);
|
||||
if (!h) {
|
||||
fprintf(shadow_logfd, "Error opening %s: %s\n", libname, dlerror());
|
||||
|
||||
+10
-9
@@ -25,6 +25,7 @@
|
||||
#include "prototypes.h"
|
||||
#include "pwauth.h"
|
||||
#include "getdef.h"
|
||||
#include "string/sprintf.h"
|
||||
|
||||
#ifdef SKEY
|
||||
#include <skey.h>
|
||||
@@ -51,16 +52,16 @@ int pw_auth (const char *cipher,
|
||||
int reason,
|
||||
/*@null@*/const char *input)
|
||||
{
|
||||
char prompt[1024];
|
||||
char *clear = NULL;
|
||||
const char *cp;
|
||||
const char *encrypted;
|
||||
int retval;
|
||||
int retval;
|
||||
char prompt[1024];
|
||||
char *clear = NULL;
|
||||
const char *cp;
|
||||
const char *encrypted;
|
||||
|
||||
#ifdef SKEY
|
||||
bool use_skey = false;
|
||||
char challenge_info[40];
|
||||
struct skey skey;
|
||||
bool use_skey = false;
|
||||
char challenge_info[40];
|
||||
struct skey skey;
|
||||
#endif
|
||||
|
||||
/*
|
||||
@@ -141,7 +142,7 @@ int pw_auth (const char *cipher,
|
||||
}
|
||||
#endif
|
||||
|
||||
snprintf (prompt, sizeof prompt, cp, user);
|
||||
SNPRINTF(prompt, cp, user);
|
||||
clear = agetpass(prompt);
|
||||
input = (clear == NULL) ? "" : clear;
|
||||
}
|
||||
|
||||
+5
-2
@@ -15,6 +15,9 @@
|
||||
#include <errno.h>
|
||||
#include "prototypes.h"
|
||||
#include "defines.h"
|
||||
#include "string/sprintf.h"
|
||||
|
||||
|
||||
extern char **newenvp;
|
||||
extern size_t newenvc;
|
||||
|
||||
@@ -45,7 +48,7 @@ int shell (const char *file, /*@null@*/const char *arg, char *const envp[])
|
||||
* don't want to tell us what it is themselves.
|
||||
*/
|
||||
if (arg == NULL) {
|
||||
snprintf(arg0, sizeof(arg0), "-%s", Basename(file));
|
||||
SNPRINTF(arg0, "-%s", Basename(file));
|
||||
arg = arg0;
|
||||
}
|
||||
|
||||
@@ -71,7 +74,7 @@ int shell (const char *file, /*@null@*/const char *arg, char *const envp[])
|
||||
* how to execute this stupid shell, so I might as well give
|
||||
* up in disgust ...
|
||||
*/
|
||||
(void) snprintf (arg0, sizeof arg0, _("Cannot execute %s"), file);
|
||||
SNPRINTF(arg0, _("Cannot execute %s"), file);
|
||||
errno = err;
|
||||
perror (arg0);
|
||||
return err;
|
||||
|
||||
+5
-5
@@ -18,6 +18,8 @@
|
||||
#include <fcntl.h>
|
||||
|
||||
#include "alloc.h"
|
||||
#include "string/sprintf.h"
|
||||
|
||||
|
||||
#define ID_SIZE 31
|
||||
|
||||
@@ -220,10 +222,9 @@ static const struct subordinate_range *find_range(struct commonio_db *db,
|
||||
* (It may be specified as literal UID or as another username which
|
||||
* has the same UID as the username we are looking for.)
|
||||
*/
|
||||
struct passwd *pwd;
|
||||
uid_t owner_uid;
|
||||
char owner_uid_string[33];
|
||||
int ret;
|
||||
uid_t owner_uid;
|
||||
struct passwd *pwd;
|
||||
|
||||
|
||||
/* Get UID of the username we are looking for */
|
||||
@@ -233,8 +234,7 @@ static const struct subordinate_range *find_range(struct commonio_db *db,
|
||||
return NULL;
|
||||
}
|
||||
owner_uid = pwd->pw_uid;
|
||||
ret = snprintf(owner_uid_string, sizeof (owner_uid_string), "%lu", (unsigned long)owner_uid);
|
||||
if (ret < 0 || (size_t)ret >= sizeof (owner_uid_string))
|
||||
if (SNPRINTF(owner_uid_string, "%lu", (unsigned long) owner_uid) == -1)
|
||||
return NULL;
|
||||
|
||||
commonio_rewind(db);
|
||||
|
||||
+12
-10
@@ -23,6 +23,8 @@
|
||||
#include "subordinateio.h"
|
||||
#endif /* ENABLE_SUBIDS */
|
||||
#include "shadowlog.h"
|
||||
#include "string/sprintf.h"
|
||||
|
||||
|
||||
#ifdef __linux__
|
||||
static int check_status (const char *name, const char *sname, uid_t uid);
|
||||
@@ -83,11 +85,11 @@ static int user_busy_utmp (const char *name)
|
||||
static int different_namespace (const char *sname)
|
||||
{
|
||||
/* 41: /proc/xxxxxxxxxx/task/xxxxxxxxxx/ns/user + \0 */
|
||||
char path[41];
|
||||
char buf[512], buf2[512];
|
||||
ssize_t llen1, llen2;
|
||||
char path[41];
|
||||
char buf[512], buf2[512];
|
||||
ssize_t llen1, llen2;
|
||||
|
||||
snprintf (path, 41, "/proc/%s/ns/user", sname);
|
||||
SNPRINTF(path, "/proc/%s/ns/user", sname);
|
||||
|
||||
if ((llen1 = readlink (path, buf, sizeof(buf))) == -1)
|
||||
return 0;
|
||||
@@ -106,11 +108,11 @@ static int different_namespace (const char *sname)
|
||||
static int check_status (const char *name, const char *sname, uid_t uid)
|
||||
{
|
||||
/* 40: /proc/xxxxxxxxxx/task/xxxxxxxxxx/status + \0 */
|
||||
char status[40];
|
||||
char line[1024];
|
||||
FILE *sfile;
|
||||
char status[40];
|
||||
char line[1024];
|
||||
FILE *sfile;
|
||||
|
||||
snprintf (status, 40, "/proc/%s/status", sname);
|
||||
SNPRINTF(status, "/proc/%s/status", sname);
|
||||
|
||||
sfile = fopen (status, "r");
|
||||
if (NULL == sfile) {
|
||||
@@ -205,7 +207,7 @@ static int user_busy_processes (const char *name, uid_t uid)
|
||||
}
|
||||
|
||||
/* Check if the process is in our chroot */
|
||||
snprintf(root_path, sizeof(root_path), "/proc/%lu/root", (unsigned long) pid);
|
||||
SNPRINTF(root_path, "/proc/%lu/root", (unsigned long) pid);
|
||||
if (stat (root_path, &sbroot_process) != 0) {
|
||||
continue;
|
||||
}
|
||||
@@ -225,7 +227,7 @@ static int user_busy_processes (const char *name, uid_t uid)
|
||||
return 1;
|
||||
}
|
||||
|
||||
snprintf(task_path, sizeof(task_path), "/proc/%lu/task", (unsigned long) pid);
|
||||
SNPRINTF(task_path, "/proc/%lu/task", (unsigned long) pid);
|
||||
task_dir = opendir (task_path);
|
||||
if (task_dir != NULL) {
|
||||
while ((ent = readdir (task_dir)) != NULL) {
|
||||
|
||||
Reference in New Issue
Block a user