1*d8634badSDavid van Moolenbroek /* $OpenBSD: xmalloc.c,v 1.2 2009/06/07 08:39:13 ray Exp $ */
2*d8634badSDavid van Moolenbroek /*
3*d8634badSDavid van Moolenbroek * Author: Tatu Ylonen <ylo@cs.hut.fi>
4*d8634badSDavid van Moolenbroek * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
5*d8634badSDavid van Moolenbroek * All rights reserved
6*d8634badSDavid van Moolenbroek * Versions of malloc and friends that check their results, and never return
7*d8634badSDavid van Moolenbroek * failure (they call fatal if they encounter an error).
8*d8634badSDavid van Moolenbroek *
9*d8634badSDavid van Moolenbroek * As far as I am concerned, the code I have written for this software
10*d8634badSDavid van Moolenbroek * can be used freely for any purpose. Any derived versions of this
11*d8634badSDavid van Moolenbroek * software must be clearly marked as such, and if the derived work is
12*d8634badSDavid van Moolenbroek * incompatible with the protocol description in the RFC file, it must be
13*d8634badSDavid van Moolenbroek * called by a name other than "ssh" or "Secure Shell".
14*d8634badSDavid van Moolenbroek */
15*d8634badSDavid van Moolenbroek
16*d8634badSDavid van Moolenbroek #include <err.h>
17*d8634badSDavid van Moolenbroek #include <limits.h>
18*d8634badSDavid van Moolenbroek #include <stdarg.h>
19*d8634badSDavid van Moolenbroek #include <stdint.h>
20*d8634badSDavid van Moolenbroek #include <stdio.h>
21*d8634badSDavid van Moolenbroek #include <stdlib.h>
22*d8634badSDavid van Moolenbroek #include <string.h>
23*d8634badSDavid van Moolenbroek
24*d8634badSDavid van Moolenbroek #include "xmalloc.h"
25*d8634badSDavid van Moolenbroek
26*d8634badSDavid van Moolenbroek void *
xmalloc(size_t size)27*d8634badSDavid van Moolenbroek xmalloc(size_t size)
28*d8634badSDavid van Moolenbroek {
29*d8634badSDavid van Moolenbroek void *ptr;
30*d8634badSDavid van Moolenbroek
31*d8634badSDavid van Moolenbroek if (size == 0)
32*d8634badSDavid van Moolenbroek errx(2, NULL);
33*d8634badSDavid van Moolenbroek ptr = malloc(size);
34*d8634badSDavid van Moolenbroek if (ptr == NULL)
35*d8634badSDavid van Moolenbroek errx(2, NULL);
36*d8634badSDavid van Moolenbroek return ptr;
37*d8634badSDavid van Moolenbroek }
38*d8634badSDavid van Moolenbroek
39*d8634badSDavid van Moolenbroek void *
xcalloc(size_t nmemb,size_t size)40*d8634badSDavid van Moolenbroek xcalloc(size_t nmemb, size_t size)
41*d8634badSDavid van Moolenbroek {
42*d8634badSDavid van Moolenbroek void *ptr;
43*d8634badSDavid van Moolenbroek
44*d8634badSDavid van Moolenbroek if (size == 0 || nmemb == 0)
45*d8634badSDavid van Moolenbroek errx(1, "xcalloc: zero size");
46*d8634badSDavid van Moolenbroek if (SIZE_MAX / nmemb < size)
47*d8634badSDavid van Moolenbroek errx(1, "xcalloc: nmemb * size > SIZE_MAX");
48*d8634badSDavid van Moolenbroek ptr = calloc(nmemb, size);
49*d8634badSDavid van Moolenbroek if (ptr == NULL)
50*d8634badSDavid van Moolenbroek errx(1, "xcalloc: out of memory (allocating %lu bytes)",
51*d8634badSDavid van Moolenbroek (u_long)(size * nmemb));
52*d8634badSDavid van Moolenbroek return ptr;
53*d8634badSDavid van Moolenbroek }
54*d8634badSDavid van Moolenbroek
55*d8634badSDavid van Moolenbroek void *
xrealloc(void * ptr,size_t nmemb,size_t size)56*d8634badSDavid van Moolenbroek xrealloc(void *ptr, size_t nmemb, size_t size)
57*d8634badSDavid van Moolenbroek {
58*d8634badSDavid van Moolenbroek void *new_ptr;
59*d8634badSDavid van Moolenbroek size_t new_size = nmemb * size;
60*d8634badSDavid van Moolenbroek
61*d8634badSDavid van Moolenbroek if (new_size == 0)
62*d8634badSDavid van Moolenbroek errx(2, NULL);
63*d8634badSDavid van Moolenbroek if (SIZE_MAX / nmemb < size)
64*d8634badSDavid van Moolenbroek errx(2, NULL);
65*d8634badSDavid van Moolenbroek if (ptr == NULL)
66*d8634badSDavid van Moolenbroek new_ptr = malloc(new_size);
67*d8634badSDavid van Moolenbroek else
68*d8634badSDavid van Moolenbroek new_ptr = realloc(ptr, new_size);
69*d8634badSDavid van Moolenbroek if (new_ptr == NULL)
70*d8634badSDavid van Moolenbroek errx(2, NULL);
71*d8634badSDavid van Moolenbroek return new_ptr;
72*d8634badSDavid van Moolenbroek }
73*d8634badSDavid van Moolenbroek
74*d8634badSDavid van Moolenbroek void
xfree(void * ptr)75*d8634badSDavid van Moolenbroek xfree(void *ptr)
76*d8634badSDavid van Moolenbroek {
77*d8634badSDavid van Moolenbroek if (ptr == NULL)
78*d8634badSDavid van Moolenbroek errx(2, NULL);
79*d8634badSDavid van Moolenbroek free(ptr);
80*d8634badSDavid van Moolenbroek }
81*d8634badSDavid van Moolenbroek
82*d8634badSDavid van Moolenbroek char *
xstrdup(const char * str)83*d8634badSDavid van Moolenbroek xstrdup(const char *str)
84*d8634badSDavid van Moolenbroek {
85*d8634badSDavid van Moolenbroek size_t len;
86*d8634badSDavid van Moolenbroek char *cp;
87*d8634badSDavid van Moolenbroek
88*d8634badSDavid van Moolenbroek len = strlen(str) + 1;
89*d8634badSDavid van Moolenbroek cp = xmalloc(len);
90*d8634badSDavid van Moolenbroek strlcpy(cp, str, len);
91*d8634badSDavid van Moolenbroek return cp;
92*d8634badSDavid van Moolenbroek }
93*d8634badSDavid van Moolenbroek
94*d8634badSDavid van Moolenbroek #if 0
95*d8634badSDavid van Moolenbroek int
96*d8634badSDavid van Moolenbroek xasprintf(char **ret, const char *fmt, ...)
97*d8634badSDavid van Moolenbroek {
98*d8634badSDavid van Moolenbroek va_list ap;
99*d8634badSDavid van Moolenbroek int i;
100*d8634badSDavid van Moolenbroek
101*d8634badSDavid van Moolenbroek va_start(ap, fmt);
102*d8634badSDavid van Moolenbroek i = vasprintf(ret, fmt, ap);
103*d8634badSDavid van Moolenbroek va_end(ap);
104*d8634badSDavid van Moolenbroek
105*d8634badSDavid van Moolenbroek if (i < 0 || *ret == NULL)
106*d8634badSDavid van Moolenbroek errx(2, NULL);
107*d8634badSDavid van Moolenbroek
108*d8634badSDavid van Moolenbroek return (i);
109*d8634badSDavid van Moolenbroek }
110*d8634badSDavid van Moolenbroek #endif
111