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