xref: /minix3/minix/usr.bin/diff/xmalloc.c (revision d8634bad6a79279cd9e9d2d23ed4f243d8d69da2)
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