1*f9eac425SBaptiste Daroussin /* $OpenBSD: xmalloc.c,v 1.10 2019/06/28 05:44:09 deraadt Exp $ */
23bbe3f67SBaptiste Daroussin /*
33bbe3f67SBaptiste Daroussin * Author: Tatu Ylonen <[email protected]>
43bbe3f67SBaptiste Daroussin * Copyright (c) 1995 Tatu Ylonen <[email protected]>, 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 <sys/cdefs.h>
173bbe3f67SBaptiste Daroussin #include <err.h>
183bbe3f67SBaptiste Daroussin #include <stdarg.h>
193bbe3f67SBaptiste Daroussin #include <stdint.h>
203bbe3f67SBaptiste Daroussin #include <stdio.h>
213bbe3f67SBaptiste Daroussin #include <stdlib.h>
223bbe3f67SBaptiste Daroussin #include <string.h>
233bbe3f67SBaptiste Daroussin
243bbe3f67SBaptiste Daroussin #include "xmalloc.h"
253bbe3f67SBaptiste Daroussin
263bbe3f67SBaptiste Daroussin void *
xmalloc(size_t size)273bbe3f67SBaptiste Daroussin xmalloc(size_t size)
283bbe3f67SBaptiste Daroussin {
293bbe3f67SBaptiste Daroussin void *ptr;
303bbe3f67SBaptiste Daroussin
313bbe3f67SBaptiste Daroussin if (size == 0)
323bbe3f67SBaptiste Daroussin errx(2, "xmalloc: zero size");
333bbe3f67SBaptiste Daroussin ptr = malloc(size);
343bbe3f67SBaptiste Daroussin if (ptr == NULL)
353bbe3f67SBaptiste Daroussin err(2, "xmalloc: allocating %zu bytes", size);
363bbe3f67SBaptiste Daroussin return ptr;
373bbe3f67SBaptiste Daroussin }
383bbe3f67SBaptiste Daroussin
393bbe3f67SBaptiste Daroussin void *
xcalloc(size_t nmemb,size_t size)403bbe3f67SBaptiste Daroussin xcalloc(size_t nmemb, size_t size)
413bbe3f67SBaptiste Daroussin {
423bbe3f67SBaptiste Daroussin void *ptr;
433bbe3f67SBaptiste Daroussin
443bbe3f67SBaptiste Daroussin ptr = calloc(nmemb, size);
453bbe3f67SBaptiste Daroussin if (ptr == NULL)
463bbe3f67SBaptiste Daroussin err(2, "xcalloc: allocating %zu * %zu bytes", nmemb, size);
473bbe3f67SBaptiste Daroussin return ptr;
483bbe3f67SBaptiste Daroussin }
493bbe3f67SBaptiste Daroussin
503bbe3f67SBaptiste Daroussin void *
xreallocarray(void * ptr,size_t nmemb,size_t size)513bbe3f67SBaptiste Daroussin xreallocarray(void *ptr, size_t nmemb, size_t size)
523bbe3f67SBaptiste Daroussin {
533bbe3f67SBaptiste Daroussin void *new_ptr;
543bbe3f67SBaptiste Daroussin
553bbe3f67SBaptiste Daroussin new_ptr = reallocarray(ptr, nmemb, size);
563bbe3f67SBaptiste Daroussin if (new_ptr == NULL)
573bbe3f67SBaptiste Daroussin err(2, "xreallocarray: allocating %zu * %zu bytes",
583bbe3f67SBaptiste Daroussin nmemb, size);
593bbe3f67SBaptiste Daroussin return new_ptr;
603bbe3f67SBaptiste Daroussin }
613bbe3f67SBaptiste Daroussin
623bbe3f67SBaptiste Daroussin char *
xstrdup(const char * str)633bbe3f67SBaptiste Daroussin xstrdup(const char *str)
643bbe3f67SBaptiste Daroussin {
653bbe3f67SBaptiste Daroussin char *cp;
663bbe3f67SBaptiste Daroussin
673bbe3f67SBaptiste Daroussin if ((cp = strdup(str)) == NULL)
683bbe3f67SBaptiste Daroussin err(2, "xstrdup");
693bbe3f67SBaptiste Daroussin return cp;
703bbe3f67SBaptiste Daroussin }
713bbe3f67SBaptiste Daroussin
723bbe3f67SBaptiste Daroussin int
xasprintf(char ** ret,const char * fmt,...)733bbe3f67SBaptiste Daroussin xasprintf(char **ret, const char *fmt, ...)
743bbe3f67SBaptiste Daroussin {
753bbe3f67SBaptiste Daroussin va_list ap;
763bbe3f67SBaptiste Daroussin int i;
773bbe3f67SBaptiste Daroussin
783bbe3f67SBaptiste Daroussin va_start(ap, fmt);
793bbe3f67SBaptiste Daroussin i = vasprintf(ret, fmt, ap);
803bbe3f67SBaptiste Daroussin va_end(ap);
813bbe3f67SBaptiste Daroussin
82*f9eac425SBaptiste Daroussin if (i == -1)
833bbe3f67SBaptiste Daroussin err(2, "xasprintf");
843bbe3f67SBaptiste Daroussin
853bbe3f67SBaptiste Daroussin return i;
863bbe3f67SBaptiste Daroussin }
87