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