1 /*
2  * This file and its contents are supplied under the terms of the
3  * Common Development and Distribution License ("CDDL"), version 1.0.
4  * You may only use this file in accordance with the terms of version
5  * 1.0 of the CDDL.
6  *
7  * A full copy of the text of the CDDL should have accompanied this
8  * source.  A copy of the CDDL is also available via the Internet at
9  * http://www.illumos.org/license/CDDL.
10  */
11 
12 /*
13  * Copyright 2017 Jason King
14  * Copyright 2019, Joyent, Inc.
15  */
16 
17 #include <sys/debug.h>
18 #include <stdlib.h>
19 #include <string.h>
20 #include "demangle-sys.h"
21 #include "demangle_int.h"
22 
23 void *
24 zalloc(sysdem_ops_t *ops, size_t len)
25 {
26 	void *p = ops->alloc(len);
27 
28 	if (p != NULL)
29 		(void) memset(p, 0, len);
30 
31 #ifdef DEBUG
32 	/*
33 	 * In normal operation, we should never exhaust memory.  Either
34 	 * something's wrong, or the system is so hosed that aborting
35 	 * shouldn't hurt anything, and it gives us a more useful stack
36 	 * trace.
37 	 */
38 	if (p == NULL)
39 		abort();
40 #endif
41 
42 	return (p);
43 }
44 
45 void
46 xfree(sysdem_ops_t *ops, void *p, size_t len)
47 {
48 	if (p == NULL || len == 0)
49 		return;
50 
51 	ops->free(p, len);
52 }
53 
54 void *
55 xrealloc(sysdem_ops_t *ops, void *p, size_t oldsz, size_t newsz)
56 {
57 	if (newsz == oldsz)
58 		return (p);
59 
60 	VERIFY3U(newsz, >, oldsz);
61 
62 	void *temp = zalloc(ops, newsz);
63 
64 	if (temp == NULL)
65 		return (NULL);
66 
67 	if (oldsz > 0) {
68 		(void) memcpy(temp, p, oldsz);
69 		xfree(ops, p, oldsz);
70 	}
71 
72 	return (temp);
73 }
74 
75 char *
76 xstrdup(sysdem_ops_t *ops, const char *src)
77 {
78 	size_t len = strlen(src);
79 	char *str = zalloc(ops, len + 1);
80 
81 	if (str == NULL)
82 		return (NULL);
83 
84 	/* zalloc(len+1) guarantees this will be NUL-terminated */
85 	(void) memcpy(str, src, len);
86 	return (str);
87 }
88 
89 /*ARGSUSED*/
90 static void
91 def_free(void *p, size_t len)
92 {
93 	free(p);
94 }
95 
96 static sysdem_ops_t i_sysdem_ops_default = {
97 	.alloc = malloc,
98 	.free = def_free
99 };
100 sysdem_ops_t *sysdem_ops_default = &i_sysdem_ops_default;
101