xref: /openbsd-src/usr.bin/rcs/xmalloc.c (revision 7d5bbbe355add9c0be6e56c06f1818bf2448d48c)
1*7d5bbbe3Sderaadt /* $OpenBSD: xmalloc.c,v 1.12 2019/06/28 05:44:09 deraadt Exp $ */
22dc36bedSjoris /*
32dc36bedSjoris  * Author: Tatu Ylonen <ylo@cs.hut.fi>
42dc36bedSjoris  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
52dc36bedSjoris  *                    All rights reserved
62dc36bedSjoris  * Versions of malloc and friends that check their results, and never return
72dc36bedSjoris  * failure (they call fatal if they encounter an error).
82dc36bedSjoris  *
92dc36bedSjoris  * As far as I am concerned, the code I have written for this software
102dc36bedSjoris  * can be used freely for any purpose.  Any derived versions of this
112dc36bedSjoris  * software must be clearly marked as such, and if the derived work is
122dc36bedSjoris  * incompatible with the protocol description in the RFC file, it must be
132dc36bedSjoris  * called by a name other than "ssh" or "Secure Shell".
142dc36bedSjoris  */
152dc36bedSjoris 
164781e2faSxsa #include <err.h>
174781e2faSxsa #include <stdarg.h>
181357284aSmillert #include <stdint.h>
194781e2faSxsa #include <stdio.h>
204781e2faSxsa #include <stdlib.h>
214781e2faSxsa #include <string.h>
222dc36bedSjoris 
232dc36bedSjoris #include "xmalloc.h"
242dc36bedSjoris 
252dc36bedSjoris void *
xmalloc(size_t size)262dc36bedSjoris xmalloc(size_t size)
272dc36bedSjoris {
282dc36bedSjoris 	void *ptr;
292dc36bedSjoris 
302dc36bedSjoris 	if (size == 0)
312dc36bedSjoris 		errx(1, "xmalloc: zero size");
322dc36bedSjoris 	ptr = malloc(size);
332dc36bedSjoris 	if (ptr == NULL)
346d42169eStobias 		err(1, "xmalloc: allocating %zu bytes", size);
352dc36bedSjoris 	return ptr;
362dc36bedSjoris }
372dc36bedSjoris 
382dc36bedSjoris void *
xcalloc(size_t nmemb,size_t size)392dc36bedSjoris xcalloc(size_t nmemb, size_t size)
402dc36bedSjoris {
412dc36bedSjoris 	void *ptr;
422dc36bedSjoris 
432dc36bedSjoris 	if (size == 0 || nmemb == 0)
442dc36bedSjoris 		errx(1, "xcalloc: zero size");
452dc36bedSjoris 	ptr = calloc(nmemb, size);
462dc36bedSjoris 	if (ptr == NULL)
476d42169eStobias 		err(1, "xcalloc: allocating %zu * %zu bytes", nmemb, size);
482dc36bedSjoris 	return ptr;
492dc36bedSjoris }
502dc36bedSjoris 
512dc36bedSjoris void *
xreallocarray(void * ptr,size_t nmemb,size_t size)52caa2ffb0Sderaadt xreallocarray(void *ptr, size_t nmemb, size_t size)
532dc36bedSjoris {
542dc36bedSjoris 	void *new_ptr;
552dc36bedSjoris 
56caa2ffb0Sderaadt 	new_ptr = reallocarray(ptr, nmemb, size);
572dc36bedSjoris 	if (new_ptr == NULL)
586d42169eStobias 		err(1, "xreallocarray: allocating %zu * %zu bytes",
596d42169eStobias 		    nmemb, size);
602dc36bedSjoris 	return new_ptr;
612dc36bedSjoris }
622dc36bedSjoris 
632dc36bedSjoris char *
xstrdup(const char * str)642dc36bedSjoris xstrdup(const char *str)
652dc36bedSjoris {
662dc36bedSjoris 	char *cp;
672dc36bedSjoris 
68839dd609Snicm 	if ((cp = strdup(str)) == NULL)
69839dd609Snicm 		err(1, "xstrdup");
702dc36bedSjoris 	return cp;
712dc36bedSjoris }
722dc36bedSjoris 
732dc36bedSjoris int
xasprintf(char ** ret,const char * fmt,...)742dc36bedSjoris xasprintf(char **ret, const char *fmt, ...)
752dc36bedSjoris {
762dc36bedSjoris 	va_list ap;
772dc36bedSjoris 	int i;
782dc36bedSjoris 
792dc36bedSjoris 	va_start(ap, fmt);
802dc36bedSjoris 	i = vasprintf(ret, fmt, ap);
812dc36bedSjoris 	va_end(ap);
822dc36bedSjoris 
83*7d5bbbe3Sderaadt 	if (i == -1)
846d42169eStobias 		err(1, "xasprintf");
852dc36bedSjoris 
866d42169eStobias 	return i;
872dc36bedSjoris }
88