From 4fe3688bc68f77686d2061ee9240509e7158441c Mon Sep 17 00:00:00 2001 From: Guus Sliepen Date: Sat, 7 Oct 2017 16:59:30 +0200 Subject: [PATCH 1/1] Remove xmalloc.c, backport xalloc.h from tinc 1.1. We are requiring a C99-compliant compiler, so we don't need to work around buggy malloc() implementations. --- src/Makefile.am | 3 +- src/process.c | 7 -- src/xalloc.h | 95 ++++++++++++++++++++------- src/xmalloc.c | 168 ------------------------------------------------ 4 files changed, 73 insertions(+), 200 deletions(-) delete mode 100644 src/xmalloc.c diff --git a/src/Makefile.am b/src/Makefile.am index 0b28139e..11f701cc 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -44,8 +44,7 @@ tincd_SOURCES = \ subnet.c subnet.h \ tincd.c \ utils.c utils.h \ - xalloc.h \ - xmalloc.c + xalloc.h if !GETOPT tincd_SOURCES += \ diff --git a/src/process.c b/src/process.c index 807e7839..bd85a80f 100644 --- a/src/process.c +++ b/src/process.c @@ -47,11 +47,6 @@ extern bool use_logfile; static sigset_t emptysigset; #endif -static void memory_full(int size) { - logger(LOG_ERR, "Memory exhausted (couldn't allocate %d bytes), exitting.", size); - exit(1); -} - /* Some functions the less gifted operating systems might lack... */ #ifdef HAVE_MINGW @@ -342,8 +337,6 @@ bool detach(void) { logger(LOG_NOTICE, "tincd %s starting, debug level %d", VERSION, debug_level); - xalloc_fail_func = memory_full; - return true; } diff --git a/src/xalloc.h b/src/xalloc.h index 952f9217..e75f1bb5 100644 --- a/src/xalloc.h +++ b/src/xalloc.h @@ -1,29 +1,78 @@ -#include - -#ifndef PARAMS -# if defined PROTOTYPES || (defined __STDC__ && __STDC__) -# define PARAMS(Args) Args -# else -# define PARAMS(Args) () -# endif -#endif +/* + xalloc.h -- malloc and related fuctions with out of memory checking + Copyright (C) 1990, 91, 92, 93, 94, 95, 96, 97 Free Software Foundation, Inc. + Copyright (C) 2011-2017 Guus Sliepen + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., Foundation, + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -/* Exit value when the requested amount of memory is not available. - The caller may set it to some other value. */ -extern int xalloc_exit_failure; +#ifndef __TINC_XALLOC_H__ +#define __TINC_XALLOC_H__ -/* FIXME: describe */ -extern char *const xalloc_msg_memory_exhausted; +static inline void *xmalloc(size_t n) __attribute__ ((__malloc__)); +static inline void *xmalloc(size_t n) { + void *p = malloc(n); + if(!p) + abort(); + return p; +} -/* FIXME: describe */ -extern void (*xalloc_fail_func) (int); +static inline void *xmalloc_and_zero(size_t n) __attribute__ ((__malloc__)); +static inline void *xmalloc_and_zero(size_t n) { + void *p = calloc(1, n); + if(!p) + abort(); + return p; +} -void *xmalloc PARAMS ((size_t n)) __attribute__ ((__malloc__)); -void *xmalloc_and_zero PARAMS ((size_t n)) __attribute__ ((__malloc__)); -void *xcalloc PARAMS ((size_t n, size_t s)); -void *xrealloc PARAMS ((void *p, size_t n)) __attribute__ ((__malloc__)); +static inline void *xrealloc(void *p, size_t n) { + p = realloc(p, n); + if(!p) + abort(); + return p; +} -char *xstrdup PARAMS ((const char *s)) __attribute__ ((__malloc__)); +static inline char *xstrdup(const char *s) __attribute__ ((__malloc__)); +static inline char *xstrdup(const char *s) { + char *p = strdup(s); + if(!p) + abort(); + return p; +} -extern int xasprintf(char **strp, const char *fmt, ...); -extern int xvasprintf(char **strp, const char *fmt, va_list ap); +static inline int xvasprintf(char **strp, const char *fmt, va_list ap) { +#ifdef HAVE_MINGW + char buf[1024]; + int result = vsnprintf(buf, sizeof buf, fmt, ap); + if(result < 0) + abort(); + *strp = xstrdup(buf); +#else + int result = vasprintf(strp, fmt, ap); + if(result < 0) + abort(); +#endif + return result; +} + +static inline int xasprintf(char **strp, const char *fmt, ...) __attribute__ ((__format__(printf, 2, 3))); +static inline int xasprintf(char **strp, const char *fmt, ...) { + va_list ap; + va_start(ap, fmt); + int result = xvasprintf(strp, fmt, ap); + va_end(ap); + return result; +} + +#endif diff --git a/src/xmalloc.c b/src/xmalloc.c deleted file mode 100644 index 1f354dd1..00000000 --- a/src/xmalloc.c +++ /dev/null @@ -1,168 +0,0 @@ -/* xmalloc.c -- malloc with out of memory checking - Copyright (C) 1990, 91, 92, 93, 94, 95, 96, 97 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., Foundation, - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ - -#if HAVE_CONFIG_H -# include "config.h" -#endif - -#include -#include -#include -#include -#include - -#if STDC_HEADERS -# include -#else -void *calloc (); -void *malloc (); -void *realloc (); -void free (); -#endif - -#include "dropin.h" -#include "xalloc.h" - -#ifndef EXIT_FAILURE -# define EXIT_FAILURE 1 -#endif - -/* Prototypes for functions defined here. */ -#if defined (__STDC__) && __STDC__ -void *xmalloc (size_t n); -void *xcalloc (size_t n, size_t s); -void *xrealloc (void *p, size_t n); -#endif - -/* Exit value when the requested amount of memory is not available. - The caller may set it to some other value. */ -int xalloc_exit_failure = EXIT_FAILURE; - -/* FIXME: describe */ -char *const xalloc_msg_memory_exhausted = "Memory exhausted"; - -/* FIXME: describe */ -void (*xalloc_fail_func) (int) = NULL; - -static void -xalloc_fail (int size) -{ - if (xalloc_fail_func) - (*xalloc_fail_func) (size); - fprintf(stderr, "%s\n", xalloc_msg_memory_exhausted); - exit(xalloc_exit_failure); -} - -/* Allocate N bytes of memory dynamically, with error checking. */ - -void * -xmalloc (size_t n) -{ - void *p; - - p = malloc (n); - if (p == NULL) - xalloc_fail ((int)n); - return p; -} - -/* Allocate N bytes of memory dynamically, and set it all to zero. */ - -void * -xmalloc_and_zero (size_t n) -{ - void *p; - - p = malloc (n); - if (p == NULL) - xalloc_fail ((int)n); - memset (p, '\0', n); - return p; -} - -/* Change the size of an allocated block of memory P to N bytes, - with error checking. - If P is NULL, run xmalloc. */ - -void * -xrealloc (void *p, size_t n) -{ - p = realloc (p, n); - if (p == NULL) - xalloc_fail (n); - return p; -} - -/* Duplicate a string */ - -char *xstrdup(const char *s) -{ - char *p; - - if(!s) - return NULL; - - p = strdup(s); - if(!p) - xalloc_fail ((int)strlen(s)); - return p; -} - -#ifdef NOT_USED - -/* Allocate memory for N elements of S bytes, with error checking. */ - -void * -xcalloc (n, s) - size_t n, s; -{ - void *p; - - p = calloc (n, s); - if (p == NULL) - xalloc_fail (); - return p; -} - -#endif /* NOT_USED */ - -int xasprintf(char **strp, const char *fmt, ...) { - int result; - va_list ap; - va_start(ap, fmt); - result = xvasprintf(strp, fmt, ap); - va_end(ap); - return result; -} - -int xvasprintf(char **strp, const char *fmt, va_list ap) { -#ifdef HAVE_MINGW - char buf[1024]; - int result = vsnprintf(buf, sizeof buf, fmt, ap); - if(result < 0) - exit(xalloc_exit_failure); - buf[sizeof buf - 1] = 0; - *strp = xstrdup(buf); -#else - int result = vasprintf(strp, fmt, ap); - if(result < 0) { - fprintf(stderr, "vasprintf() failed: %s\n", strerror(errno)); - exit(xalloc_exit_failure); - } -#endif - return result; -} -- 2.20.1