Skip to content

Commit

Permalink
Give every printf like function __restrict for the format value
Browse files Browse the repository at this point in the history
The format value has to be a string literal, every time.

Otherwise, you are not using these functions correctly. To reinforce this fact, I putrestrict over every non-contrib example of this I could find.
  • Loading branch information
AreaZR committed Jul 7, 2023
1 parent 92860c7 commit 57ff627
Show file tree
Hide file tree
Showing 48 changed files with 145 additions and 145 deletions.
12 changes: 6 additions & 6 deletions include/sudo_compat.h
Original file line number Diff line number Diff line change
Expand Up @@ -422,32 +422,32 @@ sudo_dso_public int sudo_futimens(int fd, const struct timespec *times);
# define futimens(_a, _b) sudo_futimens((_a), (_b))
#endif /* HAVE_FUTIMENS */
#if !defined(HAVE_SNPRINTF) || defined(PREFER_PORTABLE_SNPRINTF)
sudo_dso_public int sudo_snprintf(char *str, size_t n, char const *fmt, ...) sudo_printflike(3, 4);
sudo_dso_public int sudo_snprintf(char * restrict str, size_t n, char const * restrict fmt, ...) sudo_printflike(3, 4);
# undef snprintf
# define snprintf sudo_snprintf
#endif /* HAVE_SNPRINTF */
#if !defined(HAVE_VSNPRINTF) || defined(PREFER_PORTABLE_SNPRINTF)
sudo_dso_public int sudo_vsnprintf(char *str, size_t n, const char *fmt, va_list ap) sudo_printflike(3, 0);
sudo_dso_public int sudo_vsnprintf(char * restrict str, size_t n, const char * restrict fmt, va_list ap) sudo_printflike(3, 0);
# undef vsnprintf
# define vsnprintf sudo_vsnprintf
#endif /* HAVE_VSNPRINTF */
#if !defined(HAVE_ASPRINTF) || defined(PREFER_PORTABLE_SNPRINTF)
sudo_dso_public int sudo_asprintf(char **str, char const *fmt, ...) sudo_printflike(2, 3);
sudo_dso_public int sudo_asprintf(char ** restrict str, char const * restrict fmt, ...) sudo_printflike(2, 3);
# undef asprintf
# define asprintf sudo_asprintf
#endif /* HAVE_ASPRINTF */
#if !defined(HAVE_VASPRINTF) || defined(PREFER_PORTABLE_SNPRINTF)
sudo_dso_public int sudo_vasprintf(char **str, const char *fmt, va_list ap) sudo_printflike(2, 0);
sudo_dso_public int sudo_vasprintf(char ** restrict str, const char * restrict fmt, va_list ap) sudo_printflike(2, 0);
# undef vasprintf
# define vasprintf sudo_vasprintf
#endif /* HAVE_VASPRINTF */
#ifndef HAVE_STRLCAT
sudo_dso_public size_t sudo_strlcat(char *dst, const char *src, size_t siz);
sudo_dso_public size_t sudo_strlcat(char * restrict dst, const char * restrict src, size_t siz);
# undef strlcat
# define strlcat(_a, _b, _c) sudo_strlcat((_a), (_b), (_c))
#endif /* HAVE_STRLCAT */
#ifndef HAVE_STRLCPY
sudo_dso_public size_t sudo_strlcpy(char *dst, const char *src, size_t siz);
sudo_dso_public size_t sudo_strlcpy(char * restrict dst, const char * restrict src, size_t siz);
# undef strlcpy
# define strlcpy(_a, _b, _c) sudo_strlcpy((_a), (_b), (_c))
#endif /* HAVE_STRLCPY */
Expand Down
6 changes: 3 additions & 3 deletions include/sudo_debug.h
Original file line number Diff line number Diff line change
Expand Up @@ -274,13 +274,13 @@ sudo_dso_public int sudo_debug_get_active_instance_v1(void);
sudo_dso_public int sudo_debug_get_fds_v1(unsigned char **fds);
sudo_dso_public int sudo_debug_get_instance_v1(const char *program);
sudo_dso_public int sudo_debug_parse_flags_v1(struct sudo_conf_debug_file_list *debug_files, const char *entry);
sudo_dso_public void sudo_debug_printf2_v1(const char *func, const char *file, int line, unsigned int level, const char *fmt, ...) sudo_printf0like(5, 6);
sudo_dso_public void sudo_debug_printf_nvm_v1(int pri, const char *fmt, ...) sudo_printf0like(2, 3);
sudo_dso_public void sudo_debug_printf2_v1(const char *func, const char *file, int line, unsigned int level, const char * restrict fmt, ...) sudo_printf0like(5, 6);
sudo_dso_public void sudo_debug_printf_nvm_v1(int pri, const char * restrict fmt, ...) sudo_printf0like(2, 3);
sudo_dso_public int sudo_debug_register_v1(const char *program, const char *const subsystems[], unsigned int ids[], struct sudo_conf_debug_file_list *debug_files);
sudo_dso_public int sudo_debug_register_v2(const char *program, const char *const subsystems[], unsigned int ids[], struct sudo_conf_debug_file_list *debug_files, int minfd);
sudo_dso_public int sudo_debug_set_active_instance_v1(int inst);
sudo_dso_public void sudo_debug_update_fd_v1(int ofd, int nfd);
sudo_dso_public void sudo_debug_vprintf2_v1(const char *func, const char *file, int line, unsigned int level, const char *fmt, va_list ap) sudo_printf0like(5, 0);
sudo_dso_public void sudo_debug_vprintf2_v1(const char *func, const char *file, int line, unsigned int level, const char * restrict fmt, va_list ap) sudo_printf0like(5, 0);
sudo_dso_public void sudo_debug_write2_v1(int fd, const char *func, const char *file, int line, const char *str, unsigned int len, int errnum);
sudo_dso_public bool sudo_debug_needed_v1(unsigned int level);

Expand Down
24 changes: 12 additions & 12 deletions include/sudo_fatal.h
Original file line number Diff line number Diff line change
Expand Up @@ -171,18 +171,18 @@ sudo_dso_public int sudo_fatal_callback_deregister_v1(sudo_fatal_callback_t fun
sudo_dso_public int sudo_fatal_callback_register_v1(sudo_fatal_callback_t func);
sudo_dso_public char *sudo_warn_gettext_v1(const char *domainname, const char *msgid) sudo_attr_fmt_arg(2);
sudo_dso_public void sudo_warn_set_locale_func_v1(sudo_warn_setlocale_t func);
sudo_noreturn sudo_dso_public void sudo_fatal_nodebug_v1(const char *fmt, ...) sudo_printf0like(1, 2);
sudo_noreturn sudo_dso_public void sudo_fatalx_nodebug_v1(const char *fmt, ...) sudo_printflike(1, 2);
sudo_noreturn sudo_dso_public void sudo_gai_fatal_nodebug_v1(int errnum, const char *fmt, ...) sudo_printflike(2, 3);
sudo_noreturn sudo_dso_public void sudo_vfatal_nodebug_v1(const char *fmt, va_list ap) sudo_printf0like(1, 0);
sudo_noreturn sudo_dso_public void sudo_vfatalx_nodebug_v1(const char *fmt, va_list ap) sudo_printflike(1, 0);
sudo_noreturn sudo_dso_public void sudo_gai_vfatal_nodebug_v1(int errnum, const char *fmt, va_list ap) sudo_printflike(2, 0);
sudo_dso_public void sudo_warn_nodebug_v1(const char *fmt, ...) sudo_printf0like(1, 2);
sudo_dso_public void sudo_warnx_nodebug_v1(const char *fmt, ...) sudo_printflike(1, 2);
sudo_dso_public void sudo_gai_warn_nodebug_v1(int errnum, const char *fmt, ...) sudo_printflike(2, 3);
sudo_dso_public void sudo_vwarn_nodebug_v1(const char *fmt, va_list ap) sudo_printf0like(1, 0);
sudo_dso_public void sudo_vwarnx_nodebug_v1(const char *fmt, va_list ap) sudo_printflike(1, 0);
sudo_dso_public void sudo_gai_vwarn_nodebug_v1(int errnum, const char *fmt, va_list ap) sudo_printflike(2, 0);
sudo_noreturn sudo_dso_public void sudo_fatal_nodebug_v1(const char * restrict fmt, ...) sudo_printf0like(1, 2);
sudo_noreturn sudo_dso_public void sudo_fatalx_nodebug_v1(const char * restrict fmt, ...) sudo_printflike(1, 2);
sudo_noreturn sudo_dso_public void sudo_gai_fatal_nodebug_v1(int errnum, const char * restrict fmt, ...) sudo_printflike(2, 3);
sudo_noreturn sudo_dso_public void sudo_vfatal_nodebug_v1(const char * restrict fmt, va_list ap) sudo_printf0like(1, 0);
sudo_noreturn sudo_dso_public void sudo_vfatalx_nodebug_v1(const char * restrict fmt, va_list ap) sudo_printflike(1, 0);
sudo_noreturn sudo_dso_public void sudo_gai_vfatal_nodebug_v1(int errnum, const char * restrict fmt, va_list ap) sudo_printflike(2, 0);
sudo_dso_public void sudo_warn_nodebug_v1(const char * restrict fmt, ...) sudo_printf0like(1, 2);
sudo_dso_public void sudo_warnx_nodebug_v1(const char * restrict fmt, ...) sudo_printflike(1, 2);
sudo_dso_public void sudo_gai_warn_nodebug_v1(int errnum, const char * restrict fmt, ...) sudo_printflike(2, 3);
sudo_dso_public void sudo_vwarn_nodebug_v1(const char * restrict fmt, va_list ap) sudo_printf0like(1, 0);
sudo_dso_public void sudo_vwarnx_nodebug_v1(const char * restrict fmt, va_list ap) sudo_printflike(1, 0);
sudo_dso_public void sudo_gai_vwarn_nodebug_v1(int errnum, const char * restrict fmt, va_list ap) sudo_printflike(2, 0);
sudo_dso_public void sudo_warn_set_conversation_v1(sudo_conv_t conv);

#define sudo_fatal_callback_deregister(_a) sudo_fatal_callback_deregister_v1((_a))
Expand Down
6 changes: 3 additions & 3 deletions include/sudo_lbuf.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,9 @@ typedef int (*sudo_lbuf_output_t)(const char *);

sudo_dso_public void sudo_lbuf_init_v1(struct sudo_lbuf *lbuf, sudo_lbuf_output_t output, unsigned int indent, const char *continuation, int cols);
sudo_dso_public void sudo_lbuf_destroy_v1(struct sudo_lbuf *lbuf);
sudo_dso_public bool sudo_lbuf_append_v1(struct sudo_lbuf *lbuf, const char *fmt, ...) sudo_printflike(2, 3);
sudo_dso_public bool sudo_lbuf_append_esc_v1(struct sudo_lbuf *lbuf, int flags, const char *fmt, ...) sudo_printflike(3, 4);
sudo_dso_public bool sudo_lbuf_append_quoted_v1(struct sudo_lbuf *lbuf, const char *set, const char *fmt, ...) sudo_printflike(3, 4);
sudo_dso_public bool sudo_lbuf_append_v1(struct sudo_lbuf *lbuf, const char * restrict fmt, ...) sudo_printflike(2, 3);
sudo_dso_public bool sudo_lbuf_append_esc_v1(struct sudo_lbuf *lbuf, int flags, const char * restrict fmt, ...) sudo_printflike(3, 4);
sudo_dso_public bool sudo_lbuf_append_quoted_v1(struct sudo_lbuf *lbuf, const char *set, const char * restrict fmt, ...) sudo_printflike(3, 4);
sudo_dso_public void sudo_lbuf_print_v1(struct sudo_lbuf *lbuf);
sudo_dso_public bool sudo_lbuf_error_v1(struct sudo_lbuf *lbuf);
sudo_dso_public void sudo_lbuf_clearerr_v1(struct sudo_lbuf *lbuf);
Expand Down
2 changes: 1 addition & 1 deletion include/sudo_plugin.h
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ struct sudo_conv_callback {

typedef int (*sudo_conv_t)(int num_msgs, const struct sudo_conv_message msgs[],
struct sudo_conv_reply replies[], struct sudo_conv_callback *callback);
typedef int (*sudo_printf_t)(int msg_type, const char *fmt, ...);
typedef int (*sudo_printf_t)(int msg_type, const char * restrict fmt, ...);

/*
* Hooks allow a plugin to hook into specific sudo and/or libc functions.
Expand Down
2 changes: 1 addition & 1 deletion include/sudo_util.h
Original file line number Diff line number Diff line change
Expand Up @@ -316,7 +316,7 @@ 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, ...);
extern int (*sudo_printf)(int msg_type, const char * restrict fmt, ...);

/* term.c */
sudo_dso_public bool sudo_term_cbreak_v1(int fd);
Expand Down
2 changes: 1 addition & 1 deletion lib/eventlog/logwrap.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
#include "sudo_eventlog.h"

size_t
eventlog_writeln(FILE *fp, char *line, size_t linelen, size_t maxlen)
eventlog_writeln(FILE * restrict fp, char * restrict line, size_t linelen, size_t maxlen)
{
const char *indent = "";
char *beg = line;
Expand Down
28 changes: 14 additions & 14 deletions lib/util/fatal.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ static sudo_conv_t sudo_warn_conversation;
static sudo_warn_setlocale_t sudo_warn_setlocale;
static sudo_warn_setlocale_t sudo_warn_setlocale_prev;

static void warning(const char *errstr, const char *fmt, va_list ap);
static void warning(const char * restrict errstr, const char * restrict fmt, va_list ap);

static void
do_cleanup(void)
Expand All @@ -73,7 +73,7 @@ do_cleanup(void)
}

sudo_noreturn void
sudo_fatal_nodebug_v1(const char *fmt, ...)
sudo_fatal_nodebug_v1(const char * restrict fmt, ...)
{
va_list ap;

Expand All @@ -85,7 +85,7 @@ sudo_fatal_nodebug_v1(const char *fmt, ...)
}

sudo_noreturn void
sudo_fatalx_nodebug_v1(const char *fmt, ...)
sudo_fatalx_nodebug_v1(const char * restrict fmt, ...)
{
va_list ap;

Expand All @@ -97,23 +97,23 @@ sudo_fatalx_nodebug_v1(const char *fmt, ...)
}

sudo_noreturn void
sudo_vfatal_nodebug_v1(const char *fmt, va_list ap)
sudo_vfatal_nodebug_v1(const char * restrict fmt, va_list ap)
{
warning(strerror(errno), fmt, ap);
do_cleanup();
exit(EXIT_FAILURE);
}

sudo_noreturn void
sudo_vfatalx_nodebug_v1(const char *fmt, va_list ap)
sudo_vfatalx_nodebug_v1(const char * restrict fmt, va_list ap)
{
warning(NULL, fmt, ap);
do_cleanup();
exit(EXIT_FAILURE);
}

void
sudo_warn_nodebug_v1(const char *fmt, ...)
sudo_warn_nodebug_v1(const char * restrict fmt, ...)
{
va_list ap;

Expand All @@ -123,7 +123,7 @@ sudo_warn_nodebug_v1(const char *fmt, ...)
}

void
sudo_warnx_nodebug_v1(const char *fmt, ...)
sudo_warnx_nodebug_v1(const char * restrict fmt, ...)
{
va_list ap;
va_start(ap, fmt);
Expand All @@ -132,19 +132,19 @@ sudo_warnx_nodebug_v1(const char *fmt, ...)
}

void
sudo_vwarn_nodebug_v1(const char *fmt, va_list ap)
sudo_vwarn_nodebug_v1(const char * restrict fmt, va_list ap)
{
warning(strerror(errno), fmt, ap);
}

void
sudo_vwarnx_nodebug_v1(const char *fmt, va_list ap)
sudo_vwarnx_nodebug_v1(const char * restrict fmt, va_list ap)
{
warning(NULL, fmt, ap);
}

sudo_noreturn void
sudo_gai_fatal_nodebug_v1(int errnum, const char *fmt, ...)
sudo_gai_fatal_nodebug_v1(int errnum, const char * restrict fmt, ...)
{
va_list ap;

Expand All @@ -156,15 +156,15 @@ sudo_gai_fatal_nodebug_v1(int errnum, const char *fmt, ...)
}

sudo_noreturn void
sudo_gai_vfatal_nodebug_v1(int errnum, const char *fmt, va_list ap)
sudo_gai_vfatal_nodebug_v1(int errnum, const char * restrict fmt, va_list ap)
{
warning(gai_strerror(errnum), fmt, ap);
do_cleanup();
exit(EXIT_FAILURE);
}

void
sudo_gai_warn_nodebug_v1(int errnum, const char *fmt, ...)
sudo_gai_warn_nodebug_v1(int errnum, const char * restrict fmt, ...)
{
va_list ap;

Expand All @@ -174,13 +174,13 @@ sudo_gai_warn_nodebug_v1(int errnum, const char *fmt, ...)
}

void
sudo_gai_vwarn_nodebug_v1(int errnum, const char *fmt, va_list ap)
sudo_gai_vwarn_nodebug_v1(int errnum, const char * restrict fmt, va_list ap)
{
warning(gai_strerror(errnum), fmt, ap);
}

static void
warning(const char *errstr, const char *fmt, va_list ap)
warning(const char * restrict errstr, const char * restrict fmt, va_list ap)
{
int cookie;
const int saved_errno = errno;
Expand Down
6 changes: 3 additions & 3 deletions lib/util/inet_ntop.c
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@
* Paul Vixie, 1996.
*/
static const char *
inet_ntop4(const unsigned char *src, char *dst, socklen_t size)
inet_ntop4(const unsigned char * restrict src, char * restrict dst, socklen_t size)
{
const char fmt[] = "%u.%u.%u.%u";
int len;
Expand All @@ -91,7 +91,7 @@ inet_ntop4(const unsigned char *src, char *dst, socklen_t size)
* Paul Vixie, 1996.
*/
static const char *
inet_ntop6(const unsigned char *src, char *dst, socklen_t size)
inet_ntop6(const unsigned char * restrict src, char * restrict dst, socklen_t size)
{
/*
* Note that int32_t and int16_t need only be "at least" large enough
Expand Down Expand Up @@ -210,7 +210,7 @@ inet_ntop6(const unsigned char *src, char *dst, socklen_t size)
* Paul Vixie, 1996.
*/
const char *
sudo_inet_ntop(int af, const void *src, char *dst, socklen_t size)
sudo_inet_ntop(int af, const void * restrict src, char * restrict dst, socklen_t size)
{
switch (af) {
case AF_INET:
Expand Down
6 changes: 3 additions & 3 deletions lib/util/lbuf.c
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ escape(char ch, char *buf)
* Any non-printable characters are escaped in octal as #0nn.
*/
bool
sudo_lbuf_append_esc_v1(struct sudo_lbuf *lbuf, int flags, const char *fmt, ...)
sudo_lbuf_append_esc_v1(struct sudo_lbuf *lbuf, int flags, const char * restrict fmt, ...)
{
unsigned int saved_len = lbuf->len;
bool ret = false;
Expand Down Expand Up @@ -220,7 +220,7 @@ sudo_lbuf_append_esc_v1(struct sudo_lbuf *lbuf, int flags, const char *fmt, ...)
* Any characters in set are quoted with a backslash.
*/
bool
sudo_lbuf_append_quoted_v1(struct sudo_lbuf *lbuf, const char *set, const char *fmt, ...)
sudo_lbuf_append_quoted_v1(struct sudo_lbuf *lbuf, const char *set, const char * restrict fmt, ...)
{
unsigned int saved_len = lbuf->len;
bool ret = false;
Expand Down Expand Up @@ -279,7 +279,7 @@ sudo_lbuf_append_quoted_v1(struct sudo_lbuf *lbuf, const char *set, const char *
* Parse the format and append strings, only %s, %n$s and %% escapes are supported.
*/
bool
sudo_lbuf_append_v1(struct sudo_lbuf *lbuf, const char *fmt, ...)
sudo_lbuf_append_v1(struct sudo_lbuf *lbuf, const char * restrict fmt, ...)
{
unsigned int saved_len = lbuf->len;
bool ret = false;
Expand Down
14 changes: 7 additions & 7 deletions lib/util/snprintf.c
Original file line number Diff line number Diff line change
Expand Up @@ -106,9 +106,9 @@ union arg {
#endif
};

static int __find_arguments(const char *fmt0, va_list ap, union arg **argtable);
static int __find_arguments(const char * restrict fmt0, va_list ap, union arg **argtable);
static int __grow_type_table(unsigned char **typetable, int *tablesize);
static int xxxprintf(char **, size_t, int, const char *, va_list);
static int xxxprintf(char ** restrict, size_t, int, const char * restrict, va_list);

#ifdef PRINTF_WIDE_CHAR
/*
Expand Down Expand Up @@ -224,7 +224,7 @@ static int exponent(char *, int, int);
* Actual printf innards.
*/
static int
xxxprintf(char **strp, size_t strsize, int alloc, const char *fmt0, va_list ap)
xxxprintf(char ** restrict strp, size_t strsize, int alloc, const char * restrict fmt0, va_list ap)
{
char *fmt; /* format string */
int ch; /* character from fmt */
Expand Down Expand Up @@ -1484,7 +1484,7 @@ exponent(char *p0, int exp, int fmtch)

#if !defined(HAVE_VSNPRINTF) || defined(PREFER_PORTABLE_SNPRINTF)
int
sudo_vsnprintf(char *str, size_t n, const char *fmt, va_list ap)
sudo_vsnprintf(char * restrict str, size_t n, const char * restrict fmt, va_list ap)
{
if (n > INT_MAX) {
errno = EOVERFLOW;
Expand All @@ -1497,7 +1497,7 @@ sudo_vsnprintf(char *str, size_t n, const char *fmt, va_list ap)

#if !defined(HAVE_SNPRINTF) || defined(PREFER_PORTABLE_SNPRINTF)
int
sudo_snprintf(char *str, size_t n, char const *fmt, ...)
sudo_snprintf(char * restrict str, size_t n, char const * restrict fmt, ...)
{
int ret;
va_list ap;
Expand All @@ -1516,7 +1516,7 @@ sudo_snprintf(char *str, size_t n, char const *fmt, ...)

#if !defined(HAVE_VASPRINTF) || defined(PREFER_PORTABLE_SNPRINTF)
int
sudo_vasprintf(char **str, const char *fmt, va_list ap)
sudo_vasprintf(char ** restrict str, const char * restrict fmt, va_list ap)
{
int ret;

Expand All @@ -1529,7 +1529,7 @@ sudo_vasprintf(char **str, const char *fmt, va_list ap)

#if !defined(HAVE_ASPRINTF) || defined(PREFER_PORTABLE_SNPRINTF)
int
sudo_asprintf(char **str, char const *fmt, ...)
sudo_asprintf(char ** restrict str, char const * restrict fmt, ...)
{
int ret;
va_list ap;
Expand Down
2 changes: 1 addition & 1 deletion lib/util/strlcat.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
* If retval >= dsize, truncation occurred.
*/
size_t
sudo_strlcat(char *dst, const char *src, size_t dsize)
sudo_strlcat(char * restrict dst, const char * restrict src, size_t dsize)
{
const char *odst = dst;
const char *osrc = src;
Expand Down
2 changes: 1 addition & 1 deletion lib/util/strlcpy.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
* Returns strlen(src); if retval >= dsize, truncation occurred.
*/
size_t
sudo_strlcpy(char *dst, const char *src, size_t dsize)
sudo_strlcpy(char * restrict dst, const char * restrict src, size_t dsize)
{
const char *osrc = src;
size_t nleft = dsize;
Expand Down
Loading

0 comments on commit 57ff627

Please sign in to comment.