xref: /openbsd/usr.bin/diff/xmalloc.c (revision 7d5bbbe3)
1*7d5bbbe3Sderaadt /* $OpenBSD: xmalloc.c,v 1.10 2019/06/28 05:44:09 deraadt Exp $ */
24a034c3aSray /*
34a034c3aSray  * Author: Tatu Ylonen <ylo@cs.hut.fi>
44a034c3aSray  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
54a034c3aSray  *                    All rights reserved
64a034c3aSray  * Versions of malloc and friends that check their results, and never return
74a034c3aSray  * failure (they call fatal if they encounter an error).
84a034c3aSray  *
94a034c3aSray  * As far as I am concerned, the code I have written for this software
104a034c3aSray  * can be used freely for any purpose.  Any derived versions of this
114a034c3aSray  * software must be clearly marked as such, and if the derived work is
124a034c3aSray  * incompatible with the protocol description in the RFC file, it must be
134a034c3aSray  * called by a name other than "ssh" or "Secure Shell".
144a034c3aSray  */
154a034c3aSray 
164a034c3aSray #include <err.h>
174a034c3aSray #include <stdarg.h>
181357284aSmillert #include <stdint.h>
194a034c3aSray #include <stdio.h>
204a034c3aSray #include <stdlib.h>
214a034c3aSray #include <string.h>
224a034c3aSray 
234a034c3aSray #include "xmalloc.h"
244a034c3aSray 
254a034c3aSray void *
xmalloc(size_t size)264a034c3aSray xmalloc(size_t size)
274a034c3aSray {
284a034c3aSray 	void *ptr;
294a034c3aSray 
306d42169eStobias 	if (size == 0)
316d42169eStobias 		errx(2, "xmalloc: zero size");
324a034c3aSray 	ptr = malloc(size);
334a034c3aSray 	if (ptr == NULL)
346d42169eStobias 		err(2, "xmalloc: allocating %zu bytes", size);
354a034c3aSray 	return ptr;
364a034c3aSray }
374a034c3aSray 
384a034c3aSray void *
xcalloc(size_t nmemb,size_t size)3957003866Sray xcalloc(size_t nmemb, size_t size)
4057003866Sray {
4157003866Sray 	void *ptr;
4257003866Sray 
4357003866Sray 	ptr = calloc(nmemb, size);
4457003866Sray 	if (ptr == NULL)
456d42169eStobias 		err(2, "xcalloc: allocating %zu * %zu bytes", nmemb, size);
4657003866Sray 	return ptr;
4757003866Sray }
4857003866Sray 
4957003866Sray void *
xreallocarray(void * ptr,size_t nmemb,size_t size)50371275caSderaadt xreallocarray(void *ptr, size_t nmemb, size_t size)
514a034c3aSray {
524a034c3aSray 	void *new_ptr;
534a034c3aSray 
54371275caSderaadt 	new_ptr = reallocarray(ptr, nmemb, size);
554a034c3aSray 	if (new_ptr == NULL)
566d42169eStobias 		err(2, "xreallocarray: allocating %zu * %zu bytes",
576d42169eStobias 		    nmemb, size);
584a034c3aSray 	return new_ptr;
594a034c3aSray }
604a034c3aSray 
614a034c3aSray char *
xstrdup(const char * str)624a034c3aSray xstrdup(const char *str)
634a034c3aSray {
644a034c3aSray 	char *cp;
654a034c3aSray 
66839dd609Snicm 	if ((cp = strdup(str)) == NULL)
676d42169eStobias 		err(2, "xstrdup");
684a034c3aSray 	return cp;
694a034c3aSray }
704a034c3aSray 
714a034c3aSray int
xasprintf(char ** ret,const char * fmt,...)724a034c3aSray xasprintf(char **ret, const char *fmt, ...)
734a034c3aSray {
744a034c3aSray 	va_list ap;
754a034c3aSray 	int i;
764a034c3aSray 
774a034c3aSray 	va_start(ap, fmt);
784a034c3aSray 	i = vasprintf(ret, fmt, ap);
794a034c3aSray 	va_end(ap);
804a034c3aSray 
81*7d5bbbe3Sderaadt 	if (i == -1)
82a79a2617Stedu 		err(2, "xasprintf");
834a034c3aSray 
846d42169eStobias 	return i;
854a034c3aSray }
86