Magellan Linux

Annotation of /trunk/elfutils/patches/elfutils-0.125-robustify.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 144 - (hide annotations) (download)
Tue May 8 20:06:05 2007 UTC (17 years, 1 month ago) by niro
File size: 56829 byte(s)
-import

1 niro 144 src/
2     2005-06-09 Roland McGrath <roland@redhat.com>
3    
4     * readelf.c (handle_dynamic, handle_symtab): Check for bogus sh_link.
5     (handle_verneed, handle_verdef, handle_versym, handle_hash): Likewise.
6     (handle_scngrp): Check for bogus sh_info.
7    
8     * strip.c (handle_elf): Check for bogus values in sh_link, sh_info,
9     st_shndx, e_shstrndx, and SHT_GROUP or SHT_SYMTAB_SHNDX data.
10     Don't use assert on input values, instead bail with "illformed" error.
11    
12     2005-05-17 Jakub Jelinek <jakub@redhat.com>
13    
14     libelf/
15     * elf32_getphdr.c (elfw2(LIBELFBITS,getphdr)): Check if program header
16     table fits into object's bounds.
17     * elf_getshstrndx.c (elf_getshstrndx): Add elf->start_offset to
18     elf->map_address. Check if first section header fits into object's
19     bounds.
20     * elf32_getshdr.c (elfw2(LIBELFBITS,getshdr)): Fix comment pasto.
21     Check if section header table fits into object's bounds.
22     * elf_begin.c (get_shnum): Ensure section headers fits into
23     object's bounds.
24     (file_read_elf): Make sure scncnt is small enough to allocate both
25     ElfXX_Shdr and Elf_Scn array. Make sure section and program header
26     tables fit into object's bounds. Avoid memory leak on failure.
27    
28     src/
29     * elflint.c (check_hash): Don't check entries beyond end of section.
30     (check_note): Don't crash if gelf_rawchunk fails.
31     (section_name): Return <invalid> if gelf_getshdr returns NULL.
32    
33     2005-05-14 Jakub Jelinek <jakub@redhat.com>
34    
35     libelf/
36     * libelfP.h (INVALID_NDX): Define.
37     * gelf_getdyn.c (gelf_getdyn): Use it. Remove ndx < 0 test if any.
38     * gelf_getlib.c (gelf_getlib): Likewise.
39     * gelf_getmove.c (gelf_getmove): Likewise.
40     * gelf_getrel.c (gelf_getrel): Likewise.
41     * gelf_getrela.c (gelf_getrela): Likewise.
42     * gelf_getsym.c (gelf_getsym): Likewise.
43     * gelf_getsyminfo.c (gelf_getsyminfo): Likewise.
44     * gelf_getsymshndx.c (gelf_getsymshndx): Likewise.
45     * gelf_getversym.c (gelf_getversym): Likewise.
46     * gelf_update_dyn.c (gelf_update_dyn): Likewise.
47     * gelf_update_lib.c (gelf_update_lib): Likewise.
48     * gelf_update_move.c (gelf_update_move): Likewise.
49     * gelf_update_rel.c (gelf_update_rel): Likewise.
50     * gelf_update_rela.c (gelf_update_rela): Likewise.
51     * gelf_update_sym.c (gelf_update_sym): Likewise.
52     * gelf_update_syminfo.c (gelf_update_syminfo): Likewise.
53     * gelf_update_symshndx.c (gelf_update_symshndx): Likewise.
54     * gelf_update_versym.c (gelf_update_versym): Likewise.
55     * elf_newscn.c (elf_newscn): Check for overflow.
56     * elf32_updatefile.c (__elfw2(LIBELFBITS,updatemmap)): Likewise.
57     (__elfw2(LIBELFBITS,updatefile)): Likewise.
58     * elf_begin.c (file_read_elf): Likewise.
59     * elf32_newphdr.c (elfw2(LIBELFBITS,newphdr)): Likewise.
60     * elf_getarsym.c (elf_getarsym): Likewise.
61     * elf32_getshdr.c (elfw2(LIBELFBITS,getshdr)): Likewise.
62     src/
63     * elflint.c (section_name): Return "<invalid>" instead of
64     crashing on invalid section name.
65     (check_symtab, is_rel_dyn, check_rela, check_rel, check_dynamic,
66     check_symtab_shndx, check_hash, check_versym): Robustify.
67    
68     --- elfutils-0.122/libelf/elf32_getphdr.c
69     +++ elfutils-0.122/libelf/elf32_getphdr.c
70     @@ -115,6 +115,16 @@ elfw2(LIBELFBITS,getphdr) (elf)
71    
72     if (elf->map_address != NULL)
73     {
74     + /* First see whether the information in the ELF header is
75     + valid and it does not ask for too much. */
76     + if (unlikely (ehdr->e_phoff >= elf->maximum_size)
77     + || unlikely (ehdr->e_phoff + size > elf->maximum_size))
78     + {
79     + /* Something is wrong. */
80     + __libelf_seterrno (ELF_E_INVALID_PHDR);
81     + goto out;
82     + }
83     +
84     /* All the data is already mapped. Use it. */
85     if (ehdr->e_ident[EI_DATA] == MY_ELFDATA
86     && (ALLOW_UNALIGNED
87     --- elfutils-0.122/libelf/elf32_getshdr.c
88     +++ elfutils-0.122/libelf/elf32_getshdr.c
89     @@ -101,11 +101,12 @@ elfw2(LIBELFBITS,getshdr) (scn)
90     goto out;
91    
92     size_t shnum;
93     - if (INTUSE (elf_getshnum) (elf, &shnum) != 0)
94     + if (INTUSE (elf_getshnum) (elf, &shnum) != 0
95     + || shnum > SIZE_MAX / sizeof (ElfW2(LIBELFBITS,Shdr)))
96     goto out;
97     size_t size = shnum * sizeof (ElfW2(LIBELFBITS,Shdr));
98    
99     - /* Allocate memory for the program headers. We know the number
100     + /* Allocate memory for the section headers. We know the number
101     of entries from the ELF header. */
102     ElfW2(LIBELFBITS,Shdr) *shdr = elf->state.ELFW(elf,LIBELFBITS).shdr =
103     (ElfW2(LIBELFBITS,Shdr) *) malloc (size);
104     @@ -128,6 +129,16 @@ elfw2(LIBELFBITS,getshdr) (scn)
105     + ehdr->e_shoff)
106     & (__alignof__ (ElfW2(LIBELFBITS,Shdr)) - 1)) != 0));
107    
108     + /* First see whether the information in the ELF header is
109     + valid and it does not ask for too much. */
110     + if (unlikely (ehdr->e_shoff >= elf->maximum_size)
111     + || unlikely (ehdr->e_shoff + size > elf->maximum_size))
112     + {
113     + /* Something is wrong. */
114     + __libelf_seterrno (ELF_E_INVALID_SECTION_HEADER);
115     + goto free_and_out;
116     + }
117     +
118     /* Now copy the data and at the same time convert the byte
119     order. */
120     if (ALLOW_UNALIGNED
121     --- elfutils-0.122/libelf/elf32_newphdr.c
122     +++ elfutils-0.122/libelf/elf32_newphdr.c
123     @@ -124,6 +124,12 @@ elfw2(LIBELFBITS,newphdr) (elf, count)
124     else if (elf->state.ELFW(elf,LIBELFBITS).ehdr->e_phnum != count
125     || elf->state.ELFW(elf,LIBELFBITS).phdr == NULL)
126     {
127     + if (unlikely (count > SIZE_MAX / sizeof (ElfW2(LIBELFBITS,Phdr))))
128     + {
129     + result = NULL;
130     + goto out;
131     + }
132     +
133     /* Allocate a new program header with the appropriate number of
134     elements. */
135     result = (ElfW2(LIBELFBITS,Phdr) *)
136     --- elfutils-0.122/libelf/elf32_updatefile.c
137     +++ elfutils-0.122/libelf/elf32_updatefile.c
138     @@ -201,6 +201,9 @@ __elfw2(LIBELFBITS,updatemmap) (Elf *elf
139     /* Write all the sections. Well, only those which are modified. */
140     if (shnum > 0)
141     {
142     + if (unlikely (shnum > SIZE_MAX / sizeof (Elf_Scn *)))
143     + return 1;
144     +
145     Elf_ScnList *list = &elf->state.ELFW(elf,LIBELFBITS).scns;
146     Elf_Scn **scns = (Elf_Scn **) alloca (shnum * sizeof (Elf_Scn *));
147     char *const shdr_start = ((char *) elf->map_address + elf->start_offset
148     @@ -571,6 +574,10 @@ __elfw2(LIBELFBITS,updatefile) (Elf *elf
149     /* Write all the sections. Well, only those which are modified. */
150     if (shnum > 0)
151     {
152     + if (unlikely (shnum > SIZE_MAX / (sizeof (Elf_Scn *)
153     + + sizeof (ElfW2(LIBELFBITS,Shdr)))))
154     + return 1;
155     +
156     off_t shdr_offset = elf->start_offset + ehdr->e_shoff;
157     #if EV_NUM != 2
158     xfct_t shdr_fctp = __elf_xfctstom[__libelf_version - 1][EV_CURRENT - 1][ELFW(ELFCLASS, LIBELFBITS) - 1][ELF_T_SHDR];
159     --- elfutils-0.122/libelf/elf_begin.c
160     +++ elfutils-0.122/libelf/elf_begin.c
161     @@ -155,7 +155,8 @@ get_shnum (void *map_address, unsigned c
162    
163     if (unlikely (result == 0) && ehdr.e32->e_shoff != 0)
164     {
165     - if (offset + ehdr.e32->e_shoff + sizeof (Elf32_Shdr) > maxsize)
166     + if (unlikely (ehdr.e32->e_shoff >= maxsize)
167     + || unlikely (ehdr.e32->e_shoff + sizeof (Elf32_Shdr) > maxsize))
168     /* Cannot read the first section header. */
169     return (size_t) -1l;
170    
171     @@ -198,7 +199,8 @@ get_shnum (void *map_address, unsigned c
172    
173     if (unlikely (result == 0) && ehdr.e64->e_shoff != 0)
174     {
175     - if (offset + ehdr.e64->e_shoff + sizeof (Elf64_Shdr) > maxsize)
176     + if (unlikely (ehdr.e64->e_shoff >= maxsize)
177     + || unlikely (ehdr.e64->e_shoff + sizeof (Elf64_Shdr) > maxsize))
178     /* Cannot read the first section header. */
179     return (size_t) -1l;
180    
181     @@ -265,6 +267,15 @@ file_read_elf (int fildes, void *map_add
182     /* Could not determine the number of sections. */
183     return NULL;
184    
185     + /* Check for too many sections. */
186     + if (e_ident[EI_CLASS] == ELFCLASS32)
187     + {
188     + if (scncnt > SIZE_MAX / (sizeof (Elf_Scn) + sizeof (Elf32_Shdr)))
189     + return NULL;
190     + }
191     + else if (scncnt > SIZE_MAX / (sizeof (Elf_Scn) + sizeof (Elf64_Shdr)))
192     + return NULL;
193     +
194     /* We can now allocate the memory. */
195     Elf *elf = allocate_elf (fildes, map_address, offset, maxsize, cmd, parent,
196     ELF_K_ELF, scncnt * sizeof (Elf_Scn));
197     @@ -298,13 +309,31 @@ file_read_elf (int fildes, void *map_add
198     {
199     /* We can use the mmapped memory. */
200     elf->state.elf32.ehdr = ehdr;
201     +
202     + if (unlikely (ehdr->e_shoff >= maxsize)
203     + || unlikely (ehdr->e_shoff
204     + + scncnt * sizeof (Elf32_Shdr) > maxsize))
205     + {
206     + free_and_out:
207     + free (elf);
208     + __libelf_seterrno (ELF_E_INVALID_FILE);
209     + return NULL;
210     + }
211     elf->state.elf32.shdr
212     = (Elf32_Shdr *) ((char *) ehdr + ehdr->e_shoff);
213     +
214     if (ehdr->e_phnum > 0)
215     + {
216     /* Assign a value only if there really is a program
217     header. Otherwise the value remains NULL. */
218     + if (unlikely (ehdr->e_phoff >= maxsize)
219     + || unlikely (ehdr->e_phoff
220     + + ehdr->e_phnum
221     + * sizeof (Elf32_Phdr) > maxsize))
222     + goto free_and_out;
223     elf->state.elf32.phdr
224     = (Elf32_Phdr *) ((char *) ehdr + ehdr->e_phoff);
225     + }
226    
227     for (size_t cnt = 0; cnt < scncnt; ++cnt)
228     {
229     @@ -373,13 +402,26 @@ file_read_elf (int fildes, void *map_add
230     {
231     /* We can use the mmapped memory. */
232     elf->state.elf64.ehdr = ehdr;
233     +
234     + if (unlikely (ehdr->e_shoff >= maxsize)
235     + || unlikely (ehdr->e_shoff
236     + + scncnt * sizeof (Elf32_Shdr) > maxsize))
237     + goto free_and_out;
238     elf->state.elf64.shdr
239     = (Elf64_Shdr *) ((char *) ehdr + ehdr->e_shoff);
240     +
241     if (ehdr->e_phnum > 0)
242     + {
243     /* Assign a value only if there really is a program
244     header. Otherwise the value remains NULL. */
245     + if (unlikely (ehdr->e_phoff >= maxsize)
246     + || unlikely (ehdr->e_phoff
247     + + ehdr->e_phnum
248     + * sizeof (Elf32_Phdr) > maxsize))
249     + goto free_and_out;
250     elf->state.elf64.phdr
251     = (Elf64_Phdr *) ((char *) ehdr + ehdr->e_phoff);
252     + }
253    
254     for (size_t cnt = 0; cnt < scncnt; ++cnt)
255     {
256     --- elfutils-0.122/libelf/elf_getarsym.c
257     +++ elfutils-0.122/libelf/elf_getarsym.c
258     @@ -179,6 +179,9 @@ elf_getarsym (elf, ptr)
259     size_t index_size = atol (tmpbuf);
260    
261     if (SARMAG + sizeof (struct ar_hdr) + index_size > elf->maximum_size
262     +#if SIZE_MAX <= 4294967295U
263     + || n >= SIZE_MAX / sizeof (Elf_Arsym)
264     +#endif
265     || n * sizeof (uint32_t) > index_size)
266     {
267     /* This index table cannot be right since it does not fit into
268     --- elfutils-0.122/libelf/elf_getshstrndx.c
269     +++ elfutils-0.122/libelf/elf_getshstrndx.c
270     @@ -125,10 +125,25 @@ elf_getshstrndx (elf, dst)
271     if (elf->map_address != NULL
272     && elf->state.elf32.ehdr->e_ident[EI_DATA] == MY_ELFDATA
273     && (ALLOW_UNALIGNED
274     - || (((size_t) ((char *) elf->map_address + offset))
275     + || (((size_t) ((char *) elf->map_address
276     + + elf->start_offset + offset))
277     & (__alignof__ (Elf32_Shdr) - 1)) == 0))
278     + {
279     + /* First see whether the information in the ELF header is
280     + valid and it does not ask for too much. */
281     + if (unlikely (offset + sizeof (Elf32_Shdr)
282     + > elf->maximum_size))
283     + {
284     + /* Something is wrong. */
285     + __libelf_seterrno (ELF_E_INVALID_SECTION_HEADER);
286     + result = -1;
287     + goto out;
288     + }
289     +
290     /* We can directly access the memory. */
291     - num = ((Elf32_Shdr *) (elf->map_address + offset))->sh_link;
292     + num = ((Elf32_Shdr *) (elf->map_address + elf->start_offset
293     + + offset))->sh_link;
294     + }
295     else
296     {
297     /* We avoid reading in all the section headers. Just read
298     @@ -163,10 +178,25 @@ elf_getshstrndx (elf, dst)
299     if (elf->map_address != NULL
300     && elf->state.elf64.ehdr->e_ident[EI_DATA] == MY_ELFDATA
301     && (ALLOW_UNALIGNED
302     - || (((size_t) ((char *) elf->map_address + offset))
303     + || (((size_t) ((char *) elf->map_address
304     + + elf->start_offset + offset))
305     & (__alignof__ (Elf64_Shdr) - 1)) == 0))
306     + {
307     + /* First see whether the information in the ELF header is
308     + valid and it does not ask for too much. */
309     + if (unlikely (offset + sizeof (Elf64_Shdr)
310     + > elf->maximum_size))
311     + {
312     + /* Something is wrong. */
313     + __libelf_seterrno (ELF_E_INVALID_SECTION_HEADER);
314     + result = -1;
315     + goto out;
316     + }
317     +
318     /* We can directly access the memory. */
319     - num = ((Elf64_Shdr *) (elf->map_address + offset))->sh_link;
320     + num = ((Elf64_Shdr *) (elf->map_address
321     + + elf->start_offset + offset))->sh_link;
322     + }
323     else
324     {
325     /* We avoid reading in all the section headers. Just read
326     --- elfutils-0.122/libelf/elf_newscn.c
327     +++ elfutils-0.122/libelf/elf_newscn.c
328     @@ -104,10 +104,18 @@ elf_newscn (elf)
329     else
330     {
331     /* We must allocate a new element. */
332     - Elf_ScnList *newp;
333     + Elf_ScnList *newp = NULL;
334    
335     assert (elf->state.elf.scnincr > 0);
336    
337     + if (
338     +#if SIZE_MAX <= 4294967295U
339     + likely (elf->state.elf.scnincr
340     + < SIZE_MAX / 2 / sizeof (Elf_Scn) - sizeof (Elf_ScnList))
341     +#else
342     + 1
343     +#endif
344     + )
345     newp = (Elf_ScnList *) calloc (sizeof (Elf_ScnList)
346     + ((elf->state.elf.scnincr *= 2)
347     * sizeof (Elf_Scn)), 1);
348     --- elfutils-0.122/libelf/gelf_getdyn.c
349     +++ elfutils-0.122/libelf/gelf_getdyn.c
350     @@ -93,7 +93,8 @@ gelf_getdyn (data, ndx, dst)
351     table entries has to be adopted. The user better has provided
352     a buffer where we can store the information. While copying the
353     data we are converting the format. */
354     - if (unlikely ((ndx + 1) * sizeof (Elf32_Dyn) > data_scn->d.d_size))
355     + if (INVALID_NDX (ndx, Elf32_Dyn)
356     + || unlikely ((ndx + 1) * sizeof (Elf32_Dyn) > data_scn->d.d_size))
357     {
358     __libelf_seterrno (ELF_E_INVALID_INDEX);
359     goto out;
360     @@ -114,7 +115,8 @@ gelf_getdyn (data, ndx, dst)
361    
362     /* The data is already in the correct form. Just make sure the
363     index is OK. */
364     - if (unlikely ((ndx + 1) * sizeof (GElf_Dyn) > data_scn->d.d_size))
365     + if (INVALID_NDX (ndx, GElf_Dyn)
366     + || unlikely ((ndx + 1) * sizeof (GElf_Dyn) > data_scn->d.d_size))
367     {
368     __libelf_seterrno (ELF_E_INVALID_INDEX);
369     goto out;
370     --- elfutils-0.122/libelf/gelf_getlib.c
371     +++ elfutils-0.122/libelf/gelf_getlib.c
372     @@ -86,7 +86,8 @@ gelf_getlib (data, ndx, dst)
373     /* The data is already in the correct form. Just make sure the
374     index is OK. */
375     GElf_Lib *result = NULL;
376     - if (unlikely ((ndx + 1) * sizeof (GElf_Lib) > data->d_size))
377     + if (INVALID_NDX (ndx, GElf_Lib)
378     + || unlikely ((ndx + 1) * sizeof (GElf_Lib) > data->d_size))
379     __libelf_seterrno (ELF_E_INVALID_INDEX);
380     else
381     {
382     --- elfutils-0.122/libelf/gelf_getmove.c
383     +++ elfutils-0.122/libelf/gelf_getmove.c
384     @@ -83,7 +83,8 @@ gelf_getmove (data, ndx, dst)
385    
386     /* The data is already in the correct form. Just make sure the
387     index is OK. */
388     - if (unlikely ((ndx + 1) * sizeof (GElf_Move) > data->d_size))
389     + if (INVALID_NDX (ndx, GElf_Move)
390     + || unlikely ((ndx + 1) * sizeof (GElf_Move) > data->d_size))
391     {
392     __libelf_seterrno (ELF_E_INVALID_INDEX);
393     goto out;
394     --- elfutils-0.122/libelf/gelf_getrela.c
395     +++ elfutils-0.122/libelf/gelf_getrela.c
396     @@ -71,12 +71,6 @@ gelf_getrela (data, ndx, dst)
397     if (data_scn == NULL)
398     return NULL;
399    
400     - if (unlikely (ndx < 0))
401     - {
402     - __libelf_seterrno (ELF_E_INVALID_INDEX);
403     - return NULL;
404     - }
405     -
406     if (unlikely (data_scn->d.d_type != ELF_T_RELA))
407     {
408     __libelf_seterrno (ELF_E_INVALID_HANDLE);
409     @@ -93,7 +87,8 @@ gelf_getrela (data, ndx, dst)
410     if (scn->elf->class == ELFCLASS32)
411     {
412     /* We have to convert the data. */
413     - if (unlikely ((ndx + 1) * sizeof (Elf32_Rela) > data_scn->d.d_size))
414     + if (INVALID_NDX (ndx, Elf32_Rela)
415     + || unlikely ((ndx + 1) * sizeof (Elf32_Rela) > data_scn->d.d_size))
416     {
417     __libelf_seterrno (ELF_E_INVALID_INDEX);
418     result = NULL;
419     @@ -114,7 +109,8 @@ gelf_getrela (data, ndx, dst)
420     {
421     /* Simply copy the data after we made sure we are actually getting
422     correct data. */
423     - if (unlikely ((ndx + 1) * sizeof (Elf64_Rela) > data_scn->d.d_size))
424     + if (INVALID_NDX (ndx, Elf64_Rela)
425     + || unlikely ((ndx + 1) * sizeof (Elf64_Rela) > data_scn->d.d_size))
426     {
427     __libelf_seterrno (ELF_E_INVALID_INDEX);
428     result = NULL;
429     --- elfutils-0.122/libelf/gelf_getrel.c
430     +++ elfutils-0.122/libelf/gelf_getrel.c
431     @@ -71,12 +71,6 @@ gelf_getrel (data, ndx, dst)
432     if (data_scn == NULL)
433     return NULL;
434    
435     - if (unlikely (ndx < 0))
436     - {
437     - __libelf_seterrno (ELF_E_INVALID_INDEX);
438     - return NULL;
439     - }
440     -
441     if (unlikely (data_scn->d.d_type != ELF_T_REL))
442     {
443     __libelf_seterrno (ELF_E_INVALID_HANDLE);
444     @@ -93,7 +87,8 @@ gelf_getrel (data, ndx, dst)
445     if (scn->elf->class == ELFCLASS32)
446     {
447     /* We have to convert the data. */
448     - if (unlikely ((ndx + 1) * sizeof (Elf32_Rel) > data_scn->d.d_size))
449     + if (INVALID_NDX (ndx, Elf32_Rel)
450     + || unlikely ((ndx + 1) * sizeof (Elf32_Rel) > data_scn->d.d_size))
451     {
452     __libelf_seterrno (ELF_E_INVALID_INDEX);
453     result = NULL;
454     @@ -113,7 +108,8 @@ gelf_getrel (data, ndx, dst)
455     {
456     /* Simply copy the data after we made sure we are actually getting
457     correct data. */
458     - if (unlikely ((ndx + 1) * sizeof (Elf64_Rel) > data_scn->d.d_size))
459     + if (INVALID_NDX (ndx, Elf64_Rel)
460     + || unlikely ((ndx + 1) * sizeof (Elf64_Rel) > data_scn->d.d_size))
461     {
462     __libelf_seterrno (ELF_E_INVALID_INDEX);
463     result = NULL;
464     --- elfutils-0.122/libelf/gelf_getsym.c
465     +++ elfutils-0.122/libelf/gelf_getsym.c
466     @@ -90,7 +90,8 @@ gelf_getsym (data, ndx, dst)
467     table entries has to be adopted. The user better has provided
468     a buffer where we can store the information. While copying the
469     data we are converting the format. */
470     - if (unlikely ((ndx + 1) * sizeof (Elf32_Sym) > data->d_size))
471     + if (INVALID_NDX (ndx, Elf32_Sym)
472     + || unlikely ((ndx + 1) * sizeof (Elf32_Sym) > data->d_size))
473     {
474     __libelf_seterrno (ELF_E_INVALID_INDEX);
475     goto out;
476     @@ -119,7 +120,8 @@ gelf_getsym (data, ndx, dst)
477    
478     /* The data is already in the correct form. Just make sure the
479     index is OK. */
480     - if (unlikely ((ndx + 1) * sizeof (GElf_Sym) > data->d_size))
481     + if (INVALID_NDX (ndx, GElf_Sym)
482     + || unlikely ((ndx + 1) * sizeof (GElf_Sym) > data->d_size))
483     {
484     __libelf_seterrno (ELF_E_INVALID_INDEX);
485     goto out;
486     --- elfutils-0.122/libelf/gelf_getsyminfo.c
487     +++ elfutils-0.122/libelf/gelf_getsyminfo.c
488     @@ -84,7 +84,8 @@ gelf_getsyminfo (data, ndx, dst)
489    
490     /* The data is already in the correct form. Just make sure the
491     index is OK. */
492     - if (unlikely ((ndx + 1) * sizeof (GElf_Syminfo) > data->d_size))
493     + if (INVALID_NDX (ndx, GElf_Syminfo)
494     + || unlikely ((ndx + 1) * sizeof (GElf_Syminfo) > data->d_size))
495     {
496     __libelf_seterrno (ELF_E_INVALID_INDEX);
497     goto out;
498     --- elfutils-0.122/libelf/gelf_getsymshndx.c
499     +++ elfutils-0.122/libelf/gelf_getsymshndx.c
500     @@ -90,7 +90,9 @@ gelf_getsymshndx (symdata, shndxdata, nd
501     section index table. */
502     if (likely (shndxdata_scn != NULL))
503     {
504     - if (unlikely ((ndx + 1) * sizeof (Elf32_Word) > shndxdata_scn->d.d_size))
505     + if (INVALID_NDX (ndx, Elf32_Word)
506     + || unlikely ((ndx + 1) * sizeof (Elf32_Word)
507     + > shndxdata_scn->d.d_size))
508     {
509     __libelf_seterrno (ELF_E_INVALID_INDEX);
510     goto out;
511     @@ -110,7 +112,8 @@ gelf_getsymshndx (symdata, shndxdata, nd
512     table entries has to be adopted. The user better has provided
513     a buffer where we can store the information. While copying the
514     data we are converting the format. */
515     - if (unlikely ((ndx + 1) * sizeof (Elf32_Sym) > symdata->d_size))
516     + if (INVALID_NDX (ndx, Elf32_Sym)
517     + || unlikely ((ndx + 1) * sizeof (Elf32_Sym) > symdata->d_size))
518     {
519     __libelf_seterrno (ELF_E_INVALID_INDEX);
520     goto out;
521     @@ -139,7 +142,8 @@ gelf_getsymshndx (symdata, shndxdata, nd
522    
523     /* The data is already in the correct form. Just make sure the
524     index is OK. */
525     - if (unlikely ((ndx + 1) * sizeof (GElf_Sym) > symdata->d_size))
526     + if (INVALID_NDX (ndx, GElf_Sym)
527     + || unlikely ((ndx + 1) * sizeof (GElf_Sym) > symdata->d_size))
528     {
529     __libelf_seterrno (ELF_E_INVALID_INDEX);
530     goto out;
531     --- elfutils-0.122/libelf/gelf_getversym.c
532     +++ elfutils-0.122/libelf/gelf_getversym.c
533     @@ -92,7 +92,8 @@ gelf_getversym (data, ndx, dst)
534    
535     /* The data is already in the correct form. Just make sure the
536     index is OK. */
537     - if (unlikely ((ndx + 1) * sizeof (GElf_Versym) > data->d_size))
538     + if (INVALID_NDX (ndx, GElf_Versym)
539     + || unlikely ((ndx + 1) * sizeof (GElf_Versym) > data->d_size))
540     {
541     __libelf_seterrno (ELF_E_INVALID_INDEX);
542     result = NULL;
543     --- elfutils-0.122/libelf/gelf_update_dyn.c
544     +++ elfutils-0.122/libelf/gelf_update_dyn.c
545     @@ -71,12 +71,6 @@ gelf_update_dyn (data, ndx, src)
546     if (data == NULL)
547     return 0;
548    
549     - if (unlikely (ndx < 0))
550     - {
551     - __libelf_seterrno (ELF_E_INVALID_INDEX);
552     - return 0;
553     - }
554     -
555     if (unlikely (data_scn->d.d_type != ELF_T_DYN))
556     {
557     /* The type of the data better should match. */
558     @@ -102,7 +96,8 @@ gelf_update_dyn (data, ndx, src)
559     }
560    
561     /* Check whether we have to resize the data buffer. */
562     - if (unlikely ((ndx + 1) * sizeof (Elf32_Dyn) > data_scn->d.d_size))
563     + if (INVALID_NDX (ndx, Elf32_Dyn)
564     + || unlikely ((ndx + 1) * sizeof (Elf32_Dyn) > data_scn->d.d_size))
565     {
566     __libelf_seterrno (ELF_E_INVALID_INDEX);
567     goto out;
568     @@ -116,7 +111,8 @@ gelf_update_dyn (data, ndx, src)
569     else
570     {
571     /* Check whether we have to resize the data buffer. */
572     - if (unlikely ((ndx + 1) * sizeof (Elf64_Dyn) > data_scn->d.d_size))
573     + if (INVALID_NDX (ndx, Elf64_Dyn)
574     + || unlikely ((ndx + 1) * sizeof (Elf64_Dyn) > data_scn->d.d_size))
575     {
576     __libelf_seterrno (ELF_E_INVALID_INDEX);
577     goto out;
578     --- elfutils-0.122/libelf/gelf_update_lib.c
579     +++ elfutils-0.122/libelf/gelf_update_lib.c
580     @@ -68,12 +68,6 @@ gelf_update_lib (data, ndx, src)
581     if (data == NULL)
582     return 0;
583    
584     - if (unlikely (ndx < 0))
585     - {
586     - __libelf_seterrno (ELF_E_INVALID_INDEX);
587     - return 0;
588     - }
589     -
590     Elf_Data_Scn *data_scn = (Elf_Data_Scn *) data;
591     if (unlikely (data_scn->d.d_type != ELF_T_LIB))
592     {
593     @@ -87,7 +81,8 @@ gelf_update_lib (data, ndx, src)
594    
595     /* Check whether we have to resize the data buffer. */
596     int result = 0;
597     - if (unlikely ((ndx + 1) * sizeof (Elf64_Lib) > data_scn->d.d_size))
598     + if (INVALID_NDX (ndx, Elf64_Lib)
599     + || unlikely ((ndx + 1) * sizeof (Elf64_Lib) > data_scn->d.d_size))
600     __libelf_seterrno (ELF_E_INVALID_INDEX);
601     else
602     {
603     --- elfutils-0.122/libelf/gelf_update_move.c
604     +++ elfutils-0.122/libelf/gelf_update_move.c
605     @@ -75,7 +75,7 @@ gelf_update_move (data, ndx, src)
606     assert (sizeof (GElf_Move) == sizeof (Elf64_Move));
607    
608     /* Check whether we have to resize the data buffer. */
609     - if (unlikely (ndx < 0)
610     + if (INVALID_NDX (ndx, GElf_Move)
611     || unlikely ((ndx + 1) * sizeof (GElf_Move) > data_scn->d.d_size))
612     {
613     __libelf_seterrno (ELF_E_INVALID_INDEX);
614     --- elfutils-0.122/libelf/gelf_update_rela.c
615     +++ elfutils-0.122/libelf/gelf_update_rela.c
616     @@ -68,12 +68,6 @@ gelf_update_rela (Elf_Data *dst, int ndx
617     if (dst == NULL)
618     return 0;
619    
620     - if (unlikely (ndx < 0))
621     - {
622     - __libelf_seterrno (ELF_E_INVALID_INDEX);
623     - return 0;
624     - }
625     -
626     if (unlikely (data_scn->d.d_type != ELF_T_RELA))
627     {
628     /* The type of the data better should match. */
629     @@ -101,7 +95,8 @@ gelf_update_rela (Elf_Data *dst, int ndx
630     }
631    
632     /* Check whether we have to resize the data buffer. */
633     - if (unlikely ((ndx + 1) * sizeof (Elf32_Rela) > data_scn->d.d_size))
634     + if (INVALID_NDX (ndx, Elf32_Rela)
635     + || unlikely ((ndx + 1) * sizeof (Elf32_Rela) > data_scn->d.d_size))
636     {
637     __libelf_seterrno (ELF_E_INVALID_INDEX);
638     goto out;
639     @@ -117,7 +112,8 @@ gelf_update_rela (Elf_Data *dst, int ndx
640     else
641     {
642     /* Check whether we have to resize the data buffer. */
643     - if (unlikely ((ndx + 1) * sizeof (Elf64_Rela) > data_scn->d.d_size))
644     + if (INVALID_NDX (ndx, Elf64_Rela)
645     + || unlikely ((ndx + 1) * sizeof (Elf64_Rela) > data_scn->d.d_size))
646     {
647     __libelf_seterrno (ELF_E_INVALID_INDEX);
648     goto out;
649     --- elfutils-0.122/libelf/gelf_update_rel.c
650     +++ elfutils-0.122/libelf/gelf_update_rel.c
651     @@ -68,12 +68,6 @@ gelf_update_rel (Elf_Data *dst, int ndx,
652     if (dst == NULL)
653     return 0;
654    
655     - if (unlikely (ndx < 0))
656     - {
657     - __libelf_seterrno (ELF_E_INVALID_INDEX);
658     - return 0;
659     - }
660     -
661     if (unlikely (data_scn->d.d_type != ELF_T_REL))
662     {
663     /* The type of the data better should match. */
664     @@ -99,7 +93,8 @@ gelf_update_rel (Elf_Data *dst, int ndx,
665     }
666    
667     /* Check whether we have to resize the data buffer. */
668     - if (unlikely ((ndx + 1) * sizeof (Elf32_Rel) > data_scn->d.d_size))
669     + if (INVALID_NDX (ndx, Elf32_Rel)
670     + || unlikely ((ndx + 1) * sizeof (Elf32_Rel) > data_scn->d.d_size))
671     {
672     __libelf_seterrno (ELF_E_INVALID_INDEX);
673     goto out;
674     @@ -114,7 +109,8 @@ gelf_update_rel (Elf_Data *dst, int ndx,
675     else
676     {
677     /* Check whether we have to resize the data buffer. */
678     - if (unlikely ((ndx + 1) * sizeof (Elf64_Rel) > data_scn->d.d_size))
679     + if (INVALID_NDX (ndx, Elf64_Rel)
680     + || unlikely ((ndx + 1) * sizeof (Elf64_Rel) > data_scn->d.d_size))
681     {
682     __libelf_seterrno (ELF_E_INVALID_INDEX);
683     goto out;
684     --- elfutils-0.122/libelf/gelf_update_sym.c
685     +++ elfutils-0.122/libelf/gelf_update_sym.c
686     @@ -72,12 +72,6 @@ gelf_update_sym (data, ndx, src)
687     if (data == NULL)
688     return 0;
689    
690     - if (unlikely (ndx < 0))
691     - {
692     - __libelf_seterrno (ELF_E_INVALID_INDEX);
693     - return 0;
694     - }
695     -
696     if (unlikely (data_scn->d.d_type != ELF_T_SYM))
697     {
698     /* The type of the data better should match. */
699     @@ -102,7 +96,8 @@ gelf_update_sym (data, ndx, src)
700     }
701    
702     /* Check whether we have to resize the data buffer. */
703     - if (unlikely ((ndx + 1) * sizeof (Elf32_Sym) > data_scn->d.d_size))
704     + if (INVALID_NDX (ndx, Elf32_Sym)
705     + || unlikely ((ndx + 1) * sizeof (Elf32_Sym) > data_scn->d.d_size))
706     {
707     __libelf_seterrno (ELF_E_INVALID_INDEX);
708     goto out;
709     @@ -125,7 +120,8 @@ gelf_update_sym (data, ndx, src)
710     else
711     {
712     /* Check whether we have to resize the data buffer. */
713     - if (unlikely ((ndx + 1) * sizeof (Elf64_Sym) > data_scn->d.d_size))
714     + if (INVALID_NDX (ndx, Elf64_Sym)
715     + || unlikely ((ndx + 1) * sizeof (Elf64_Sym) > data_scn->d.d_size))
716     {
717     __libelf_seterrno (ELF_E_INVALID_INDEX);
718     goto out;
719     --- elfutils-0.122/libelf/gelf_update_syminfo.c
720     +++ elfutils-0.122/libelf/gelf_update_syminfo.c
721     @@ -72,12 +72,6 @@ gelf_update_syminfo (data, ndx, src)
722     if (data == NULL)
723     return 0;
724    
725     - if (unlikely (ndx < 0))
726     - {
727     - __libelf_seterrno (ELF_E_INVALID_INDEX);
728     - return 0;
729     - }
730     -
731     if (unlikely (data_scn->d.d_type != ELF_T_SYMINFO))
732     {
733     /* The type of the data better should match. */
734     @@ -93,7 +87,8 @@ gelf_update_syminfo (data, ndx, src)
735     rwlock_wrlock (scn->elf->lock);
736    
737     /* Check whether we have to resize the data buffer. */
738     - if (unlikely ((ndx + 1) * sizeof (GElf_Syminfo) > data_scn->d.d_size))
739     + if (INVALID_NDX (ndx, GElf_Syminfo)
740     + || unlikely ((ndx + 1) * sizeof (GElf_Syminfo) > data_scn->d.d_size))
741     {
742     __libelf_seterrno (ELF_E_INVALID_INDEX);
743     goto out;
744     --- elfutils-0.122/libelf/gelf_update_symshndx.c
745     +++ elfutils-0.122/libelf/gelf_update_symshndx.c
746     @@ -77,12 +77,6 @@ gelf_update_symshndx (symdata, shndxdata
747     if (symdata == NULL)
748     return 0;
749    
750     - if (unlikely (ndx < 0))
751     - {
752     - __libelf_seterrno (ELF_E_INVALID_INDEX);
753     - return 0;
754     - }
755     -
756     if (unlikely (symdata_scn->d.d_type != ELF_T_SYM))
757     {
758     /* The type of the data better should match. */
759     @@ -128,7 +122,8 @@ gelf_update_symshndx (symdata, shndxdata
760     }
761    
762     /* Check whether we have to resize the data buffer. */
763     - if (unlikely ((ndx + 1) * sizeof (Elf32_Sym) > symdata_scn->d.d_size))
764     + if (INVALID_NDX (ndx, Elf32_Sym)
765     + || unlikely ((ndx + 1) * sizeof (Elf32_Sym) > symdata_scn->d.d_size))
766     {
767     __libelf_seterrno (ELF_E_INVALID_INDEX);
768     goto out;
769     @@ -151,7 +146,8 @@ gelf_update_symshndx (symdata, shndxdata
770     else
771     {
772     /* Check whether we have to resize the data buffer. */
773     - if (unlikely ((ndx + 1) * sizeof (Elf64_Sym) > symdata_scn->d.d_size))
774     + if (INVALID_NDX (ndx, Elf64_Sym)
775     + || unlikely ((ndx + 1) * sizeof (Elf64_Sym) > symdata_scn->d.d_size))
776     {
777     __libelf_seterrno (ELF_E_INVALID_INDEX);
778     goto out;
779     --- elfutils-0.122/libelf/gelf_update_versym.c
780     +++ elfutils-0.122/libelf/gelf_update_versym.c
781     @@ -75,7 +75,7 @@ gelf_update_versym (data, ndx, src)
782     assert (sizeof (GElf_Versym) == sizeof (Elf64_Versym));
783    
784     /* Check whether we have to resize the data buffer. */
785     - if (unlikely (ndx < 0)
786     + if (INVALID_NDX (ndx, GElf_Versym)
787     || unlikely ((ndx + 1) * sizeof (GElf_Versym) > data_scn->d.d_size))
788     {
789     __libelf_seterrno (ELF_E_INVALID_INDEX);
790     --- elfutils-0.122/libelf/libelfP.h
791     +++ elfutils-0.122/libelf/libelfP.h
792     @@ -558,4 +558,13 @@ extern uint32_t __libelf_crc32 (uint32_t
793     } \
794     } while (0)
795    
796     +/* Convenience macro. Assumes int NDX and TYPE with size at least
797     + 2 bytes. */
798     +#if SIZE_MAX > 4294967295U
799     +# define INVALID_NDX(ndx, type) unlikely (ndx < 0)
800     +#else
801     +# define INVALID_NDX(ndx, type) \
802     + unlikely ((unsigned int) (ndx) >= SIZE_MAX / sizeof (type))
803     +#endif
804     +
805     #endif /* libelfP.h */
806     --- elfutils-0.122/src/elflint.c
807     +++ elfutils-0.122/src/elflint.c
808     @@ -123,6 +123,9 @@ static uint32_t shstrndx;
809     /* Array to count references in section groups. */
810     static int *scnref;
811    
812     +/* Number of sections. */
813     +static unsigned int shnum;
814     +
815    
816     int
817     main (int argc, char *argv[])
818     @@ -312,10 +315,19 @@ section_name (Ebl *ebl, int idx)
819     {
820     GElf_Shdr shdr_mem;
821     GElf_Shdr *shdr;
822     + const char *ret;
823     +
824     + if ((unsigned int) idx > shnum)
825     + return "<invalid>";
826    
827     shdr = gelf_getshdr (elf_getscn (ebl->elf, idx), &shdr_mem);
828     + if (shdr == NULL)
829     + return "<invalid>";
830    
831     - return elf_strptr (ebl->elf, shstrndx, shdr->sh_name);
832     + ret = elf_strptr (ebl->elf, shstrndx, shdr->sh_name);
833     + if (ret == NULL)
834     + return "<invalid>";
835     + return ret;
836     }
837    
838    
839     @@ -337,10 +349,6 @@ static const int valid_e_machine[] =
840     (sizeof (valid_e_machine) / sizeof (valid_e_machine[0]))
841    
842    
843     -/* Number of sections. */
844     -static unsigned int shnum;
845     -
846     -
847     static void
848     check_elf_header (Ebl *ebl, GElf_Ehdr *ehdr, size_t size)
849     {
850     @@ -603,7 +611,8 @@ section [%2d] '%s': symbol table cannot
851     }
852     }
853    
854     - if (shdr->sh_entsize != gelf_fsize (ebl->elf, ELF_T_SYM, 1, EV_CURRENT))
855     + size_t sh_entsize = gelf_fsize (ebl->elf, ELF_T_SYM, 1, EV_CURRENT);
856     + if (shdr->sh_entsize != sh_entsize)
857     ERROR (gettext ("\
858     section [%2zu] '%s': entry size is does not match ElfXX_Sym\n"),
859     cnt, section_name (ebl, cnt));
860     @@ -641,7 +650,7 @@ section [%2d] '%s': XINDEX for zeroth en
861     xndxscnidx, section_name (ebl, xndxscnidx));
862     }
863    
864     - for (cnt = 1; cnt < shdr->sh_size / shdr->sh_entsize; ++cnt)
865     + for (cnt = 1; cnt < shdr->sh_size / sh_entsize; ++cnt)
866     {
867     sym = gelf_getsymshndx (data, xndxdata, cnt, &sym_mem, &xndx);
868     if (sym == NULL)
869     @@ -659,7 +668,8 @@ section [%2d] '%s': symbol %zu: invalid
870     else
871     {
872     name = elf_strptr (ebl->elf, shdr->sh_link, sym->st_name);
873     - assert (name != NULL);
874     + assert (name != NULL
875     + || strshdr->sh_type != SHT_STRTAB);
876     }
877    
878     if (sym->st_shndx == SHN_XINDEX)
879     @@ -968,9 +978,11 @@ is_rel_dyn (Ebl *ebl, const GElf_Ehdr *e
880     {
881     GElf_Shdr rcshdr_mem;
882     const GElf_Shdr *rcshdr = gelf_getshdr (scn, &rcshdr_mem);
883     - assert (rcshdr != NULL);
884    
885     - if (rcshdr->sh_type == SHT_DYNAMIC)
886     + if (rcshdr == NULL)
887     + break;
888     +
889     + if (rcshdr->sh_type == SHT_DYNAMIC && rcshdr->sh_entsize)
890     {
891     /* Found the dynamic section. Look through it. */
892     Elf_Data *d = elf_getdata (scn, NULL);
893     @@ -980,7 +992,9 @@ is_rel_dyn (Ebl *ebl, const GElf_Ehdr *e
894     {
895     GElf_Dyn dyn_mem;
896     GElf_Dyn *dyn = gelf_getdyn (d, cnt, &dyn_mem);
897     - assert (dyn != NULL);
898     +
899     + if (dyn == NULL)
900     + break;
901    
902     if (dyn->d_tag == DT_RELCOUNT)
903     {
904     @@ -994,7 +1008,9 @@ section [%2d] '%s': DT_RELCOUNT used for
905     /* Does the number specified number of relative
906     relocations exceed the total number of
907     relocations? */
908     - if (dyn->d_un.d_val > shdr->sh_size / shdr->sh_entsize)
909     + if (shdr->sh_entsize != 0
910     + && dyn->d_un.d_val > (shdr->sh_size
911     + / shdr->sh_entsize))
912     ERROR (gettext ("\
913     section [%2d] '%s': DT_RELCOUNT value %d too high for this section\n"),
914     idx, section_name (ebl, idx),
915     @@ -1154,7 +1170,8 @@ section [%2d] '%s': no relocations for m
916     }
917     }
918    
919     - if (shdr->sh_entsize != gelf_fsize (ebl->elf, reltype, 1, EV_CURRENT))
920     + size_t sh_entsize = gelf_fsize (ebl->elf, reltype, 1, EV_CURRENT);
921     + if (shdr->sh_entsize != sh_entsize)
922     ERROR (gettext (reltype == ELF_T_RELA ? "\
923     section [%2d] '%s': section entry size does not match ElfXX_Rela\n" : "\
924     section [%2d] '%s': section entry size does not match ElfXX_Rel\n"),
925     @@ -1376,7 +1393,8 @@ check_rela (Ebl *ebl, GElf_Ehdr *ehdr, G
926     Elf_Data *symdata = elf_getdata (symscn, NULL);
927     enum load_state state = state_undecided;
928    
929     - for (size_t cnt = 0; cnt < shdr->sh_size / shdr->sh_entsize; ++cnt)
930     + size_t sh_entsize = gelf_fsize (ebl->elf, ELF_T_RELA, 1, EV_CURRENT);
931     + for (size_t cnt = 0; cnt < shdr->sh_size / sh_entsize; ++cnt)
932     {
933     GElf_Rela rela_mem;
934     GElf_Rela *rela = gelf_getrela (data, cnt, &rela_mem);
935     @@ -1426,7 +1444,8 @@ check_rel (Ebl *ebl, GElf_Ehdr *ehdr, GE
936     Elf_Data *symdata = elf_getdata (symscn, NULL);
937     enum load_state state = state_undecided;
938    
939     - for (size_t cnt = 0; cnt < shdr->sh_size / shdr->sh_entsize; ++cnt)
940     + size_t sh_entsize = gelf_fsize (ebl->elf, ELF_T_REL, 1, EV_CURRENT);
941     + for (size_t cnt = 0; cnt < shdr->sh_size / sh_entsize; ++cnt)
942     {
943     GElf_Rel rel_mem;
944     GElf_Rel *rel = gelf_getrel (data, cnt, &rel_mem);
945     @@ -1528,7 +1547,8 @@ section [%2d] '%s': referenced as string
946     shdr->sh_link, section_name (ebl, shdr->sh_link),
947     idx, section_name (ebl, idx));
948    
949     - if (shdr->sh_entsize != gelf_fsize (ebl->elf, ELF_T_DYN, 1, EV_CURRENT))
950     + size_t sh_entsize = gelf_fsize (ebl->elf, ELF_T_DYN, 1, EV_CURRENT);
951     + if (shdr->sh_entsize != sh_entsize)
952     ERROR (gettext ("\
953     section [%2d] '%s': section entry size does not match ElfXX_Dyn\n"),
954     idx, section_name (ebl, idx));
955     @@ -1538,7 +1558,7 @@ section [%2d] '%s': section entry size d
956     idx, section_name (ebl, idx));
957    
958     bool non_null_warned = false;
959     - for (cnt = 0; cnt < shdr->sh_size / shdr->sh_entsize; ++cnt)
960     + for (cnt = 0; cnt < shdr->sh_size / sh_entsize; ++cnt)
961     {
962     GElf_Dyn dyn_mem;
963     GElf_Dyn *dyn = gelf_getdyn (data, cnt, &dyn_mem);
964     @@ -1756,6 +1776,8 @@ section [%2d] '%s': entry size does not
965     idx, section_name (ebl, idx));
966    
967     if (symshdr != NULL
968     + && shdr->sh_entsize
969     + && symshdr->sh_entsize
970     && (shdr->sh_size / shdr->sh_entsize
971     < symshdr->sh_size / symshdr->sh_entsize))
972     ERROR (gettext ("\
973     @@ -1782,6 +1804,12 @@ section [%2d] '%s': extended section ind
974     }
975    
976     Elf_Data *data = elf_getdata (elf_getscn (ebl->elf, idx), NULL);
977     + if (data == NULL)
978     + {
979     + ERROR (gettext ("section [%2d] '%s': cannot get section data\n"),
980     + idx, section_name (ebl, idx));
981     + return;
982     + }
983    
984     if (*((Elf32_Word *) data->d_buf) != 0)
985     ERROR (gettext ("symbol 0 should have zero extended section index\n"));
986     @@ -1824,7 +1852,7 @@ section [%2d] '%s': hash table section i
987    
988     size_t maxidx = nchain;
989    
990     - if (symshdr != NULL)
991     + if (symshdr != NULL && symshdr->sh_entsize != 0)
992     {
993     size_t symsize = symshdr->sh_size / symshdr->sh_entsize;
994    
995     @@ -1835,18 +1863,28 @@ section [%2d] '%s': hash table section i
996     maxidx = symsize;
997     }
998    
999     + Elf32_Word *buf = (Elf32_Word *) data->d_buf;
1000     + Elf32_Word *end = (Elf32_Word *) ((char *) data->d_buf + shdr->sh_size);
1001     size_t cnt;
1002     for (cnt = 2; cnt < 2 + nbucket; ++cnt)
1003     - if (((Elf32_Word *) data->d_buf)[cnt] >= maxidx)
1004     - ERROR (gettext ("\
1005     + {
1006     + if (buf + cnt >= end)
1007     + break;
1008     + else if (buf[cnt] >= maxidx)
1009     + ERROR (gettext ("\
1010     section [%2d] '%s': hash bucket reference %zu out of bounds\n"),
1011     - idx, section_name (ebl, idx), cnt - 2);
1012     + idx, section_name (ebl, idx), cnt - 2);
1013     + }
1014    
1015     for (; cnt < 2 + nbucket + nchain; ++cnt)
1016     - if (((Elf32_Word *) data->d_buf)[cnt] >= maxidx)
1017     - ERROR (gettext ("\
1018     + {
1019     + if (buf + cnt >= end)
1020     + break;
1021     + else if (buf[cnt] >= maxidx)
1022     + ERROR (gettext ("\
1023     section [%2d] '%s': hash chain reference %zu out of bounds\n"),
1024     - idx, section_name (ebl, idx), cnt - 2 - nbucket);
1025     + idx, section_name (ebl, idx), cnt - 2 - nbucket);
1026     + }
1027     }
1028    
1029    
1030     @@ -1876,18 +1914,28 @@ section [%2d] '%s': hash table section i
1031     maxidx = symsize;
1032     }
1033    
1034     + Elf64_Xword *buf = (Elf64_Xword *) data->d_buf;
1035     + Elf64_Xword *end = (Elf64_Xword *) ((char *) data->d_buf + shdr->sh_size);
1036     size_t cnt;
1037     for (cnt = 2; cnt < 2 + nbucket; ++cnt)
1038     - if (((Elf64_Xword *) data->d_buf)[cnt] >= maxidx)
1039     - ERROR (gettext ("\
1040     + {
1041     + if (buf + cnt >= end)
1042     + break;
1043     + else if (buf[cnt] >= maxidx)
1044     + ERROR (gettext ("\
1045     section [%2d] '%s': hash bucket reference %zu out of bounds\n"),
1046     - idx, section_name (ebl, idx), cnt - 2);
1047     + idx, section_name (ebl, idx), cnt - 2);
1048     + }
1049    
1050     for (; cnt < 2 + nbucket + nchain; ++cnt)
1051     - if (((Elf64_Xword *) data->d_buf)[cnt] >= maxidx)
1052     - ERROR (gettext ("\
1053     + {
1054     + if (buf + cnt >= end)
1055     + break;
1056     + else if (buf[cnt] >= maxidx)
1057     + ERROR (gettext ("\
1058     section [%2d] '%s': hash chain reference %" PRIu64 " out of bounds\n"),
1059     - idx, section_name (ebl, idx), (uint64_t) (cnt - 2 - nbucket));
1060     + idx, section_name (ebl, idx), (uint64_t) cnt - 2 - nbucket);
1061     + }
1062     }
1063    
1064    
1065     @@ -1912,7 +1960,7 @@ section [%2d] '%s': bitmask size not pow
1066     if (shdr->sh_size < (4 + bitmask_words + nbuckets) * sizeof (Elf32_Word))
1067     {
1068     ERROR (gettext ("\
1069     -section [%2d] '%s': hash table section is too small (is %ld, expected at least%ld)\n"),
1070     +section [%2d] '%s': hash table section is too small (is %ld, expected at least %ld)\n"),
1071     idx, section_name (ebl, idx), (long int) shdr->sh_size,
1072     (long int) ((4 + bitmask_words + nbuckets) * sizeof (Elf32_Word)));
1073     return;
1074     @@ -2430,8 +2478,9 @@ section [%2d] '%s' refers in sh_link to
1075    
1076     /* The number of elements in the version symbol table must be the
1077     same as the number of symbols. */
1078     - if (shdr->sh_size / shdr->sh_entsize
1079     - != symshdr->sh_size / symshdr->sh_entsize)
1080     + if (shdr->sh_entsize && symshdr->sh_entsize
1081     + && (shdr->sh_size / shdr->sh_entsize
1082     + != symshdr->sh_size / symshdr->sh_entsize))
1083     ERROR (gettext ("\
1084     section [%2d] '%s' has different number of entries than symbol table [%2d] '%s'\n"),
1085     idx, section_name (ebl, idx),
1086     @@ -3336,6 +3385,8 @@ phdr[%d]: no note entries defined for th
1087     return;
1088    
1089     char *notemem = gelf_rawchunk (ebl->elf, phdr->p_offset, phdr->p_filesz);
1090     + if (notemem == NULL)
1091     + return;
1092    
1093     /* ELF64 files often use note section entries in the 32-bit format.
1094     The p_align field is set to 8 in case the 64-bit format is used.
1095     --- elfutils-0.122/src/readelf.c
1096     +++ elfutils-0.122/src/readelf.c
1097     @@ -958,6 +958,8 @@ handle_scngrp (Ebl *ebl, Elf_Scn *scn, G
1098     Elf32_Word *grpref = (Elf32_Word *) data->d_buf;
1099    
1100     GElf_Sym sym_mem;
1101     + GElf_Sym *sym = gelf_getsym (symdata, shdr->sh_info, &sym_mem);
1102     +
1103     printf ((grpref[0] & GRP_COMDAT)
1104     ? ngettext ("\
1105     \nCOMDAT section group [%2zu] '%s' with signature '%s' contains %zu entry:\n",
1106     @@ -970,8 +972,8 @@ handle_scngrp (Ebl *ebl, Elf_Scn *scn, G
1107     data->d_size / sizeof (Elf32_Word) - 1),
1108     elf_ndxscn (scn),
1109     elf_strptr (ebl->elf, shstrndx, shdr->sh_name),
1110     - elf_strptr (ebl->elf, symshdr->sh_link,
1111     - gelf_getsym (symdata, shdr->sh_info, &sym_mem)->st_name)
1112     + (sym == NULL ? NULL
1113     + : elf_strptr (ebl->elf, symshdr->sh_link, sym->st_name))
1114     ?: gettext ("<INVALID SYMBOL>"),
1115     data->d_size / sizeof (Elf32_Word) - 1);
1116    
1117     @@ -1122,7 +1124,8 @@ static void
1118     handle_dynamic (Ebl *ebl, Elf_Scn *scn, GElf_Shdr *shdr)
1119     {
1120     int class = gelf_getclass (ebl->elf);
1121     - GElf_Shdr glink;
1122     + GElf_Shdr glink_mem;
1123     + GElf_Shdr *glink;
1124     Elf_Data *data;
1125     size_t cnt;
1126     size_t shstrndx;
1127     @@ -1137,6 +1140,11 @@ handle_dynamic (Ebl *ebl, Elf_Scn *scn,
1128     error (EXIT_FAILURE, 0,
1129     gettext ("cannot get section header string table index"));
1130    
1131     + glink = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link), &glink_mem);
1132     + if (glink == NULL)
1133     + error (EXIT_FAILURE, 0, gettext ("invalid sh_link value in section %Zu"),
1134     + elf_ndxscn (scn));
1135     +
1136     printf (ngettext ("\
1137     \nDynamic segment contains %lu entry:\n Addr: %#0*" PRIx64 " Offset: %#08" PRIx64 " Link to section: [%2u] '%s'\n",
1138     "\
1139     @@ -1146,9 +1154,7 @@ handle_dynamic (Ebl *ebl, Elf_Scn *scn,
1140     class == ELFCLASS32 ? 10 : 18, shdr->sh_addr,
1141     shdr->sh_offset,
1142     (int) shdr->sh_link,
1143     - elf_strptr (ebl->elf, shstrndx,
1144     - gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link),
1145     - &glink)->sh_name));
1146     + elf_strptr (ebl->elf, shstrndx, glink->sh_name));
1147     fputs_unlocked (gettext (" Type Value\n"), stdout);
1148    
1149     for (cnt = 0; cnt < shdr->sh_size / shdr->sh_entsize; ++cnt)
1150     @@ -1666,6 +1672,13 @@ handle_symtab (Ebl *ebl, Elf_Scn *scn, G
1151     error (EXIT_FAILURE, 0,
1152     gettext ("cannot get section header string table index"));
1153    
1154     + GElf_Shdr glink_mem;
1155     + GElf_Shdr *glink = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link),
1156     + &glink_mem);
1157     + if (glink == NULL)
1158     + error (EXIT_FAILURE, 0, gettext ("invalid sh_link value in section %Zu"),
1159     + elf_ndxscn (scn));
1160     +
1161     /* Now we can compute the number of entries in the section. */
1162     unsigned int nsyms = data->d_size / (class == ELFCLASS32
1163     ? sizeof (Elf32_Sym)
1164     @@ -1676,15 +1689,12 @@ handle_symtab (Ebl *ebl, Elf_Scn *scn, G
1165     nsyms),
1166     (unsigned int) elf_ndxscn (scn),
1167     elf_strptr (ebl->elf, shstrndx, shdr->sh_name), nsyms);
1168     - GElf_Shdr glink;
1169     printf (ngettext (" %lu local symbol String table: [%2u] '%s'\n",
1170     " %lu local symbols String table: [%2u] '%s'\n",
1171     shdr->sh_info),
1172     (unsigned long int) shdr->sh_info,
1173     (unsigned int) shdr->sh_link,
1174     - elf_strptr (ebl->elf, shstrndx,
1175     - gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link),
1176     - &glink)->sh_name));
1177     + elf_strptr (ebl->elf, shstrndx, glink->sh_name));
1178    
1179     fputs_unlocked (class == ELFCLASS32
1180     ? gettext ("\
1181     @@ -1920,7 +1930,13 @@ handle_verneed (Ebl *ebl, Elf_Scn *scn,
1182     error (EXIT_FAILURE, 0,
1183     gettext ("cannot get section header string table index"));
1184    
1185     - GElf_Shdr glink;
1186     + GElf_Shdr glink_mem;
1187     + GElf_Shdr *glink = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link),
1188     + &glink_mem);
1189     + if (glink == NULL)
1190     + error (EXIT_FAILURE, 0, gettext ("invalid sh_link value in section %Zu"),
1191     + elf_ndxscn (scn));
1192     +
1193     printf (ngettext ("\
1194     \nVersion needs section [%2u] '%s' contains %d entry:\n Addr: %#0*" PRIx64 " Offset: %#08" PRIx64 " Link to section: [%2u] '%s'\n",
1195     "\
1196     @@ -1931,9 +1947,7 @@ handle_verneed (Ebl *ebl, Elf_Scn *scn,
1197     class == ELFCLASS32 ? 10 : 18, shdr->sh_addr,
1198     shdr->sh_offset,
1199     (unsigned int) shdr->sh_link,
1200     - elf_strptr (ebl->elf, shstrndx,
1201     - gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link),
1202     - &glink)->sh_name));
1203     + elf_strptr (ebl->elf, shstrndx, glink->sh_name));
1204    
1205     unsigned int offset = 0;
1206     for (int cnt = shdr->sh_info; --cnt >= 0; )
1207     @@ -1986,8 +2000,14 @@ handle_verdef (Ebl *ebl, Elf_Scn *scn, G
1208     error (EXIT_FAILURE, 0,
1209     gettext ("cannot get section header string table index"));
1210    
1211     + GElf_Shdr glink_mem;
1212     + GElf_Shdr *glink = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link),
1213     + &glink_mem);
1214     + if (glink == NULL)
1215     + error (EXIT_FAILURE, 0, gettext ("invalid sh_link value in section %Zu"),
1216     + elf_ndxscn (scn));
1217     +
1218     int class = gelf_getclass (ebl->elf);
1219     - GElf_Shdr glink;
1220     printf (ngettext ("\
1221     \nVersion definition section [%2u] '%s' contains %d entry:\n Addr: %#0*" PRIx64 " Offset: %#08" PRIx64 " Link to section: [%2u] '%s'\n",
1222     "\
1223     @@ -1999,9 +2019,7 @@ handle_verdef (Ebl *ebl, Elf_Scn *scn, G
1224     class == ELFCLASS32 ? 10 : 18, shdr->sh_addr,
1225     shdr->sh_offset,
1226     (unsigned int) shdr->sh_link,
1227     - elf_strptr (ebl->elf, shstrndx,
1228     - gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link),
1229     - &glink)->sh_name));
1230     + elf_strptr (ebl->elf, shstrndx, glink->sh_name));
1231    
1232     unsigned int offset = 0;
1233     for (int cnt = shdr->sh_info; --cnt >= 0; )
1234     @@ -2263,8 +2281,14 @@ handle_versym (Ebl *ebl, Elf_Scn *scn, G
1235     filename = NULL;
1236     }
1237    
1238     + GElf_Shdr glink_mem;
1239     + GElf_Shdr *glink = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link),
1240     + &glink_mem);
1241     + if (glink == NULL)
1242     + error (EXIT_FAILURE, 0, gettext ("invalid sh_link value in section %Zu"),
1243     + elf_ndxscn (scn));
1244     +
1245     /* Print the header. */
1246     - GElf_Shdr glink;
1247     printf (ngettext ("\
1248     \nVersion symbols section [%2u] '%s' contains %d entry:\n Addr: %#0*" PRIx64 " Offset: %#08" PRIx64 " Link to section: [%2u] '%s'",
1249     "\
1250     @@ -2276,9 +2300,7 @@ handle_versym (Ebl *ebl, Elf_Scn *scn, G
1251     class == ELFCLASS32 ? 10 : 18, shdr->sh_addr,
1252     shdr->sh_offset,
1253     (unsigned int) shdr->sh_link,
1254     - elf_strptr (ebl->elf, shstrndx,
1255     - gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link),
1256     - &glink)->sh_name));
1257     + elf_strptr (ebl->elf, shstrndx, glink->sh_name));
1258    
1259     /* Now we can finally look at the actual contents of this section. */
1260     for (unsigned int cnt = 0; cnt < shdr->sh_size / shdr->sh_entsize; ++cnt)
1261     @@ -2330,7 +2352,17 @@ print_hash_info (Ebl *ebl, Elf_Scn *scn,
1262     for (Elf32_Word cnt = 0; cnt < nbucket; ++cnt)
1263     ++counts[lengths[cnt]];
1264    
1265     - GElf_Shdr glink;
1266     + GElf_Shdr glink_mem;
1267     + GElf_Shdr *glink = gelf_getshdr (elf_getscn (ebl->elf,
1268     + shdr->sh_link),
1269     + &glink_mem);
1270     + if (glink == NULL)
1271     + {
1272     + error (0, 0, gettext ("invalid sh_link value in section %Zu"),
1273     + elf_ndxscn (scn));
1274     + return;
1275     + }
1276     +
1277     printf (ngettext ("\
1278     \nHistogram for bucket list length in section [%2u] '%s' (total of %d bucket):\n Addr: %#0*" PRIx64 " Offset: %#08" PRIx64 " Link to section: [%2u] '%s'\n",
1279     "\
1280     @@ -2343,9 +2375,7 @@ print_hash_info (Ebl *ebl, Elf_Scn *scn,
1281     shdr->sh_addr,
1282     shdr->sh_offset,
1283     (unsigned int) shdr->sh_link,
1284     - elf_strptr (ebl->elf, shstrndx,
1285     - gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link),
1286     - &glink)->sh_name));
1287     + elf_strptr (ebl->elf, shstrndx, glink->sh_name));
1288    
1289     if (extrastr != NULL)
1290     fputs (extrastr, stdout);
1291     @@ -3654,6 +3684,16 @@ print_debug_aranges_section (Ebl *ebl __
1292     return;
1293     }
1294    
1295     + GElf_Shdr glink_mem;
1296     + GElf_Shdr *glink;
1297     + glink = gelf_getshdr (elf_getscn (ebl->elf, shdr->sh_link), &glink_mem);
1298     + if (glink == NULL)
1299     + {
1300     + error (0, 0, gettext ("invalid sh_link value in section %Zu"),
1301     + elf_ndxscn (scn));
1302     + return;
1303     + }
1304     +
1305     printf (ngettext ("\
1306     \nDWARF section '%s' at offset %#" PRIx64 " contains %zu entry:\n",
1307     "\
1308     --- elfutils-0.122/src/strip.c
1309     +++ elfutils-0.122/src/strip.c
1310     @@ -412,6 +412,7 @@ handle_elf (int fd, Elf *elf, const char
1311     Elf_Data debuglink_crc_data;
1312     bool any_symtab_changes = false;
1313     Elf_Data *shstrtab_data = NULL;
1314     + size_t shdridx = 0;
1315    
1316     /* Create the full name of the file. */
1317     if (prefix != NULL)
1318     @@ -542,6 +543,11 @@ handle_elf (int fd, Elf *elf, const char
1319     goto fail_close;
1320     }
1321    
1322     + if (shstrndx >= shnum)
1323     + goto illformed;
1324     +
1325     +#define elf_assert(test) do { if (!(test)) goto illformed; } while (0)
1326     +
1327     /* Storage for section information. We leave room for two more
1328     entries since we unconditionally create a section header string
1329     table. Maybe some weird tool created an ELF file without one.
1330     @@ -563,7 +569,7 @@ handle_elf (int fd, Elf *elf, const char
1331     {
1332     /* This should always be true (i.e., there should not be any
1333     holes in the numbering). */
1334     - assert (elf_ndxscn (scn) == cnt);
1335     + elf_assert (elf_ndxscn (scn) == cnt);
1336    
1337     shdr_info[cnt].scn = scn;
1338    
1339     @@ -576,6 +582,7 @@ handle_elf (int fd, Elf *elf, const char
1340     shdr_info[cnt].shdr.sh_name);
1341     if (shdr_info[cnt].name == NULL)
1342     {
1343     + illformed:
1344     error (0, 0, gettext ("illformed file '%s'"), fname);
1345     goto fail_close;
1346     }
1347     @@ -585,6 +592,8 @@ handle_elf (int fd, Elf *elf, const char
1348    
1349     /* Remember the shdr.sh_link value. */
1350     shdr_info[cnt].old_sh_link = shdr_info[cnt].shdr.sh_link;
1351     + if (shdr_info[cnt].old_sh_link >= shnum)
1352     + goto illformed;
1353    
1354     /* Sections in files other than relocatable object files which
1355     are not loaded can be freely moved by us. In relocatable
1356     @@ -597,7 +606,7 @@ handle_elf (int fd, Elf *elf, const char
1357     appropriate reference. */
1358     if (unlikely (shdr_info[cnt].shdr.sh_type == SHT_SYMTAB_SHNDX))
1359     {
1360     - assert (shdr_info[shdr_info[cnt].shdr.sh_link].symtab_idx == 0);
1361     + elf_assert (shdr_info[shdr_info[cnt].shdr.sh_link].symtab_idx == 0);
1362     shdr_info[shdr_info[cnt].shdr.sh_link].symtab_idx = cnt;
1363     }
1364     else if (unlikely (shdr_info[cnt].shdr.sh_type == SHT_GROUP))
1365     @@ -614,7 +623,12 @@ handle_elf (int fd, Elf *elf, const char
1366     for (inner = 1;
1367     inner < shdr_info[cnt].data->d_size / sizeof (Elf32_Word);
1368     ++inner)
1369     + {
1370     + if (grpref[inner] < shnum)
1371     shdr_info[grpref[inner]].group_idx = cnt;
1372     + else
1373     + goto illformed;
1374     + }
1375    
1376     if (inner == 1 || (inner == 2 && (grpref[0] & GRP_COMDAT) == 0))
1377     /* If the section group contains only one element and this
1378     @@ -625,7 +639,7 @@ handle_elf (int fd, Elf *elf, const char
1379     }
1380     else if (unlikely (shdr_info[cnt].shdr.sh_type == SHT_GNU_versym))
1381     {
1382     - assert (shdr_info[shdr_info[cnt].shdr.sh_link].version_idx == 0);
1383     + elf_assert (shdr_info[shdr_info[cnt].shdr.sh_link].version_idx == 0);
1384     shdr_info[shdr_info[cnt].shdr.sh_link].version_idx = cnt;
1385     }
1386    
1387     @@ -633,7 +647,7 @@ handle_elf (int fd, Elf *elf, const char
1388     discarded right away. */
1389     if ((shdr_info[cnt].shdr.sh_flags & SHF_GROUP) != 0)
1390     {
1391     - assert (shdr_info[cnt].group_idx != 0);
1392     + elf_assert (shdr_info[cnt].group_idx != 0);
1393    
1394     if (shdr_info[shdr_info[cnt].group_idx].idx == 0)
1395     {
1396     @@ -708,11 +722,15 @@ handle_elf (int fd, Elf *elf, const char
1397     {
1398     /* If a relocation section is marked as being removed make
1399     sure the section it is relocating is removed, too. */
1400     - if ((shdr_info[cnt].shdr.sh_type == SHT_REL
1401     + if (shdr_info[cnt].shdr.sh_type == SHT_REL
1402     || shdr_info[cnt].shdr.sh_type == SHT_RELA)
1403     - && shdr_info[shdr_info[cnt].shdr.sh_info].idx != 0)
1404     + {
1405     + if (shdr_info[cnt].shdr.sh_info >= shnum)
1406     + goto illformed;
1407     + else if (shdr_info[shdr_info[cnt].shdr.sh_info].idx != 0)
1408     shdr_info[cnt].idx = 1;
1409     }
1410     + }
1411    
1412     if (shdr_info[cnt].idx == 1)
1413     {
1414     @@ -737,7 +755,7 @@ handle_elf (int fd, Elf *elf, const char
1415     if (shdr_info[cnt].symtab_idx != 0
1416     && shdr_info[shdr_info[cnt].symtab_idx].data == NULL)
1417     {
1418     - assert (shdr_info[cnt].shdr.sh_type == SHT_SYMTAB);
1419     + elf_assert (shdr_info[cnt].shdr.sh_type == SHT_SYMTAB);
1420    
1421     shdr_info[shdr_info[cnt].symtab_idx].data
1422     = elf_getdata (shdr_info[shdr_info[cnt].symtab_idx].scn,
1423     @@ -777,6 +795,9 @@ handle_elf (int fd, Elf *elf, const char
1424     else if (scnidx == SHN_XINDEX)
1425     scnidx = xndx;
1426    
1427     + if (scnidx >= shnum)
1428     + goto illformed;
1429     +
1430     if (shdr_info[scnidx].idx == 0)
1431     {
1432     /* Mark this section as used. */
1433     @@ -808,12 +829,16 @@ handle_elf (int fd, Elf *elf, const char
1434     }
1435    
1436     /* Handle references through sh_info. */
1437     - if (SH_INFO_LINK_P (&shdr_info[cnt].shdr)
1438     - && shdr_info[shdr_info[cnt].shdr.sh_info].idx == 0)
1439     + if (SH_INFO_LINK_P (&shdr_info[cnt].shdr))
1440     + {
1441     + if (shdr_info[cnt].shdr.sh_info >= shnum)
1442     + goto illformed;
1443     + else if ( shdr_info[shdr_info[cnt].shdr.sh_info].idx == 0)
1444     {
1445     shdr_info[shdr_info[cnt].shdr.sh_info].idx = 1;
1446     changes |= shdr_info[cnt].shdr.sh_info < cnt;
1447     }
1448     + }
1449    
1450     /* Mark the section as investigated. */
1451     shdr_info[cnt].idx = 2;
1452     @@ -912,7 +937,7 @@ handle_elf (int fd, Elf *elf, const char
1453     error (EXIT_FAILURE, 0, gettext ("while generating output file: %s"),
1454     elf_errmsg (-1));
1455    
1456     - assert (elf_ndxscn (shdr_info[cnt].newscn) == shdr_info[cnt].idx);
1457     + elf_assert (elf_ndxscn (shdr_info[cnt].newscn) == shdr_info[cnt].idx);
1458    
1459     /* Add this name to the section header string table. */
1460     shdr_info[cnt].se = ebl_strtabadd (shst, shdr_info[cnt].name, 0);
1461     @@ -949,7 +974,7 @@ handle_elf (int fd, Elf *elf, const char
1462     error (EXIT_FAILURE, 0,
1463     gettext ("while create section header section: %s"),
1464     elf_errmsg (-1));
1465     - assert (elf_ndxscn (shdr_info[cnt].newscn) == shdr_info[cnt].idx);
1466     + elf_assert (elf_ndxscn (shdr_info[cnt].newscn) == shdr_info[cnt].idx);
1467    
1468     shdr_info[cnt].data = elf_newdata (shdr_info[cnt].newscn);
1469     if (shdr_info[cnt].data == NULL)
1470     @@ -980,7 +1005,7 @@ handle_elf (int fd, Elf *elf, const char
1471     }
1472    
1473     /* Index of the section header table in the shdr_info array. */
1474     - size_t shdridx = cnt;
1475     + shdridx = cnt;
1476    
1477     /* Add the section header string table section name. */
1478     shdr_info[cnt].se = ebl_strtabadd (shst, ".shstrtab", 10);
1479     @@ -1005,7 +1030,7 @@ handle_elf (int fd, Elf *elf, const char
1480     error (EXIT_FAILURE, 0,
1481     gettext ("while create section header section: %s"),
1482     elf_errmsg (-1));
1483     - assert (elf_ndxscn (shdr_info[cnt].newscn) == idx);
1484     + elf_assert (elf_ndxscn (shdr_info[cnt].newscn) == idx);
1485    
1486     /* Finalize the string table and fill in the correct indices in the
1487     section headers. */
1488     @@ -1095,20 +1120,20 @@ handle_elf (int fd, Elf *elf, const char
1489     shndxdata = elf_getdata (shdr_info[shdr_info[cnt].symtab_idx].scn,
1490     NULL);
1491    
1492     - assert ((versiondata->d_size / sizeof (Elf32_Word))
1493     + elf_assert ((versiondata->d_size / sizeof (Elf32_Word))
1494     >= shdr_info[cnt].data->d_size / elsize);
1495     }
1496    
1497     if (shdr_info[cnt].version_idx != 0)
1498     {
1499     - assert (shdr_info[cnt].shdr.sh_type == SHT_DYNSYM);
1500     + elf_assert (shdr_info[cnt].shdr.sh_type == SHT_DYNSYM);
1501     /* This section has associated version
1502     information. We have to modify that
1503     information, too. */
1504     versiondata = elf_getdata (shdr_info[shdr_info[cnt].version_idx].scn,
1505     NULL);
1506    
1507     - assert ((versiondata->d_size / sizeof (GElf_Versym))
1508     + elf_assert ((versiondata->d_size / sizeof (GElf_Versym))
1509     >= shdr_info[cnt].data->d_size / elsize);
1510     }
1511    
1512     @@ -1163,7 +1188,7 @@ handle_elf (int fd, Elf *elf, const char
1513     sec = shdr_info[sym->st_shndx].idx;
1514     else
1515     {
1516     - assert (shndxdata != NULL);
1517     + elf_assert (shndxdata != NULL);
1518    
1519     sec = shdr_info[xshndx].idx;
1520     }
1521     @@ -1184,7 +1209,7 @@ handle_elf (int fd, Elf *elf, const char
1522     nxshndx = sec;
1523     }
1524    
1525     - assert (sec < SHN_LORESERVE || shndxdata != NULL);
1526     + elf_assert (sec < SHN_LORESERVE || shndxdata != NULL);
1527    
1528     if ((inner != destidx || nshndx != sym->st_shndx
1529     || (shndxdata != NULL && nxshndx != xshndx))
1530     @@ -1207,7 +1232,7 @@ handle_elf (int fd, Elf *elf, const char
1531     else
1532     /* This is a section symbol for a section which has
1533     been removed. */
1534     - assert (GELF_ST_TYPE (sym->st_info) == STT_SECTION);
1535     + elf_assert (GELF_ST_TYPE (sym->st_info) == STT_SECTION);
1536     }
1537    
1538     if (destidx != inner)
1539     @@ -1371,11 +1396,11 @@ handle_elf (int fd, Elf *elf, const char
1540     {
1541     GElf_Sym sym_mem;
1542     GElf_Sym *sym = gelf_getsym (symd, inner, &sym_mem);
1543     - assert (sym != NULL);
1544     + elf_assert (sym != NULL);
1545    
1546     const char *name = elf_strptr (elf, strshndx,
1547     sym->st_name);
1548     - assert (name != NULL);
1549     + elf_assert (name != NULL);
1550     size_t hidx = elf_hash (name) % nbucket;
1551    
1552     if (bucket[hidx] == 0)
1553     @@ -1394,7 +1419,7 @@ handle_elf (int fd, Elf *elf, const char
1554     else
1555     {
1556     /* Alpha and S390 64-bit use 64-bit SHT_HASH entries. */
1557     - assert (shdr_info[cnt].shdr.sh_entsize
1558     + elf_assert (shdr_info[cnt].shdr.sh_entsize
1559     == sizeof (Elf64_Xword));
1560    
1561     Elf64_Xword *bucket = (Elf64_Xword *) hashd->d_buf;
1562     @@ -1428,11 +1453,11 @@ handle_elf (int fd, Elf *elf, const char
1563     {
1564     GElf_Sym sym_mem;
1565     GElf_Sym *sym = gelf_getsym (symd, inner, &sym_mem);
1566     - assert (sym != NULL);
1567     + elf_assert (sym != NULL);
1568    
1569     const char *name = elf_strptr (elf, strshndx,
1570     sym->st_name);
1571     - assert (name != NULL);
1572     + elf_assert (name != NULL);
1573     size_t hidx = elf_hash (name) % nbucket;
1574    
1575     if (bucket[hidx] == 0)