Branch data Line data Source code
1 : : /* Error handling in libelf.
2 : : Copyright (C) 1998-2010, 2015 Red Hat, Inc.
3 : : This file is part of elfutils.
4 : : Written by Ulrich Drepper <drepper@redhat.com>, 1998.
5 : :
6 : : This file is free software; you can redistribute it and/or modify
7 : : it under the terms of either
8 : :
9 : : * the GNU Lesser General Public License as published by the Free
10 : : Software Foundation; either version 3 of the License, or (at
11 : : your option) any later version
12 : :
13 : : or
14 : :
15 : : * the GNU General Public License as published by the Free
16 : : Software Foundation; either version 2 of the License, or (at
17 : : your option) any later version
18 : :
19 : : or both in parallel, as here.
20 : :
21 : : elfutils is distributed in the hope that it will be useful, but
22 : : WITHOUT ANY WARRANTY; without even the implied warranty of
23 : : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
24 : : General Public License for more details.
25 : :
26 : : You should have received copies of the GNU General Public License and
27 : : the GNU Lesser General Public License along with this program. If
28 : : not, see <http://www.gnu.org/licenses/>. */
29 : :
30 : : #ifdef HAVE_CONFIG_H
31 : : # include <config.h>
32 : : #endif
33 : :
34 : : #include <assert.h>
35 : : #include <libintl.h>
36 : : #include <stdbool.h>
37 : : #include <stdint.h>
38 : : #include <stdlib.h>
39 : :
40 : : #include "libelfP.h"
41 : :
42 : :
43 : : /* The error number. */
44 : : static __thread int global_error;
45 : :
46 : :
47 : : int
48 : 1 : elf_errno (void)
49 : : {
50 : 1 : int result = global_error;
51 : 1 : global_error = ELF_E_NOERROR;
52 : 1 : return result;
53 : : }
54 : :
55 : :
56 : : /* Return the appropriate message for the error. */
57 : : static const char msgstr[] =
58 : : {
59 : : #define ELF_E_NOERROR_IDX 0
60 : : N_("no error")
61 : : "\0"
62 : : #define ELF_E_UNKNOWN_ERROR_IDX (ELF_E_NOERROR_IDX + sizeof "no error")
63 : : N_("unknown error")
64 : : "\0"
65 : : #define ELF_E_UNKNOWN_VERSION_IDX \
66 : : (ELF_E_UNKNOWN_ERROR_IDX + sizeof "unknown error")
67 : : N_("unknown version")
68 : : "\0"
69 : : #define ELF_E_UNKNOWN_TYPE_IDX \
70 : : (ELF_E_UNKNOWN_VERSION_IDX + sizeof "unknown version")
71 : : N_("unknown type")
72 : : "\0"
73 : : #define ELF_E_INVALID_HANDLE_IDX \
74 : : (ELF_E_UNKNOWN_TYPE_IDX + sizeof "unknown type")
75 : : N_("invalid `Elf' handle")
76 : : "\0"
77 : : #define ELF_E_SOURCE_SIZE_IDX \
78 : : (ELF_E_INVALID_HANDLE_IDX + sizeof "invalid `Elf' handle")
79 : : N_("invalid size of source operand")
80 : : "\0"
81 : : #define ELF_E_DEST_SIZE_IDX \
82 : : (ELF_E_SOURCE_SIZE_IDX + sizeof "invalid size of source operand")
83 : : N_("invalid size of destination operand")
84 : : "\0"
85 : : #define ELF_E_INVALID_ENCODING_IDX \
86 : : (ELF_E_DEST_SIZE_IDX + sizeof "invalid size of destination operand")
87 : : N_("invalid encoding")
88 : : "\0"
89 : : #define ELF_E_NOMEM_IDX \
90 : : (ELF_E_INVALID_ENCODING_IDX + sizeof "invalid encoding")
91 : : N_("out of memory")
92 : : "\0"
93 : : #define ELF_E_INVALID_FILE_IDX \
94 : : (ELF_E_NOMEM_IDX + sizeof "out of memory")
95 : : N_("invalid file descriptor")
96 : : "\0"
97 : : #define ELF_E_INVALID_ELF_IDX \
98 : : (ELF_E_INVALID_FILE_IDX + sizeof "invalid file descriptor")
99 : : N_("invalid ELF file data")
100 : : "\0"
101 : : #define ELF_E_INVALID_OP_IDX \
102 : : (ELF_E_INVALID_ELF_IDX + sizeof "invalid ELF file data")
103 : : N_("invalid operation")
104 : : "\0"
105 : : #define ELF_E_NO_VERSION_IDX \
106 : : (ELF_E_INVALID_OP_IDX + sizeof "invalid operation")
107 : : N_("ELF version not set")
108 : : "\0"
109 : : #define ELF_E_INVALID_CMD_IDX \
110 : : (ELF_E_NO_VERSION_IDX + sizeof "ELF version not set")
111 : : N_("invalid command")
112 : : "\0"
113 : : #define ELF_E_RANGE_IDX \
114 : : (ELF_E_INVALID_CMD_IDX + sizeof "invalid command")
115 : : N_("offset out of range")
116 : : "\0"
117 : : #define ELF_E_ARCHIVE_FMAG_IDX \
118 : : (ELF_E_RANGE_IDX + sizeof "offset out of range")
119 : : N_("invalid fmag field in archive header")
120 : : "\0"
121 : : #define ELF_E_INVALID_ARCHIVE_IDX \
122 : : (ELF_E_ARCHIVE_FMAG_IDX + sizeof "invalid fmag field in archive header")
123 : : N_("invalid archive file")
124 : : "\0"
125 : : #define ELF_E_NO_ARCHIVE_IDX \
126 : : (ELF_E_INVALID_ARCHIVE_IDX + sizeof "invalid archive file")
127 : : N_("descriptor is not for an archive")
128 : : "\0"
129 : : #define ELF_E_NO_INDEX_IDX \
130 : : (ELF_E_NO_ARCHIVE_IDX + sizeof "descriptor is not for an archive")
131 : : N_("no index available")
132 : : "\0"
133 : : #define ELF_E_READ_ERROR_IDX \
134 : : (ELF_E_NO_INDEX_IDX + sizeof "no index available")
135 : : N_("cannot read data from file")
136 : : "\0"
137 : : #define ELF_E_WRITE_ERROR_IDX \
138 : : (ELF_E_READ_ERROR_IDX + sizeof "cannot read data from file")
139 : : N_("cannot write data to file")
140 : : "\0"
141 : : #define ELF_E_INVALID_CLASS_IDX \
142 : : (ELF_E_WRITE_ERROR_IDX + sizeof "cannot write data to file")
143 : : N_("invalid binary class")
144 : : "\0"
145 : : #define ELF_E_INVALID_INDEX_IDX \
146 : : (ELF_E_INVALID_CLASS_IDX + sizeof "invalid binary class")
147 : : N_("invalid section index")
148 : : "\0"
149 : : #define ELF_E_INVALID_OPERAND_IDX \
150 : : (ELF_E_INVALID_INDEX_IDX + sizeof "invalid section index")
151 : : N_("invalid operand")
152 : : "\0"
153 : : #define ELF_E_INVALID_SECTION_IDX \
154 : : (ELF_E_INVALID_OPERAND_IDX + sizeof "invalid operand")
155 : : N_("invalid section")
156 : : "\0"
157 : : #define ELF_E_INVALID_COMMAND_IDX \
158 : : (ELF_E_INVALID_SECTION_IDX + sizeof "invalid section")
159 : : N_("invalid command")
160 : : "\0"
161 : : #define ELF_E_WRONG_ORDER_EHDR_IDX \
162 : : (ELF_E_INVALID_COMMAND_IDX + sizeof "invalid command")
163 : : N_("executable header not created first")
164 : : "\0"
165 : : #define ELF_E_FD_DISABLED_IDX \
166 : : (ELF_E_WRONG_ORDER_EHDR_IDX + sizeof "executable header not created first")
167 : : N_("file descriptor disabled")
168 : : "\0"
169 : : #define ELF_E_FD_MISMATCH_IDX \
170 : : (ELF_E_FD_DISABLED_IDX + sizeof "file descriptor disabled")
171 : : N_("archive/member file descriptor mismatch")
172 : : "\0"
173 : : #define ELF_E_OFFSET_RANGE_IDX \
174 : : (ELF_E_FD_MISMATCH_IDX + sizeof "archive/member file descriptor mismatch")
175 : : N_("offset out of range")
176 : : "\0"
177 : : #define ELF_E_NOT_NUL_SECTION_IDX \
178 : : (ELF_E_OFFSET_RANGE_IDX + sizeof "offset out of range")
179 : : N_("cannot manipulate null section")
180 : : "\0"
181 : : #define ELF_E_DATA_MISMATCH_IDX \
182 : : (ELF_E_NOT_NUL_SECTION_IDX + sizeof "cannot manipulate null section")
183 : : N_("data/scn mismatch")
184 : : "\0"
185 : : #define ELF_E_INVALID_SECTION_HEADER_IDX \
186 : : (ELF_E_DATA_MISMATCH_IDX + sizeof "data/scn mismatch")
187 : : N_("invalid section header")
188 : : "\0"
189 : : #define ELF_E_INVALID_DATA_IDX \
190 : : (ELF_E_INVALID_SECTION_HEADER_IDX + sizeof "invalid section header")
191 : : N_("invalid data")
192 : : "\0"
193 : : #define ELF_E_DATA_ENCODING_IDX \
194 : : (ELF_E_INVALID_DATA_IDX + sizeof "invalid data")
195 : : N_("unknown data encoding")
196 : : "\0"
197 : : #define ELF_E_SECTION_TOO_SMALL_IDX \
198 : : (ELF_E_DATA_ENCODING_IDX + sizeof "unknown data encoding")
199 : : N_("section `sh_size' too small for data")
200 : : "\0"
201 : : #define ELF_E_INVALID_ALIGN_IDX \
202 : : (ELF_E_SECTION_TOO_SMALL_IDX + sizeof "section `sh_size' too small for data")
203 : : N_("invalid section alignment")
204 : : "\0"
205 : : #define ELF_E_INVALID_SHENTSIZE_IDX \
206 : : (ELF_E_INVALID_ALIGN_IDX + sizeof "invalid section alignment")
207 : : N_("invalid section entry size")
208 : : "\0"
209 : : #define ELF_E_UPDATE_RO_IDX \
210 : : (ELF_E_INVALID_SHENTSIZE_IDX + sizeof "invalid section entry size")
211 : : N_("update() for write on read-only file")
212 : : "\0"
213 : : #define ELF_E_NOFILE_IDX \
214 : : (ELF_E_UPDATE_RO_IDX + sizeof "update() for write on read-only file")
215 : : N_("no such file")
216 : : "\0"
217 : : #define ELF_E_GROUP_NOT_REL_IDX \
218 : : (ELF_E_NOFILE_IDX + sizeof "no such file")
219 : : N_("only relocatable files can contain section groups")
220 : : "\0"
221 : : #define ELF_E_INVALID_PHDR_IDX \
222 : : (ELF_E_GROUP_NOT_REL_IDX \
223 : : + sizeof "only relocatable files can contain section groups")
224 : : N_("program header only allowed in executables, shared objects, and \
225 : : core files")
226 : : "\0"
227 : : #define ELF_E_NO_PHDR_IDX \
228 : : (ELF_E_INVALID_PHDR_IDX \
229 : : + sizeof "program header only allowed in executables, shared objects, and \
230 : : core files")
231 : : N_("file has no program header")
232 : : "\0"
233 : : #define ELF_E_INVALID_OFFSET_IDX \
234 : : (ELF_E_NO_PHDR_IDX \
235 : : + sizeof "file has no program header")
236 : : N_("invalid offset")
237 : : "\0"
238 : : #define ELF_E_INVALID_SECTION_TYPE_IDX \
239 : : (ELF_E_INVALID_OFFSET_IDX \
240 : : + sizeof "invalid offset")
241 : : N_("invalid section type")
242 : : "\0"
243 : : #define ELF_E_INVALID_SECTION_FLAGS_IDX \
244 : : (ELF_E_INVALID_SECTION_TYPE_IDX \
245 : : + sizeof "invalid section type")
246 : : N_("invalid section flags")
247 : : "\0"
248 : : #define ELF_E_NOT_COMPRESSED_IDX \
249 : : (ELF_E_INVALID_SECTION_FLAGS_IDX \
250 : : + sizeof "invalid section flags")
251 : : N_("section does not contain compressed data")
252 : : "\0"
253 : : #define ELF_E_ALREADY_COMPRESSED_IDX \
254 : : (ELF_E_NOT_COMPRESSED_IDX \
255 : : + sizeof "section does not contain compressed data")
256 : : N_("section contains compressed data")
257 : : "\0"
258 : : #define ELF_E_UNKNOWN_COMPRESSION_TYPE_IDX \
259 : : (ELF_E_ALREADY_COMPRESSED_IDX \
260 : : + sizeof "section contains compressed data")
261 : : N_("unknown compression type")
262 : : "\0"
263 : : #define ELF_E_COMPRESS_ERROR_IDX \
264 : : (ELF_E_UNKNOWN_COMPRESSION_TYPE_IDX \
265 : : + sizeof "unknown compression type")
266 : : N_("cannot compress data")
267 : : "\0"
268 : : #define ELF_E_DECOMPRESS_ERROR_IDX \
269 : : (ELF_E_COMPRESS_ERROR_IDX \
270 : : + sizeof "cannot compress data")
271 : : N_("cannot decompress data")
272 : : };
273 : :
274 : :
275 : : static const uint_fast16_t msgidx[ELF_E_NUM] =
276 : : {
277 : : [ELF_E_NOERROR] = ELF_E_NOERROR_IDX,
278 : : [ELF_E_UNKNOWN_ERROR] = ELF_E_UNKNOWN_ERROR_IDX,
279 : : [ELF_E_UNKNOWN_VERSION] = ELF_E_UNKNOWN_VERSION_IDX,
280 : : [ELF_E_UNKNOWN_TYPE] = ELF_E_UNKNOWN_TYPE_IDX,
281 : : [ELF_E_INVALID_HANDLE] = ELF_E_INVALID_HANDLE_IDX,
282 : : [ELF_E_SOURCE_SIZE] = ELF_E_SOURCE_SIZE_IDX,
283 : : [ELF_E_DEST_SIZE] = ELF_E_DEST_SIZE_IDX,
284 : : [ELF_E_INVALID_ENCODING] = ELF_E_INVALID_ENCODING_IDX,
285 : : [ELF_E_NOMEM] = ELF_E_NOMEM_IDX,
286 : : [ELF_E_INVALID_FILE] = ELF_E_INVALID_FILE_IDX,
287 : : [ELF_E_INVALID_ELF] = ELF_E_INVALID_ELF_IDX,
288 : : [ELF_E_INVALID_OP] = ELF_E_INVALID_OP_IDX,
289 : : [ELF_E_NO_VERSION] = ELF_E_NO_VERSION_IDX,
290 : : [ELF_E_INVALID_CMD] = ELF_E_INVALID_CMD_IDX,
291 : : [ELF_E_RANGE] = ELF_E_RANGE_IDX,
292 : : [ELF_E_ARCHIVE_FMAG] = ELF_E_ARCHIVE_FMAG_IDX,
293 : : [ELF_E_INVALID_ARCHIVE] = ELF_E_INVALID_ARCHIVE_IDX,
294 : : [ELF_E_NO_ARCHIVE] = ELF_E_NO_ARCHIVE_IDX,
295 : : [ELF_E_NO_INDEX] = ELF_E_NO_INDEX_IDX,
296 : : [ELF_E_READ_ERROR] = ELF_E_READ_ERROR_IDX,
297 : : [ELF_E_WRITE_ERROR] = ELF_E_WRITE_ERROR_IDX,
298 : : [ELF_E_INVALID_CLASS] = ELF_E_INVALID_CLASS_IDX,
299 : : [ELF_E_INVALID_INDEX] = ELF_E_INVALID_INDEX_IDX,
300 : : [ELF_E_INVALID_OPERAND] = ELF_E_INVALID_OPERAND_IDX,
301 : : [ELF_E_INVALID_SECTION] = ELF_E_INVALID_SECTION_IDX,
302 : : [ELF_E_INVALID_COMMAND] = ELF_E_INVALID_COMMAND_IDX,
303 : : [ELF_E_WRONG_ORDER_EHDR] = ELF_E_WRONG_ORDER_EHDR_IDX,
304 : : [ELF_E_FD_DISABLED] = ELF_E_FD_DISABLED_IDX,
305 : : [ELF_E_FD_MISMATCH] = ELF_E_FD_MISMATCH_IDX,
306 : : [ELF_E_OFFSET_RANGE] = ELF_E_OFFSET_RANGE_IDX,
307 : : [ELF_E_NOT_NUL_SECTION] = ELF_E_NOT_NUL_SECTION_IDX,
308 : : [ELF_E_DATA_MISMATCH] = ELF_E_DATA_MISMATCH_IDX,
309 : : [ELF_E_INVALID_SECTION_HEADER] = ELF_E_INVALID_SECTION_HEADER_IDX,
310 : : [ELF_E_INVALID_DATA] = ELF_E_INVALID_DATA_IDX,
311 : : [ELF_E_DATA_ENCODING] = ELF_E_DATA_ENCODING_IDX,
312 : : [ELF_E_SECTION_TOO_SMALL] = ELF_E_SECTION_TOO_SMALL_IDX,
313 : : [ELF_E_INVALID_ALIGN] = ELF_E_INVALID_ALIGN_IDX,
314 : : [ELF_E_INVALID_SHENTSIZE] = ELF_E_INVALID_SHENTSIZE_IDX,
315 : : [ELF_E_UPDATE_RO] = ELF_E_UPDATE_RO_IDX,
316 : : [ELF_E_NOFILE] = ELF_E_NOFILE_IDX,
317 : : [ELF_E_GROUP_NOT_REL] = ELF_E_GROUP_NOT_REL_IDX,
318 : : [ELF_E_INVALID_PHDR] = ELF_E_INVALID_PHDR_IDX,
319 : : [ELF_E_NO_PHDR] = ELF_E_NO_PHDR_IDX,
320 : : [ELF_E_INVALID_OFFSET] = ELF_E_INVALID_OFFSET_IDX,
321 : : [ELF_E_INVALID_SECTION_TYPE] = ELF_E_INVALID_SECTION_TYPE_IDX,
322 : : [ELF_E_INVALID_SECTION_FLAGS] = ELF_E_INVALID_SECTION_FLAGS_IDX,
323 : : [ELF_E_NOT_COMPRESSED] = ELF_E_NOT_COMPRESSED_IDX,
324 : : [ELF_E_ALREADY_COMPRESSED] = ELF_E_ALREADY_COMPRESSED_IDX,
325 : : [ELF_E_UNKNOWN_COMPRESSION_TYPE] = ELF_E_UNKNOWN_COMPRESSION_TYPE_IDX,
326 : : [ELF_E_COMPRESS_ERROR] = ELF_E_COMPRESS_ERROR_IDX,
327 : : [ELF_E_DECOMPRESS_ERROR] = ELF_E_DECOMPRESS_ERROR_IDX
328 : : };
329 : : #define nmsgidx ((int) (sizeof (msgidx) / sizeof (msgidx[0])))
330 : :
331 : :
332 : : void
333 : : internal_function
334 : 399851 : __libelf_seterrno (int value)
335 : : {
336 [ - + ]: 399851 : global_error = value >= 0 && value < nmsgidx ? value : ELF_E_UNKNOWN_ERROR;
337 : 399851 : }
338 : :
339 : :
340 : : const char *
341 : 50 : elf_errmsg (int error)
342 : : {
343 : 50 : int last_error = global_error;
344 : :
345 [ - + ]: 50 : if (error == 0)
346 : : {
347 [ # # ]: 0 : assert (msgidx[last_error] < sizeof (msgstr));
348 [ # # ]: 0 : return last_error != 0 ? _(msgstr + msgidx[last_error]) : NULL;
349 : : }
350 [ - + ]: 50 : else if (error < -1 || error >= nmsgidx)
351 : 0 : return _(msgstr + ELF_E_UNKNOWN_ERROR_IDX);
352 : :
353 [ + - - + ]: 100 : assert (msgidx[error == -1 ? last_error : error] < sizeof (msgstr));
354 : 50 : return _(msgstr + msgidx[error == -1 ? last_error : error]);
355 : : }
|