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