1*7d5bbbe3Sderaadt /* $OpenBSD: xmalloc.c,v 1.4 2019/06/28 05:44:09 deraadt Exp $ */
2ff772f70Snicm /*
3ff772f70Snicm * Author: Tatu Ylonen <ylo@cs.hut.fi>
4ff772f70Snicm * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
5ff772f70Snicm * All rights reserved
6ff772f70Snicm * Versions of malloc and friends that check their results, and never return
7ff772f70Snicm * failure (they call fatal if they encounter an error).
8ff772f70Snicm *
9ff772f70Snicm * As far as I am concerned, the code I have written for this software
10ff772f70Snicm * can be used freely for any purpose. Any derived versions of this
11ff772f70Snicm * software must be clearly marked as such, and if the derived work is
12ff772f70Snicm * incompatible with the protocol description in the RFC file, it must be
13ff772f70Snicm * called by a name other than "ssh" or "Secure Shell".
14ff772f70Snicm */
15ff772f70Snicm
16ff772f70Snicm #include <err.h>
17ff772f70Snicm #include <stdarg.h>
18ff772f70Snicm #include <stdint.h>
19ff772f70Snicm #include <stdio.h>
20ff772f70Snicm #include <stdlib.h>
21ff772f70Snicm #include <string.h>
22ff772f70Snicm
23ff772f70Snicm #include "xmalloc.h"
24ff772f70Snicm
25ff772f70Snicm void *
xmalloc(size_t size)26ff772f70Snicm xmalloc(size_t size)
27ff772f70Snicm {
28ff772f70Snicm void *ptr;
29ff772f70Snicm
30ff772f70Snicm if (size == 0)
31ff772f70Snicm errx(1, "xmalloc: zero size");
32ff772f70Snicm ptr = malloc(size);
33ff772f70Snicm if (ptr == NULL)
346d42169eStobias err(1, "xmalloc: allocating %zu bytes", size);
35ff772f70Snicm return ptr;
36ff772f70Snicm }
37ff772f70Snicm
38ff772f70Snicm void *
xcalloc(size_t nmemb,size_t size)39ff772f70Snicm xcalloc(size_t nmemb, size_t size)
40ff772f70Snicm {
41ff772f70Snicm void *ptr;
42ff772f70Snicm
43ff772f70Snicm if (size == 0 || nmemb == 0)
44ff772f70Snicm errx(1, "xcalloc: zero size");
45ff772f70Snicm ptr = calloc(nmemb, size);
46ff772f70Snicm if (ptr == NULL)
476d42169eStobias err(1, "xcalloc: allocating %zu * %zu bytes", nmemb, size);
48ff772f70Snicm return ptr;
49ff772f70Snicm }
50ff772f70Snicm
51ff772f70Snicm void *
xreallocarray(void * ptr,size_t nmemb,size_t size)52ff772f70Snicm xreallocarray(void *ptr, size_t nmemb, size_t size)
53ff772f70Snicm {
54ff772f70Snicm void *new_ptr;
55ff772f70Snicm
56ff772f70Snicm new_ptr = reallocarray(ptr, nmemb, size);
57ff772f70Snicm if (new_ptr == NULL)
586d42169eStobias err(1, "xreallocarray: allocating %zu * %zu bytes",
596d42169eStobias nmemb, size);
60ff772f70Snicm return new_ptr;
61ff772f70Snicm }
62ff772f70Snicm
63ff772f70Snicm char *
xstrdup(const char * str)64ff772f70Snicm xstrdup(const char *str)
65ff772f70Snicm {
66ff772f70Snicm char *cp;
67ff772f70Snicm
688b5c96daSnicm if ((cp = strdup(str)) == NULL)
698b5c96daSnicm err(1, "xstrdup");
70ff772f70Snicm return cp;
71ff772f70Snicm }
72ff772f70Snicm
73ff772f70Snicm int
xasprintf(char ** ret,const char * fmt,...)74ff772f70Snicm xasprintf(char **ret, const char *fmt, ...)
75ff772f70Snicm {
76ff772f70Snicm va_list ap;
77ff772f70Snicm int i;
78ff772f70Snicm
79ff772f70Snicm va_start(ap, fmt);
80ff772f70Snicm i = vasprintf(ret, fmt, ap);
81ff772f70Snicm va_end(ap);
82ff772f70Snicm
83*7d5bbbe3Sderaadt if (i == -1)
846d42169eStobias err(1, "xasprintf");
85ff772f70Snicm
866d42169eStobias return i;
87ff772f70Snicm }
88