xref: /openbsd-src/usr.bin/tmux/xmalloc.c (revision 18b1287e91faeee1e1b773686284365f28cb56d3)
1*18b1287eSnicm /* $OpenBSD: xmalloc.c,v 1.13 2019/11/28 09:51:58 nicm Exp $ */
2311827fbSnicm 
3311827fbSnicm /*
43baad57eSnicm  * Author: Tatu Ylonen <ylo@cs.hut.fi>
53baad57eSnicm  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
63baad57eSnicm  *                    All rights reserved
73baad57eSnicm  * Versions of malloc and friends that check their results, and never return
83449c87dSnicm  * failure (they call fatalx if they encounter an error).
9311827fbSnicm  *
103baad57eSnicm  * As far as I am concerned, the code I have written for this software
113baad57eSnicm  * can be used freely for any purpose.  Any derived versions of this
123baad57eSnicm  * software must be clearly marked as such, and if the derived work is
133baad57eSnicm  * incompatible with the protocol description in the RFC file, it must be
143baad57eSnicm  * called by a name other than "ssh" or "Secure Shell".
15311827fbSnicm  */
16311827fbSnicm 
173baad57eSnicm #include <errno.h>
183baad57eSnicm #include <limits.h>
19311827fbSnicm #include <stdint.h>
203baad57eSnicm #include <stdio.h>
21311827fbSnicm #include <stdlib.h>
22311827fbSnicm #include <string.h>
23311827fbSnicm 
24311827fbSnicm #include "tmux.h"
25311827fbSnicm 
263baad57eSnicm void *
xmalloc(size_t size)273baad57eSnicm xmalloc(size_t size)
28311827fbSnicm {
293baad57eSnicm 	void *ptr;
30311827fbSnicm 
313baad57eSnicm 	if (size == 0)
323449c87dSnicm 		fatalx("xmalloc: zero size");
333baad57eSnicm 	ptr = malloc(size);
343baad57eSnicm 	if (ptr == NULL)
353449c87dSnicm 		fatalx("xmalloc: allocating %zu bytes: %s",
363baad57eSnicm 		    size, strerror(errno));
373baad57eSnicm 	return ptr;
38311827fbSnicm }
39311827fbSnicm 
40311827fbSnicm void *
xcalloc(size_t nmemb,size_t size)41311827fbSnicm xcalloc(size_t nmemb, size_t size)
42311827fbSnicm {
43311827fbSnicm 	void *ptr;
44311827fbSnicm 
45311827fbSnicm 	if (size == 0 || nmemb == 0)
463449c87dSnicm 		fatalx("xcalloc: zero size");
473baad57eSnicm 	ptr = calloc(nmemb, size);
483baad57eSnicm 	if (ptr == NULL)
493449c87dSnicm 		fatalx("xcalloc: allocating %zu * %zu bytes: %s",
503baad57eSnicm 		    nmemb, size, strerror(errno));
513baad57eSnicm 	return ptr;
52311827fbSnicm }
53311827fbSnicm 
54311827fbSnicm void *
xrealloc(void * ptr,size_t size)553baad57eSnicm xrealloc(void *ptr, size_t size)
56311827fbSnicm {
573baad57eSnicm 	return xreallocarray(ptr, 1, size);
58311827fbSnicm }
59311827fbSnicm 
60311827fbSnicm void *
xreallocarray(void * ptr,size_t nmemb,size_t size)613baad57eSnicm xreallocarray(void *ptr, size_t nmemb, size_t size)
6264cf113cSnicm {
633baad57eSnicm 	void *new_ptr;
64311827fbSnicm 
656d42169eStobias 	if (nmemb == 0 || size == 0)
663449c87dSnicm 		fatalx("xreallocarray: zero size");
673baad57eSnicm 	new_ptr = reallocarray(ptr, nmemb, size);
683baad57eSnicm 	if (new_ptr == NULL)
693449c87dSnicm 		fatalx("xreallocarray: allocating %zu * %zu bytes: %s",
703baad57eSnicm 		    nmemb, size, strerror(errno));
713baad57eSnicm 	return new_ptr;
723baad57eSnicm }
73311827fbSnicm 
74*18b1287eSnicm void *
xrecallocarray(void * ptr,size_t oldnmemb,size_t nmemb,size_t size)75*18b1287eSnicm xrecallocarray(void *ptr, size_t oldnmemb, size_t nmemb, size_t size)
76*18b1287eSnicm {
77*18b1287eSnicm 	void *new_ptr;
78*18b1287eSnicm 
79*18b1287eSnicm 	if (nmemb == 0 || size == 0)
80*18b1287eSnicm 		fatalx("xrecallocarray: zero size");
81*18b1287eSnicm 	new_ptr = recallocarray(ptr, oldnmemb, nmemb, size);
82*18b1287eSnicm 	if (new_ptr == NULL)
83*18b1287eSnicm 		fatalx("xrecallocarray: allocating %zu * %zu bytes: %s",
84*18b1287eSnicm 		    nmemb, size, strerror(errno));
85*18b1287eSnicm 	return new_ptr;
86*18b1287eSnicm }
87*18b1287eSnicm 
883baad57eSnicm char *
xstrdup(const char * str)893baad57eSnicm xstrdup(const char *str)
903baad57eSnicm {
913baad57eSnicm 	char *cp;
923baad57eSnicm 
933baad57eSnicm 	if ((cp = strdup(str)) == NULL)
943449c87dSnicm 		fatalx("xstrdup: %s", strerror(errno));
953baad57eSnicm 	return cp;
96311827fbSnicm }
97311827fbSnicm 
98700b11ffSnicm char *
xstrndup(const char * str,size_t maxlen)99700b11ffSnicm xstrndup(const char *str, size_t maxlen)
100700b11ffSnicm {
101700b11ffSnicm 	char *cp;
102700b11ffSnicm 
103700b11ffSnicm 	if ((cp = strndup(str, maxlen)) == NULL)
104700b11ffSnicm 		fatalx("xstrndup: %s", strerror(errno));
105700b11ffSnicm 	return cp;
106700b11ffSnicm }
107700b11ffSnicm 
10874d4b937Snicm int
xasprintf(char ** ret,const char * fmt,...)109311827fbSnicm xasprintf(char **ret, const char *fmt, ...)
110311827fbSnicm {
111311827fbSnicm 	va_list ap;
112311827fbSnicm 	int i;
113311827fbSnicm 
114311827fbSnicm 	va_start(ap, fmt);
115311827fbSnicm 	i = xvasprintf(ret, fmt, ap);
116311827fbSnicm 	va_end(ap);
117311827fbSnicm 
1183baad57eSnicm 	return i;
119311827fbSnicm }
120311827fbSnicm 
121311827fbSnicm int
xvasprintf(char ** ret,const char * fmt,va_list ap)122311827fbSnicm xvasprintf(char **ret, const char *fmt, va_list ap)
123311827fbSnicm {
124311827fbSnicm 	int i;
125311827fbSnicm 
126311827fbSnicm 	i = vasprintf(ret, fmt, ap);
127311827fbSnicm 
1287d5bbbe3Sderaadt 	if (i == -1)
1293449c87dSnicm 		fatalx("xasprintf: %s", strerror(errno));
1303baad57eSnicm 
1313baad57eSnicm 	return i;
132311827fbSnicm }
133311827fbSnicm 
13474d4b937Snicm int
xsnprintf(char * str,size_t len,const char * fmt,...)1353baad57eSnicm xsnprintf(char *str, size_t len, const char *fmt, ...)
136311827fbSnicm {
137311827fbSnicm 	va_list ap;
138311827fbSnicm 	int i;
139311827fbSnicm 
140311827fbSnicm 	va_start(ap, fmt);
1413baad57eSnicm 	i = xvsnprintf(str, len, fmt, ap);
142311827fbSnicm 	va_end(ap);
143311827fbSnicm 
1443baad57eSnicm 	return i;
145311827fbSnicm }
146311827fbSnicm 
147311827fbSnicm int
xvsnprintf(char * str,size_t len,const char * fmt,va_list ap)1483baad57eSnicm xvsnprintf(char *str, size_t len, const char *fmt, va_list ap)
149311827fbSnicm {
150311827fbSnicm 	int i;
151311827fbSnicm 
152311827fbSnicm 	if (len > INT_MAX)
1533449c87dSnicm 		fatalx("xsnprintf: len > INT_MAX");
154311827fbSnicm 
1553baad57eSnicm 	i = vsnprintf(str, len, fmt, ap);
1563baad57eSnicm 
1576d42169eStobias 	if (i < 0 || i >= (int)len)
1583449c87dSnicm 		fatalx("xsnprintf: overflow");
159311827fbSnicm 
1603baad57eSnicm 	return i;
161311827fbSnicm }
162