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