1 /* $OpenBSD: xmalloc.c,v 1.8 2007/02/22 06:42:10 otto Exp $ */ 2 /* 3 * Author: Tatu Ylonen <ylo@cs.hut.fi> 4 * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland 5 * All rights reserved 6 * Versions of malloc and friends that check their results, and never return 7 * failure (they call fatal if they encounter an error). 8 * 9 * As far as I am concerned, the code I have written for this software 10 * can be used freely for any purpose. Any derived versions of this 11 * software must be clearly marked as such, and if the derived work is 12 * incompatible with the protocol description in the RFC file, it must be 13 * called by a name other than "ssh" or "Secure Shell". 14 */ 15 16 #include <limits.h> 17 #include <stdio.h> 18 #include <stdlib.h> 19 #include <string.h> 20 21 #include "log.h" 22 #include "xmalloc.h" 23 24 void * 25 xmalloc(size_t size) 26 { 27 void *ptr; 28 29 if (size == 0) 30 fatal("xmalloc: zero size"); 31 ptr = malloc(size); 32 if (ptr == NULL) 33 fatal("xmalloc: out of memory (allocating %lu bytes)", (u_long) size); 34 return ptr; 35 } 36 37 void * 38 xcalloc(size_t nmemb, size_t size) 39 { 40 void *ptr; 41 42 if (size == 0 || nmemb == 0) 43 fatal("xcalloc: zero size"); 44 if (SIZE_T_MAX / nmemb < size) 45 fatal("xcalloc: nmemb * size > SIZE_T_MAX"); 46 ptr = calloc(nmemb, size); 47 if (ptr == NULL) 48 fatal("xcalloc: out of memory (allocating %lu bytes)", 49 (u_long)(size * nmemb)); 50 return ptr; 51 } 52 53 void * 54 xrealloc(void *ptr, size_t nmemb, size_t size) 55 { 56 void *new_ptr; 57 size_t new_size = nmemb * size; 58 59 if (new_size == 0) 60 fatal("xrealloc: zero size"); 61 if (SIZE_T_MAX / nmemb < size) 62 fatal("xrealloc: nmemb * size > SIZE_T_MAX"); 63 if (ptr == NULL) 64 new_ptr = malloc(new_size); 65 else 66 new_ptr = realloc(ptr, new_size); 67 if (new_ptr == NULL) 68 fatal("xrealloc: out of memory (new_size %lu bytes)", 69 (u_long) new_size); 70 return new_ptr; 71 } 72 73 void 74 xfree(void *ptr) 75 { 76 if (ptr == NULL) 77 fatal("xfree: NULL pointer given as argument"); 78 free(ptr); 79 } 80 81 char * 82 xstrdup(const char *str) 83 { 84 size_t len; 85 char *cp; 86 87 len = strlen(str) + 1; 88 cp = xmalloc(len); 89 strlcpy(cp, str, len); 90 return cp; 91 } 92 93 int 94 xasprintf(char **ret, const char *fmt, ...) 95 { 96 va_list ap; 97 int i; 98 99 va_start(ap, fmt); 100 i = vasprintf(ret, fmt, ap); 101 va_end(ap); 102 103 if (i < 0 || *ret == NULL) 104 fatal("xasprintf: could not allocate memory"); 105 106 return (i); 107 } 108 109 int 110 xsnprintf(char *str, size_t size, const char *fmt, ...) 111 { 112 va_list ap; 113 int i; 114 115 va_start(ap, fmt); 116 i = vsnprintf(str, size, fmt, ap); 117 va_end(ap); 118 119 if (i == -1 || i >= (int)size) 120 fatal("xsnprintf: overflow"); 121 122 return (i); 123 } 124