]> git.ipfire.org Git - thirdparty/bash.git/blame - xmalloc.c
Bash-4.4 patch 4
[thirdparty/bash.git] / xmalloc.c
CommitLineData
ccc6cda3
JA
1/* xmalloc.c -- safe versions of malloc and realloc */
2
a0c0a00f 3/* Copyright (C) 1991-2016 Free Software Foundation, Inc.
ccc6cda3 4
3185942a 5 This file is part of GNU Bash, the GNU Bourne Again SHell.
ccc6cda3 6
3185942a
JA
7 Bash is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
ccc6cda3 11
3185942a
JA
12 Bash is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
ccc6cda3
JA
16
17 You should have received a copy of the GNU General Public License
3185942a
JA
18 along with Bash. If not, see <http://www.gnu.org/licenses/>.
19*/
ccc6cda3
JA
20
21#if defined (HAVE_CONFIG_H)
22#include <config.h>
23#endif
24
d166f048 25#include "bashtypes.h"
ccc6cda3
JA
26#include <stdio.h>
27
28#if defined (HAVE_UNISTD_H)
29# include <unistd.h>
30#endif
31
32#if defined (HAVE_STDLIB_H)
33# include <stdlib.h>
34#else
35# include "ansi_stdlib.h"
36#endif /* HAVE_STDLIB_H */
37
38#include "error.h"
39
b80f6443
JA
40#include "bashintl.h"
41
ccc6cda3
JA
42#if !defined (PTR_T)
43# if defined (__STDC__)
44# define PTR_T void *
45# else
46# define PTR_T char *
47# endif /* !__STDC__ */
48#endif /* !PTR_T */
49
f73dda09 50#if defined (HAVE_SBRK) && !HAVE_DECL_SBRK
ccc6cda3
JA
51extern char *sbrk();
52#endif
53
54static PTR_T lbreak;
55static int brkfound;
56static size_t allocated;
57
58/* **************************************************************** */
59/* */
60/* Memory Allocation and Deallocation. */
61/* */
62/* **************************************************************** */
63
a0c0a00f 64#if defined (HAVE_SBRK) && defined (USING_BASH_MALLOC)
0001803f
CR
65#define FINDBRK() \
66do { \
67 if (brkfound == 0) \
68 { \
69 lbreak = (PTR_T)sbrk (0); \
70 brkfound++; \
71 } \
72} while (0)
73
b72432fd
JA
74static size_t
75findbrk ()
76{
0001803f 77 FINDBRK();
b72432fd
JA
78 return (char *)sbrk (0) - (char *)lbreak;
79}
0001803f
CR
80#else
81#define FINDBRK()
b72432fd
JA
82#endif
83
0001803f
CR
84static void
85allocerr (func, bytes)
86 const char *func;
87 size_t bytes;
88{
a0c0a00f 89#if defined (HAVE_SBRK) && defined (USING_BASH_MALLOC)
0001803f
CR
90 allocated = findbrk ();
91 fatal_error (_("%s: cannot allocate %lu bytes (%lu bytes allocated)"), func, (unsigned long)bytes, (unsigned long)allocated);
92#else
93 fatal_error (_("%s: cannot allocate %lu bytes"), func, (unsigned long)bytes);
94#endif /* !HAVE_SBRK */
95}
96
ccc6cda3
JA
97/* Return a pointer to free()able block of memory large enough
98 to hold BYTES number of bytes. If the memory cannot be allocated,
99 print an error message and abort. */
f73dda09 100PTR_T
ccc6cda3
JA
101xmalloc (bytes)
102 size_t bytes;
103{
f73dda09 104 PTR_T temp;
ccc6cda3 105
0001803f
CR
106#if defined (DEBUG)
107 if (bytes == 0)
108 internal_warning("xmalloc: size argument is 0");
109#endif
110
111 FINDBRK();
f73dda09 112 temp = malloc (bytes);
ccc6cda3
JA
113
114 if (temp == 0)
0001803f 115 allocerr ("xmalloc", bytes);
ccc6cda3
JA
116
117 return (temp);
118}
119
f73dda09 120PTR_T
ccc6cda3
JA
121xrealloc (pointer, bytes)
122 PTR_T pointer;
123 size_t bytes;
124{
f73dda09 125 PTR_T temp;
ccc6cda3 126
0001803f
CR
127#if defined (DEBUG)
128 if (bytes == 0)
129 internal_warning("xrealloc: size argument is 0");
130#endif
131
132 FINDBRK();
f73dda09 133 temp = pointer ? realloc (pointer, bytes) : malloc (bytes);
ccc6cda3
JA
134
135 if (temp == 0)
0001803f 136 allocerr ("xrealloc", bytes);
ccc6cda3
JA
137
138 return (temp);
139}
140
141/* Use this as the function to call when adding unwind protects so we
142 don't need to know what free() returns. */
143void
144xfree (string)
bb70624e 145 PTR_T string;
ccc6cda3
JA
146{
147 if (string)
148 free (string);
149}
f73dda09
JA
150
151#ifdef USING_BASH_MALLOC
152#include <malloc/shmalloc.h>
153
0001803f
CR
154static void
155sh_allocerr (func, bytes, file, line)
156 const char *func;
157 size_t bytes;
158 char *file;
159 int line;
160{
161#if defined (HAVE_SBRK)
162 allocated = findbrk ();
163 fatal_error (_("%s: %s:%d: cannot allocate %lu bytes (%lu bytes allocated)"), func, file, line, (unsigned long)bytes, (unsigned long)allocated);
164#else
165 fatal_error (_("%s: %s:%d: cannot allocate %lu bytes"), func, file, line, (unsigned long)bytes);
166#endif /* !HAVE_SBRK */
167}
168
f73dda09
JA
169PTR_T
170sh_xmalloc (bytes, file, line)
171 size_t bytes;
172 char *file;
173 int line;
174{
175 PTR_T temp;
176
0001803f
CR
177#if defined (DEBUG)
178 if (bytes == 0)
179 internal_warning("xmalloc: %s:%d: size argument is 0", file, line);
180#endif
181
182 FINDBRK();
f73dda09
JA
183 temp = sh_malloc (bytes, file, line);
184
185 if (temp == 0)
0001803f 186 sh_allocerr ("xmalloc", bytes, file, line);
f73dda09
JA
187
188 return (temp);
189}
190
191PTR_T
192sh_xrealloc (pointer, bytes, file, line)
193 PTR_T pointer;
194 size_t bytes;
195 char *file;
196 int line;
197{
198 PTR_T temp;
199
0001803f
CR
200#if defined (DEBUG)
201 if (bytes == 0)
202 internal_warning("xrealloc: %s:%d: size argument is 0", file, line);
203#endif
204
205 FINDBRK();
f73dda09
JA
206 temp = pointer ? sh_realloc (pointer, bytes, file, line) : sh_malloc (bytes, file, line);
207
208 if (temp == 0)
0001803f 209 sh_allocerr ("xrealloc", bytes, file, line);
f73dda09
JA
210
211 return (temp);
212}
213
214void
215sh_xfree (string, file, line)
216 PTR_T string;
217 char *file;
218 int line;
219{
220 if (string)
221 sh_free (string, file, line);
222}
223#endif