xref: /freebsd/usr.bin/diff/xmalloc.c (revision d9a9f23d0b3f1676d5656b76301341c0037d15b7)
1*f9eac425SBaptiste Daroussin /* $OpenBSD: xmalloc.c,v 1.10 2019/06/28 05:44:09 deraadt Exp $ */
23bbe3f67SBaptiste Daroussin /*
33bbe3f67SBaptiste Daroussin  * Author: Tatu Ylonen <ylo@cs.hut.fi>
43bbe3f67SBaptiste Daroussin  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
53bbe3f67SBaptiste Daroussin  *                    All rights reserved
63bbe3f67SBaptiste Daroussin  * Versions of malloc and friends that check their results, and never return
73bbe3f67SBaptiste Daroussin  * failure (they call fatal if they encounter an error).
83bbe3f67SBaptiste Daroussin  *
93bbe3f67SBaptiste Daroussin  * As far as I am concerned, the code I have written for this software
103bbe3f67SBaptiste Daroussin  * can be used freely for any purpose.  Any derived versions of this
113bbe3f67SBaptiste Daroussin  * software must be clearly marked as such, and if the derived work is
123bbe3f67SBaptiste Daroussin  * incompatible with the protocol description in the RFC file, it must be
133bbe3f67SBaptiste Daroussin  * called by a name other than "ssh" or "Secure Shell".
143bbe3f67SBaptiste Daroussin  */
153bbe3f67SBaptiste Daroussin 
163bbe3f67SBaptiste Daroussin #include <err.h>
173bbe3f67SBaptiste Daroussin #include <stdarg.h>
183bbe3f67SBaptiste Daroussin #include <stdint.h>
193bbe3f67SBaptiste Daroussin #include <stdio.h>
203bbe3f67SBaptiste Daroussin #include <stdlib.h>
213bbe3f67SBaptiste Daroussin #include <string.h>
223bbe3f67SBaptiste Daroussin 
233bbe3f67SBaptiste Daroussin #include "xmalloc.h"
243bbe3f67SBaptiste Daroussin 
253bbe3f67SBaptiste Daroussin void *
xmalloc(size_t size)263bbe3f67SBaptiste Daroussin xmalloc(size_t size)
273bbe3f67SBaptiste Daroussin {
283bbe3f67SBaptiste Daroussin 	void *ptr;
293bbe3f67SBaptiste Daroussin 
303bbe3f67SBaptiste Daroussin 	if (size == 0)
313bbe3f67SBaptiste Daroussin 		errx(2, "xmalloc: zero size");
323bbe3f67SBaptiste Daroussin 	ptr = malloc(size);
333bbe3f67SBaptiste Daroussin 	if (ptr == NULL)
343bbe3f67SBaptiste Daroussin 		err(2, "xmalloc: allocating %zu bytes", size);
353bbe3f67SBaptiste Daroussin 	return ptr;
363bbe3f67SBaptiste Daroussin }
373bbe3f67SBaptiste Daroussin 
383bbe3f67SBaptiste Daroussin void *
xcalloc(size_t nmemb,size_t size)393bbe3f67SBaptiste Daroussin xcalloc(size_t nmemb, size_t size)
403bbe3f67SBaptiste Daroussin {
413bbe3f67SBaptiste Daroussin 	void *ptr;
423bbe3f67SBaptiste Daroussin 
433bbe3f67SBaptiste Daroussin 	ptr = calloc(nmemb, size);
443bbe3f67SBaptiste Daroussin 	if (ptr == NULL)
453bbe3f67SBaptiste Daroussin 		err(2, "xcalloc: allocating %zu * %zu bytes", nmemb, size);
463bbe3f67SBaptiste Daroussin 	return ptr;
473bbe3f67SBaptiste Daroussin }
483bbe3f67SBaptiste Daroussin 
493bbe3f67SBaptiste Daroussin void *
xreallocarray(void * ptr,size_t nmemb,size_t size)503bbe3f67SBaptiste Daroussin xreallocarray(void *ptr, size_t nmemb, size_t size)
513bbe3f67SBaptiste Daroussin {
523bbe3f67SBaptiste Daroussin 	void *new_ptr;
533bbe3f67SBaptiste Daroussin 
543bbe3f67SBaptiste Daroussin 	new_ptr = reallocarray(ptr, nmemb, size);
553bbe3f67SBaptiste Daroussin 	if (new_ptr == NULL)
563bbe3f67SBaptiste Daroussin 		err(2, "xreallocarray: allocating %zu * %zu bytes",
573bbe3f67SBaptiste Daroussin 		    nmemb, size);
583bbe3f67SBaptiste Daroussin 	return new_ptr;
593bbe3f67SBaptiste Daroussin }
603bbe3f67SBaptiste Daroussin 
613bbe3f67SBaptiste Daroussin char *
xstrdup(const char * str)623bbe3f67SBaptiste Daroussin xstrdup(const char *str)
633bbe3f67SBaptiste Daroussin {
643bbe3f67SBaptiste Daroussin 	char *cp;
653bbe3f67SBaptiste Daroussin 
663bbe3f67SBaptiste Daroussin 	if ((cp = strdup(str)) == NULL)
673bbe3f67SBaptiste Daroussin 		err(2, "xstrdup");
683bbe3f67SBaptiste Daroussin 	return cp;
693bbe3f67SBaptiste Daroussin }
703bbe3f67SBaptiste Daroussin 
713bbe3f67SBaptiste Daroussin int
xasprintf(char ** ret,const char * fmt,...)723bbe3f67SBaptiste Daroussin xasprintf(char **ret, const char *fmt, ...)
733bbe3f67SBaptiste Daroussin {
743bbe3f67SBaptiste Daroussin 	va_list ap;
753bbe3f67SBaptiste Daroussin 	int i;
763bbe3f67SBaptiste Daroussin 
773bbe3f67SBaptiste Daroussin 	va_start(ap, fmt);
783bbe3f67SBaptiste Daroussin 	i = vasprintf(ret, fmt, ap);
793bbe3f67SBaptiste Daroussin 	va_end(ap);
803bbe3f67SBaptiste Daroussin 
81*f9eac425SBaptiste Daroussin 	if (i == -1)
823bbe3f67SBaptiste Daroussin 		err(2, "xasprintf");
833bbe3f67SBaptiste Daroussin 
843bbe3f67SBaptiste Daroussin 	return i;
853bbe3f67SBaptiste Daroussin }
86