From d0dfd2128e6111b967c51136d97093d3b53ee6d6 Mon Sep 17 00:00:00 2001 From: Alan Coopersmith Date: Fri, 11 Nov 2011 21:07:30 -0800 Subject: [PATCH] Replace chk_malloc + sprintf with asprintf Includes local private copy of asprintf for OS'es without it in libc. Removes chk_malloc as no callers remain anymore. Signed-off-by: Alan Coopersmith Reviewed-by: Jeremy Huddleston --- configure.ac | 2 +- xmodmap.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++------------- xmodmap.h | 5 ++++- 3 files changed, 59 insertions(+), 17 deletions(-) diff --git a/configure.ac b/configure.ac index de88e4c..f9ebca3 100644 --- a/configure.ac +++ b/configure.ac @@ -37,7 +37,7 @@ XORG_DEFAULT_OPTIONS AC_CONFIG_HEADERS([config.h]) -AC_CHECK_FUNCS([strncasecmp]) +AC_CHECK_FUNCS([strncasecmp asprintf]) # Checks for pkg-config packages PKG_CHECK_MODULES(XMODMAP, x11 xproto >= 7.0.17) diff --git a/xmodmap.c b/xmodmap.c index f49bc33..58a8e70 100644 --- a/xmodmap.c +++ b/xmodmap.c @@ -31,6 +31,7 @@ from The Open Group. #include #include #include +#include #include "xmodmap.h" const char *ProgramName; @@ -50,16 +51,54 @@ Exit(int status) exit (status); } -void * -chk_malloc(size_t n_bytes) +static void _X_NORETURN +FatalError(const char *message) { - void *buf = malloc(n_bytes); - if (!buf) { - fprintf(stderr, "%s: Could not allocate %d bytes\n", ProgramName, (int)n_bytes); - Exit(-1); + fprintf(stderr, "%s: %s\n", ProgramName, message); + Exit(-1); +} + +#ifndef HAVE_ASPRINTF +/* sprintf variant found in newer libc's which allocates string to print to */ +static int _X_ATTRIBUTE_PRINTF(2,3) +asprintf(char ** ret, const char *format, ...) +{ + char buf[256]; + int len; + va_list ap; + + va_start(ap, format); + len = vsnprintf(buf, sizeof(buf), format, ap); + va_end(ap); + + if (len < 0) + return -1; + + if (len < sizeof(buf)) + { + *ret = strdup(buf); } - return buf; + else + { + *ret = malloc(len + 1); /* snprintf doesn't count trailing '\0' */ + if (*ret != NULL) + { + va_start(ap, format); + len = vsnprintf(*ret, len + 1, format, ap); + va_end(ap); + if (len < 0) { + free(*ret); + *ret = NULL; + } + } + } + + if (*ret == NULL) + return -1; + + return len; } +#endif /* HAVE_ASPRINTF */ static const char help_message[] = "\nwhere options include:\n" @@ -247,11 +286,11 @@ main(int argc, char *argv[]) char *cmd; didAnything = True; if (++i >= argc) usage (); - cmd = chk_malloc (strlen ("remove control = ") + strlen (argv[i]) + 1); - (void) sprintf (cmd, "remove %s = %s", + if (asprintf (&cmd, "remove %s = %s", ((arg[1] == 's') ? "shift" : ((arg[1] == 'l') ? "lock" : - "control")), argv[i]); + "control")), argv[i]) == -1) + FatalError("Could not allocate memory for remove cmd"); process_line (cmd); continue; } @@ -269,8 +308,8 @@ main(int argc, char *argv[]) char *cmd; didAnything = True; if (++i >= argc) usage (); - cmd = chk_malloc (strlen ("add modX = ") + strlen (argv[i]) + 1); - (void) sprintf (cmd, "add mod%c = %s", arg[1], argv[i]); + if (asprintf (&cmd, "add mod%c = %s", arg[1], argv[i]) == -1) + FatalError("Could not allocate memory for add cmd"); process_line (cmd); continue; } @@ -285,11 +324,11 @@ main(int argc, char *argv[]) char *cmd; didAnything = True; if (++i >= argc) usage (); - cmd = chk_malloc (strlen ("add control = ") + strlen (argv[i]) + 1); - (void) sprintf (cmd, "add %s = %s", + if (asprintf (&cmd, "add %s = %s", ((arg[1] == 's') ? "shift" : ((arg[1] == 'l') ? "lock" : - "control")), argv[i]); + "control")), argv[i]) == -1) + FatalError("Could not allocate memory for remove cmd"); process_line (cmd); continue; } diff --git a/xmodmap.h b/xmodmap.h index 1540b2a..686ee1b 100644 --- a/xmodmap.h +++ b/xmodmap.h @@ -26,6 +26,10 @@ from The Open Group. */ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + extern const char *ProgramName; extern Display *dpy; extern int min_keycode, max_keycode; @@ -56,4 +60,3 @@ extern void PrintPointerMap(FILE *fp); extern int SetPointerMap(unsigned char *map, int n); extern void _X_NORETURN Exit(int status); -extern void *chk_malloc(size_t n_bytes); -- 2.7.4