1 /* 2 * Prototypes for malloc routines with failure handling. 3 * 4 * The canonical version of this file is maintained in the rra-c-util package, 5 * which can be found at <http://www.eyrie.org/~eagle/software/rra-c-util/>. 6 * 7 * Copyright 2010, 2012, 2013, 2014 8 * The Board of Trustees of the Leland Stanford Junior University 9 * Copyright (c) 2004, 2005, 2006 10 * by Internet Systems Consortium, Inc. ("ISC") 11 * Copyright (c) 1991, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 12 * 2002, 2003 by The Internet Software Consortium and Rich Salz 13 * 14 * This code is derived from software contributed to the Internet Software 15 * Consortium by Rich Salz. 16 * 17 * Permission to use, copy, modify, and distribute this software for any 18 * purpose with or without fee is hereby granted, provided that the above 19 * copyright notice and this permission notice appear in all copies. 20 * 21 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH 22 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 23 * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, 24 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 25 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 26 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 27 * PERFORMANCE OF THIS SOFTWARE. 28 */ 29 30 #ifndef UTIL_XMALLOC_H 31 #define UTIL_XMALLOC_H 1 32 33 #include <config.h> 34 #include <portable/macros.h> 35 36 #include <stdarg.h> 37 #include <stddef.h> 38 39 /* 40 * The functions are actually macros so that we can pick up the file and line 41 * number information for debugging error messages without the user having to 42 * pass those in every time. 43 */ 44 #define xcalloc(n, size) x_calloc((n), (size), __FILE__, __LINE__) 45 #define xmalloc(size) x_malloc((size), __FILE__, __LINE__) 46 #define xrealloc(p, size) x_realloc((p), (size), __FILE__, __LINE__) 47 #define xstrdup(p) x_strdup((p), __FILE__, __LINE__) 48 #define xstrndup(p, size) x_strndup((p), (size), __FILE__, __LINE__) 49 #define xvasprintf(p, f, a) x_vasprintf((p), (f), (a), __FILE__, __LINE__) 50 #define xreallocarray(p, n, size) \ 51 x_reallocarray((p), (n), (size), __FILE__, __LINE__) 52 53 /* 54 * asprintf is a special case since it takes variable arguments. If we have 55 * support for variadic macros, we can still pass in the file and line and 56 * just need to put them somewhere else in the argument list than last. 57 * Otherwise, just call x_asprintf directly. This means that the number of 58 * arguments x_asprintf takes must vary depending on whether variadic macros 59 * are supported. 60 */ 61 #ifdef HAVE_C99_VAMACROS 62 # define xasprintf(p, f, ...) \ 63 x_asprintf((p), __FILE__, __LINE__, (f), __VA_ARGS__) 64 #elif HAVE_GNU_VAMACROS 65 # define xasprintf(p, f, args...) \ 66 x_asprintf((p), __FILE__, __LINE__, (f), args) 67 #else 68 # define xasprintf x_asprintf 69 #endif 70 71 BEGIN_DECLS 72 73 /* Default to a hidden visibility for all util functions. */ 74 #pragma GCC visibility push(hidden) 75 76 /* 77 * Last two arguments are always file and line number. These are internal 78 * implementations that should not be called directly. 79 */ 80 void *x_calloc(size_t, size_t, const char *, int) 81 __attribute__((__alloc_size__(1, 2), __malloc__, __nonnull__)); 82 void *x_malloc(size_t, const char *, int) 83 __attribute__((__alloc_size__(1), __malloc__, __nonnull__)); 84 void *x_realloc(void *, size_t, const char *, int) 85 __attribute__((__alloc_size__(2), __malloc__, __nonnull__(3))); 86 void *x_reallocarray(void *, size_t, size_t, const char *, int) 87 __attribute__((__alloc_size__(2, 3), __malloc__, __nonnull__(4))); 88 char *x_strdup(const char *, const char *, int) 89 __attribute__((__malloc__, __nonnull__)); 90 char *x_strndup(const char *, size_t, const char *, int) 91 __attribute__((__malloc__, __nonnull__)); 92 void x_vasprintf(char **, const char *, va_list, const char *, int) 93 __attribute__((__nonnull__, __format__(printf, 2, 0))); 94 95 /* asprintf special case. */ 96 #if HAVE_C99_VAMACROS || HAVE_GNU_VAMACROS 97 void x_asprintf(char **, const char *, int, const char *, ...) 98 __attribute__((__nonnull__, __format__(printf, 4, 5))); 99 #else 100 void x_asprintf(char **, const char *, ...) 101 __attribute__((__nonnull__, __format__(printf, 2, 3))); 102 #endif 103 104 /* 105 * Failure handler takes the function, the size, the file, and the line. The 106 * size will be zero if the failure was due to some failure in snprintf 107 * instead of a memory allocation failure. 108 */ 109 typedef void (*xmalloc_handler_type)(const char *, size_t, const char *, int); 110 111 /* The default error handler. */ 112 void xmalloc_fail(const char *, size_t, const char *, int) 113 __attribute__((__nonnull__)); 114 115 /* 116 * Assign to this variable to choose a handler other than the default, which 117 * just calls sysdie. 118 */ 119 extern xmalloc_handler_type xmalloc_error_handler; 120 121 /* Undo default visibility change. */ 122 #pragma GCC visibility pop 123 124 END_DECLS 125 126 #endif /* UTIL_XMALLOC_H */ 127