blob: 58c337e99e2ef4a895fc7b800eb8228b52cde75c [file] [log] [blame]
Jari Aaltoccc6cda1996-12-23 17:02:34 +00001/* xmalloc.c -- safe versions of malloc and realloc */
2
Jari Aalto31859422009-01-12 13:36:28 +00003/* Copyright (C) 1991-2009 Free Software Foundation, Inc.
Jari Aaltoccc6cda1996-12-23 17:02:34 +00004
Jari Aalto31859422009-01-12 13:36:28 +00005 This file is part of GNU Bash, the GNU Bourne Again SHell.
Jari Aaltoccc6cda1996-12-23 17:02:34 +00006
Jari Aalto31859422009-01-12 13:36:28 +00007 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.
Jari Aaltoccc6cda1996-12-23 17:02:34 +000011
Jari Aalto31859422009-01-12 13:36:28 +000012 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.
Jari Aaltoccc6cda1996-12-23 17:02:34 +000016
17 You should have received a copy of the GNU General Public License
Jari Aalto31859422009-01-12 13:36:28 +000018 along with Bash. If not, see <http://www.gnu.org/licenses/>.
19*/
Jari Aaltoccc6cda1996-12-23 17:02:34 +000020
21#if defined (HAVE_CONFIG_H)
22#include <config.h>
23#endif
24
Jari Aaltod166f041997-06-05 14:59:13 +000025#include "bashtypes.h"
Jari Aaltoccc6cda1996-12-23 17:02:34 +000026#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
Jari Aaltob80f6442004-07-27 13:29:18 +000040#include "bashintl.h"
41
Jari Aaltoccc6cda1996-12-23 17:02:34 +000042#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
Jari Aaltof73dda02001-11-13 17:56:06 +000050#if defined (HAVE_SBRK) && !HAVE_DECL_SBRK
Jari Aaltoccc6cda1996-12-23 17:02:34 +000051extern 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
Jari Aaltob72432f1999-02-19 17:11:39 +000064#if defined (HAVE_SBRK)
65static size_t
66findbrk ()
67{
68 if (brkfound == 0)
69 {
70 lbreak = (PTR_T)sbrk (0);
71 brkfound++;
72 }
73 return (char *)sbrk (0) - (char *)lbreak;
74}
75#endif
76
Jari Aaltoccc6cda1996-12-23 17:02:34 +000077/* Return a pointer to free()able block of memory large enough
78 to hold BYTES number of bytes. If the memory cannot be allocated,
79 print an error message and abort. */
Jari Aaltof73dda02001-11-13 17:56:06 +000080PTR_T
Jari Aaltoccc6cda1996-12-23 17:02:34 +000081xmalloc (bytes)
82 size_t bytes;
83{
Jari Aaltof73dda02001-11-13 17:56:06 +000084 PTR_T temp;
Jari Aaltoccc6cda1996-12-23 17:02:34 +000085
Jari Aaltof73dda02001-11-13 17:56:06 +000086 temp = malloc (bytes);
Jari Aaltoccc6cda1996-12-23 17:02:34 +000087
88 if (temp == 0)
89 {
Jari Aaltob72432f1999-02-19 17:11:39 +000090#if defined (HAVE_SBRK)
91 allocated = findbrk ();
Jari Aaltob80f6442004-07-27 13:29:18 +000092 fatal_error (_("xmalloc: cannot allocate %lu bytes (%lu bytes allocated)"), (unsigned long)bytes, (unsigned long)allocated);
Jari Aaltob72432f1999-02-19 17:11:39 +000093#else
Jari Aaltob80f6442004-07-27 13:29:18 +000094 fatal_error (_("xmalloc: cannot allocate %lu bytes"), (unsigned long)bytes);
Jari Aaltob72432f1999-02-19 17:11:39 +000095#endif /* !HAVE_SBRK */
Jari Aaltoccc6cda1996-12-23 17:02:34 +000096 }
97
98 return (temp);
99}
100
Jari Aaltof73dda02001-11-13 17:56:06 +0000101PTR_T
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000102xrealloc (pointer, bytes)
103 PTR_T pointer;
104 size_t bytes;
105{
Jari Aaltof73dda02001-11-13 17:56:06 +0000106 PTR_T temp;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000107
Jari Aaltof73dda02001-11-13 17:56:06 +0000108 temp = pointer ? realloc (pointer, bytes) : malloc (bytes);
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000109
110 if (temp == 0)
111 {
Jari Aaltob72432f1999-02-19 17:11:39 +0000112#if defined (HAVE_SBRK)
113 allocated = findbrk ();
Jari Aaltob80f6442004-07-27 13:29:18 +0000114 fatal_error (_("xrealloc: cannot reallocate %lu bytes (%lu bytes allocated)"), (unsigned long)bytes, (unsigned long)allocated);
Jari Aaltob72432f1999-02-19 17:11:39 +0000115#else
Jari Aaltob80f6442004-07-27 13:29:18 +0000116 fatal_error (_("xrealloc: cannot allocate %lu bytes"), (unsigned long)bytes);
Jari Aaltob72432f1999-02-19 17:11:39 +0000117#endif /* !HAVE_SBRK */
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000118 }
119
120 return (temp);
121}
122
123/* Use this as the function to call when adding unwind protects so we
124 don't need to know what free() returns. */
125void
126xfree (string)
Jari Aaltobb706242000-03-17 21:46:59 +0000127 PTR_T string;
Jari Aaltoccc6cda1996-12-23 17:02:34 +0000128{
129 if (string)
130 free (string);
131}
Jari Aaltof73dda02001-11-13 17:56:06 +0000132
133#ifdef USING_BASH_MALLOC
134#include <malloc/shmalloc.h>
135
136PTR_T
137sh_xmalloc (bytes, file, line)
138 size_t bytes;
139 char *file;
140 int line;
141{
142 PTR_T temp;
143
144 temp = sh_malloc (bytes, file, line);
145
146 if (temp == 0)
147 {
148#if defined (HAVE_SBRK)
149 allocated = findbrk ();
Jari Aaltob80f6442004-07-27 13:29:18 +0000150 fatal_error (_("xmalloc: %s:%d: cannot allocate %lu bytes (%lu bytes allocated)"), file, line, (unsigned long)bytes, (unsigned long)allocated);
Jari Aaltof73dda02001-11-13 17:56:06 +0000151#else
Jari Aaltob80f6442004-07-27 13:29:18 +0000152 fatal_error (_("xmalloc: %s:%d: cannot allocate %lu bytes"), file, line, (unsigned long)bytes);
Jari Aaltof73dda02001-11-13 17:56:06 +0000153#endif /* !HAVE_SBRK */
154 }
155
156 return (temp);
157}
158
159PTR_T
160sh_xrealloc (pointer, bytes, file, line)
161 PTR_T pointer;
162 size_t bytes;
163 char *file;
164 int line;
165{
166 PTR_T temp;
167
168 temp = pointer ? sh_realloc (pointer, bytes, file, line) : sh_malloc (bytes, file, line);
169
170 if (temp == 0)
171 {
172#if defined (HAVE_SBRK)
173 allocated = findbrk ();
Jari Aaltob80f6442004-07-27 13:29:18 +0000174 fatal_error (_("xrealloc: %s:%d: cannot reallocate %lu bytes (%lu bytes allocated)"), file, line, (unsigned long)bytes, (unsigned long)allocated);
Jari Aaltof73dda02001-11-13 17:56:06 +0000175#else
Jari Aaltob80f6442004-07-27 13:29:18 +0000176 fatal_error (_("xrealloc: %s:%d: cannot allocate %lu bytes"), file, line, (unsigned long)bytes);
Jari Aaltof73dda02001-11-13 17:56:06 +0000177#endif /* !HAVE_SBRK */
178 }
179
180 return (temp);
181}
182
183void
184sh_xfree (string, file, line)
185 PTR_T string;
186 char *file;
187 int line;
188{
189 if (string)
190 sh_free (string, file, line);
191}
192#endif