From fd410d4bcbb6ab37dceb1448c0106e27bd0588ca Mon Sep 17 00:00:00 2001 From: "Todd C. Miller" Date: Thu, 22 Jul 1999 16:22:47 +0000 Subject: [PATCH] add easprintf() and evasprintf(), error checking versions of asprintf() and vasprintf() --- alloc.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++++- sudo.h | 2 ++ 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/alloc.c b/alloc.c index 9e98f55e6..e3dc1af62 100644 --- a/alloc.c +++ b/alloc.c @@ -40,8 +40,10 @@ #if defined(HAVE_MALLOC_H) && !defined(STDC_HEADERS) #include #endif /* HAVE_MALLOC_H && !STDC_HEADERS */ +#include +#include -#include "compat.h" +#include "sudo.h" #ifndef STDC_HEADERS #if !defined(__GNUC__) && !defined(HAVE_MALLOC_H) @@ -107,3 +109,53 @@ estrdup(src) } return(dst); } + +/* + * easprintf() calls vasprintf() and exits with an error if vasprintf() + * returns -1 (out of memory). + */ +void +#ifdef __STDC__ +easprintf(char **ret, const char *fmt, ...) +#else +easprintf(va_alist) + va_dcl +#endif +{ + int len; + va_list ap; +#ifdef __STDC__ + va_start(ap, fmt); +#else + char **ret; + const char *fmt; + + va_start(ap); + ret = va_arg(ap, char **); + fmt = va_arg(ap, const char *); +#endif + len = vasprintf(ret, fmt, ap); + va_end(ap); + + if (len == -1) { + (void) fprintf(stderr, "%s: cannot allocate memory!\n", Argv[0]); + exit(1); + } +} + +/* + * evasprintf() calls vasprintf() and exits with an error if vasprintf() + * returns -1 (out of memory). + */ +void +evasprintf(ret, format, args) + char **ret; + const char *format; + va_list args; +{ + + if (vasprintf(ret, format, args) == -1) { + (void) fprintf(stderr, "%s: cannot allocate memory!\n", Argv[0]); + exit(1); + } +} diff --git a/sudo.h b/sudo.h index 0d43313d9..68c3e44ef 100644 --- a/sudo.h +++ b/sudo.h @@ -154,6 +154,8 @@ void pass_warn __P((FILE *)); VOID *emalloc __P((size_t)); VOID *erealloc __P((VOID *, size_t)); char *estrdup __P((const char *)); +void easprintf __P((char **, const char *, ...)); +void evasprintf __P((char **, const char *, va_list)); YY_DECL; /* Only provide extern declarations outside of sudo.c. */ -- 2.50.1