1*7d5bbbe3Sderaadt /* $OpenBSD: xmalloc.c,v 1.14 2019/06/28 05:44:09 deraadt Exp $ */
20450b43bSjoris /*
30450b43bSjoris * Author: Tatu Ylonen <ylo@cs.hut.fi>
40450b43bSjoris * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
50450b43bSjoris * All rights reserved
62e0e138cSray * Versions of malloc and friends that check their results, and never return
70450b43bSjoris * failure (they call fatal if they encounter an error).
80450b43bSjoris *
90450b43bSjoris * As far as I am concerned, the code I have written for this software
100450b43bSjoris * can be used freely for any purpose. Any derived versions of this
110450b43bSjoris * software must be clearly marked as such, and if the derived work is
120450b43bSjoris * incompatible with the protocol description in the RFC file, it must be
130450b43bSjoris * called by a name other than "ssh" or "Secure Shell".
140450b43bSjoris */
150450b43bSjoris
166d42169eStobias #include <errno.h>
176d42169eStobias #include <limits.h>
181357284aSmillert #include <stdint.h>
191f8531bdSotto #include <stdio.h>
201f8531bdSotto #include <stdlib.h>
211f8531bdSotto #include <string.h>
220450b43bSjoris
23270b3c3bSxsa #include "log.h"
241f8531bdSotto #include "xmalloc.h"
250450b43bSjoris
260450b43bSjoris void *
xmalloc(size_t size)270450b43bSjoris xmalloc(size_t size)
280450b43bSjoris {
290450b43bSjoris void *ptr;
300450b43bSjoris
310450b43bSjoris if (size == 0)
320450b43bSjoris fatal("xmalloc: zero size");
330450b43bSjoris ptr = malloc(size);
340450b43bSjoris if (ptr == NULL)
356d42169eStobias fatal("xmalloc: allocating %zu bytes: %s",
366d42169eStobias size, strerror(errno));
370450b43bSjoris return ptr;
380450b43bSjoris }
390450b43bSjoris
400450b43bSjoris void *
xcalloc(size_t nmemb,size_t size)412e0e138cSray xcalloc(size_t nmemb, size_t size)
422e0e138cSray {
432e0e138cSray void *ptr;
442e0e138cSray
452e0e138cSray if (size == 0 || nmemb == 0)
462e0e138cSray fatal("xcalloc: zero size");
472e0e138cSray ptr = calloc(nmemb, size);
482e0e138cSray if (ptr == NULL)
496d42169eStobias fatal("xcalloc: allocating %zu * %zu bytes: %s",
506d42169eStobias nmemb, size, strerror(errno));
512e0e138cSray return ptr;
522e0e138cSray }
532e0e138cSray
542e0e138cSray void *
xreallocarray(void * ptr,size_t nmemb,size_t size)55caa2ffb0Sderaadt xreallocarray(void *ptr, size_t nmemb, size_t size)
560450b43bSjoris {
570450b43bSjoris void *new_ptr;
580450b43bSjoris
596d42169eStobias if (nmemb == 0 || size == 0)
606d42169eStobias fatal("xreallocarray: zero size");
616d42169eStobias new_ptr = reallocarray(ptr, nmemb, size);
620450b43bSjoris if (new_ptr == NULL)
636d42169eStobias fatal("xreallocarray: allocating %zu * %zu bytes: %s",
646d42169eStobias nmemb, size, strerror(errno));
650450b43bSjoris return new_ptr;
660450b43bSjoris }
670450b43bSjoris
680450b43bSjoris char *
xstrdup(const char * str)690450b43bSjoris xstrdup(const char *str)
700450b43bSjoris {
710450b43bSjoris char *cp;
720450b43bSjoris
736d42169eStobias if ((cp = strdup(str)) == NULL)
746d42169eStobias fatal("xstrdup: %s", strerror(errno));
750450b43bSjoris return cp;
760450b43bSjoris }
772e0e138cSray
782e0e138cSray int
xasprintf(char ** ret,const char * fmt,...)792e0e138cSray xasprintf(char **ret, const char *fmt, ...)
802e0e138cSray {
812e0e138cSray va_list ap;
822e0e138cSray int i;
832e0e138cSray
842e0e138cSray va_start(ap, fmt);
852e0e138cSray i = vasprintf(ret, fmt, ap);
862e0e138cSray va_end(ap);
872e0e138cSray
88*7d5bbbe3Sderaadt if (i == -1)
896d42169eStobias fatal("xasprintf: %s", strerror(errno));
902e0e138cSray
916d42169eStobias return i;
922e0e138cSray }
93005d0989Sxsa
94005d0989Sxsa int
xsnprintf(char * str,size_t len,const char * fmt,...)956d42169eStobias xsnprintf(char *str, size_t len, const char *fmt, ...)
96005d0989Sxsa {
97005d0989Sxsa va_list ap;
98005d0989Sxsa int i;
99005d0989Sxsa
1006d42169eStobias if (len > INT_MAX)
1016d42169eStobias fatal("xsnprintf: len > INT_MAX");
1026d42169eStobias
103005d0989Sxsa va_start(ap, fmt);
1046d42169eStobias i = vsnprintf(str, len, fmt, ap);
105005d0989Sxsa va_end(ap);
106005d0989Sxsa
1076d42169eStobias if (i < 0 || i >= (int)len)
108005d0989Sxsa fatal("xsnprintf: overflow");
109005d0989Sxsa
1106d42169eStobias return i;
111005d0989Sxsa }
112