xref: /openbsd-src/usr.bin/cvs/xmalloc.c (revision 7d5bbbe355add9c0be6e56c06f1818bf2448d48c)
1*7d5bbbe3Sderaadt /* $OpenBSD: xmalloc.c,v 1.14 2019/06/28 05:44:09 deraadt Exp $ */
20450b43bSjoris /*
30450b43bSjoris  * Author: Tatu Ylonen <ylo@cs.hut.fi>
40450b43bSjoris  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
50450b43bSjoris  *                    All rights reserved
62e0e138cSray  * Versions of malloc and friends that check their results, and never return
70450b43bSjoris  * failure (they call fatal if they encounter an error).
80450b43bSjoris  *
90450b43bSjoris  * As far as I am concerned, the code I have written for this software
100450b43bSjoris  * can be used freely for any purpose.  Any derived versions of this
110450b43bSjoris  * software must be clearly marked as such, and if the derived work is
120450b43bSjoris  * incompatible with the protocol description in the RFC file, it must be
130450b43bSjoris  * called by a name other than "ssh" or "Secure Shell".
140450b43bSjoris  */
150450b43bSjoris 
166d42169eStobias #include <errno.h>
176d42169eStobias #include <limits.h>
181357284aSmillert #include <stdint.h>
191f8531bdSotto #include <stdio.h>
201f8531bdSotto #include <stdlib.h>
211f8531bdSotto #include <string.h>
220450b43bSjoris 
23270b3c3bSxsa #include "log.h"
241f8531bdSotto #include "xmalloc.h"
250450b43bSjoris 
260450b43bSjoris void *
xmalloc(size_t size)270450b43bSjoris xmalloc(size_t size)
280450b43bSjoris {
290450b43bSjoris 	void *ptr;
300450b43bSjoris 
310450b43bSjoris 	if (size == 0)
320450b43bSjoris 		fatal("xmalloc: zero size");
330450b43bSjoris 	ptr = malloc(size);
340450b43bSjoris 	if (ptr == NULL)
356d42169eStobias 		fatal("xmalloc: allocating %zu bytes: %s",
366d42169eStobias 		    size, strerror(errno));
370450b43bSjoris 	return ptr;
380450b43bSjoris }
390450b43bSjoris 
400450b43bSjoris void *
xcalloc(size_t nmemb,size_t size)412e0e138cSray xcalloc(size_t nmemb, size_t size)
422e0e138cSray {
432e0e138cSray 	void *ptr;
442e0e138cSray 
452e0e138cSray 	if (size == 0 || nmemb == 0)
462e0e138cSray 		fatal("xcalloc: zero size");
472e0e138cSray 	ptr = calloc(nmemb, size);
482e0e138cSray 	if (ptr == NULL)
496d42169eStobias 		fatal("xcalloc: allocating %zu * %zu bytes: %s",
506d42169eStobias 		    nmemb, size, strerror(errno));
512e0e138cSray 	return ptr;
522e0e138cSray }
532e0e138cSray 
542e0e138cSray void *
xreallocarray(void * ptr,size_t nmemb,size_t size)55caa2ffb0Sderaadt xreallocarray(void *ptr, size_t nmemb, size_t size)
560450b43bSjoris {
570450b43bSjoris 	void *new_ptr;
580450b43bSjoris 
596d42169eStobias 	if (nmemb == 0 || size == 0)
606d42169eStobias 		fatal("xreallocarray: zero size");
616d42169eStobias 	new_ptr = reallocarray(ptr, nmemb, size);
620450b43bSjoris 	if (new_ptr == NULL)
636d42169eStobias 		fatal("xreallocarray: allocating %zu * %zu bytes: %s",
646d42169eStobias 		    nmemb, size, strerror(errno));
650450b43bSjoris 	return new_ptr;
660450b43bSjoris }
670450b43bSjoris 
680450b43bSjoris char *
xstrdup(const char * str)690450b43bSjoris xstrdup(const char *str)
700450b43bSjoris {
710450b43bSjoris 	char *cp;
720450b43bSjoris 
736d42169eStobias 	if ((cp = strdup(str)) == NULL)
746d42169eStobias 		fatal("xstrdup: %s", strerror(errno));
750450b43bSjoris 	return cp;
760450b43bSjoris }
772e0e138cSray 
782e0e138cSray int
xasprintf(char ** ret,const char * fmt,...)792e0e138cSray xasprintf(char **ret, const char *fmt, ...)
802e0e138cSray {
812e0e138cSray 	va_list ap;
822e0e138cSray 	int i;
832e0e138cSray 
842e0e138cSray 	va_start(ap, fmt);
852e0e138cSray 	i = vasprintf(ret, fmt, ap);
862e0e138cSray 	va_end(ap);
872e0e138cSray 
88*7d5bbbe3Sderaadt 	if (i == -1)
896d42169eStobias 		fatal("xasprintf: %s", strerror(errno));
902e0e138cSray 
916d42169eStobias 	return i;
922e0e138cSray }
93005d0989Sxsa 
94005d0989Sxsa int
xsnprintf(char * str,size_t len,const char * fmt,...)956d42169eStobias xsnprintf(char *str, size_t len, const char *fmt, ...)
96005d0989Sxsa {
97005d0989Sxsa 	va_list ap;
98005d0989Sxsa 	int i;
99005d0989Sxsa 
1006d42169eStobias 	if (len > INT_MAX)
1016d42169eStobias 		fatal("xsnprintf: len > INT_MAX");
1026d42169eStobias 
103005d0989Sxsa 	va_start(ap, fmt);
1046d42169eStobias 	i = vsnprintf(str, len, fmt, ap);
105005d0989Sxsa 	va_end(ap);
106005d0989Sxsa 
1076d42169eStobias 	if (i < 0 || i >= (int)len)
108005d0989Sxsa 		fatal("xsnprintf: overflow");
109005d0989Sxsa 
1106d42169eStobias 	return i;
111005d0989Sxsa }
112