Change sudo_strtomode() to return mode_t.

This commit is contained in:
Todd C. Miller
2023-07-05 09:54:22 -06:00
parent 2848dddd87
commit 2d1b3c369f
5 changed files with 41 additions and 8 deletions

View File

@@ -19,7 +19,7 @@
#ifndef SUDO_DEBUG_H
#define SUDO_DEBUG_H
#include <sys/types.h> /* for id_t, size_t, ssize_t, time_t */
#include <sys/types.h> /* for id_t, mode_t, size_t, ssize_t, time_t */
#include <stdarg.h>
#ifdef HAVE_STDBOOL_H
# include <stdbool.h>
@@ -168,6 +168,14 @@ struct sudo_conf_debug_file_list;
return sudo_debug_ret; \
} while (0)
#define debug_return_mode_t(ret) \
do { \
mode_t sudo_debug_ret = (ret); \
sudo_debug_exit_mode_t(__func__, __FILE__, __LINE__, sudo_debug_subsys,\
sudo_debug_ret); \
return sudo_debug_ret; \
} while (0)
#define debug_return_long(ret) \
do { \
long sudo_debug_ret = (ret); \
@@ -260,6 +268,7 @@ sudo_dso_public void sudo_debug_exit_ssize_t_v1(const char *func, const char *fi
sudo_dso_public void sudo_debug_exit_str_v1(const char *func, const char *file, int line, unsigned int subsys, const char *ret);
sudo_dso_public void sudo_debug_exit_str_masked_v1(const char *func, const char *file, int line, unsigned int subsys, const char *ret);
sudo_dso_public void sudo_debug_exit_time_t_v1(const char *func, const char *file, int line, unsigned int subsys, time_t ret);
sudo_dso_public void sudo_debug_exit_mode_t_v1(const char *func, const char *file, int line, unsigned int subsys, mode_t ret);
sudo_dso_public pid_t sudo_debug_fork_v1(void);
sudo_dso_public int sudo_debug_get_active_instance_v1(void);
sudo_dso_public int sudo_debug_get_fds_v1(unsigned char **fds);
@@ -290,6 +299,7 @@ sudo_dso_public bool sudo_debug_needed_v1(unsigned int level);
#define sudo_debug_exit_str(_a, _b, _c, _d, _e) sudo_debug_exit_str_v1((_a), (_b), (_c), (_d), (_e))
#define sudo_debug_exit_str_masked(_a, _b, _c, _d, _e) sudo_debug_exit_str_masked_v1((_a), (_b), (_c), (_d), (_e))
#define sudo_debug_exit_time_t(_a, _b, _c, _d, _e) sudo_debug_exit_time_t_v1((_a), (_b), (_c), (_d), (_e))
#define sudo_debug_exit_mode_t(_a, _b, _c, _d, _e) sudo_debug_exit_mode_t_v1((_a), (_b), (_c), (_d), (_e))
#define sudo_debug_fork() sudo_debug_fork_v1()
#define sudo_debug_get_active_instance() sudo_debug_get_active_instance_v1()
#define sudo_debug_get_fds(_a) sudo_debug_get_fds_v1((_a))

View File

@@ -312,7 +312,8 @@ sudo_dso_public id_t sudo_strtoidx_v1(const char *str, const char *sep, char **e
/* strtomode.c */
sudo_dso_public int sudo_strtomode_v1(const char *cp, const char **errstr);
#define sudo_strtomode(_a, _b) sudo_strtomode_v1((_a), (_b))
sudo_dso_public mode_t sudo_strtomode_v2(const char *cp, const char **errstr);
#define sudo_strtomode(_a, _b) sudo_strtomode_v2((_a), (_b))
/* sudo_printf.c */
extern int (*sudo_printf)(int msg_type, const char *fmt, ...);

View File

@@ -38,8 +38,8 @@
* On success, returns the parsed mode and clears errstr.
* On error, returns 0 and sets errstr.
*/
int
sudo_strtomode_v1(const char *cp, const char **errstr)
mode_t
sudo_strtomode_v2(const char *cp, const char **errstr)
{
char *ep;
long lval;
@@ -51,15 +51,21 @@ sudo_strtomode_v1(const char *cp, const char **errstr)
if (errstr != NULL)
*errstr = N_("invalid value");
errno = EINVAL;
debug_return_int(0);
debug_return_mode_t(0);
}
if (lval < 0 || lval > ACCESSPERMS) {
if (errstr != NULL)
*errstr = lval < 0 ? N_("value too small") : N_("value too large");
errno = ERANGE;
debug_return_int(0);
debug_return_mode_t(0);
}
if (errstr != NULL)
*errstr = NULL;
debug_return_int((int)lval);
debug_return_mode_t((mode_t)lval);
}
int
sudo_strtomode_v1(const char *cp, const char **errstr)
{
return (int)sudo_strtomode_v2(cp, errstr);
}

View File

@@ -1,7 +1,7 @@
/*
* SPDX-License-Identifier: ISC
*
* Copyright (c) 2011-2017 Todd C. Miller <Todd.Miller@sudo.ws>
* Copyright (c) 2011-2023 Todd C. Miller <Todd.Miller@sudo.ws>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -569,6 +569,14 @@ sudo_debug_exit_time_t_v1(const char *func, const char *file, int line,
#endif
}
void
sudo_debug_exit_mode_t_v1(const char *func, const char *file, int line,
unsigned int subsys, mode_t ret)
{
sudo_debug_printf2(NULL, NULL, 0, subsys | SUDO_DEBUG_TRACE,
"<- %s @ %s:%d := %d", func, file, line, (int)ret);
}
void
sudo_debug_exit_bool_v1(const char *func, const char *file, int line,
unsigned int subsys, bool ret)
@@ -1097,6 +1105,12 @@ sudo_debug_exit_time_t_v1(const char *func, const char *file, int line,
{
}
void
sudo_debug_exit_mode_t_v1(const char *func, const char *file, int line,
unsigned int subsys, mode_t ret)
{
}
void
sudo_debug_exit_bool_v1(const char *func, const char *file, int line,
unsigned int subsys, bool ret)

View File

@@ -24,6 +24,7 @@ sudo_debug_exit_bool_v1
sudo_debug_exit_id_t_v1
sudo_debug_exit_int_v1
sudo_debug_exit_long_v1
sudo_debug_exit_mode_t_v1
sudo_debug_exit_ptr_v1
sudo_debug_exit_size_t_v1
sudo_debug_exit_ssize_t_v1
@@ -147,6 +148,7 @@ sudo_strtoid_v1
sudo_strtoid_v2
sudo_strtoidx_v1
sudo_strtomode_v1
sudo_strtomode_v2
sudo_strtonum
sudo_term_cbreak_v1
sudo_term_copy_v1