@@ -104,19 +104,21 @@ static int glue(symcmp, SZ)(const void *s0, const void *s1)
104
104
: ((sym0 -> st_value > sym1 -> st_value ) ? 1 : 0 );
105
105
}
106
106
107
- static int glue (load_symbols , SZ )(struct elfhdr * ehdr , int fd , int must_swab ,
108
- int clear_lsb , symbol_fn_t sym_cb )
107
+ static void glue (load_symbols , SZ )(struct elfhdr * ehdr , int fd , int must_swab ,
108
+ int clear_lsb , symbol_fn_t sym_cb )
109
109
{
110
- struct elf_shdr * symtab , * strtab , * shdr_table = NULL ;
111
- struct elf_sym * syms = NULL ;
110
+ struct elf_shdr * symtab , * strtab ;
111
+ g_autofree struct elf_shdr * shdr_table = NULL ;
112
+ g_autofree struct elf_sym * syms = NULL ;
113
+ g_autofree char * str = NULL ;
112
114
struct syminfo * s ;
113
115
int nsyms , i ;
114
- char * str = NULL ;
115
116
116
117
shdr_table = load_at (fd , ehdr -> e_shoff ,
117
118
sizeof (struct elf_shdr ) * ehdr -> e_shnum );
118
- if (!shdr_table )
119
- return -1 ;
119
+ if (!shdr_table ) {
120
+ return ;
121
+ }
120
122
121
123
if (must_swab ) {
122
124
for (i = 0 ; i < ehdr -> e_shnum ; i ++ ) {
@@ -125,23 +127,25 @@ static int glue(load_symbols, SZ)(struct elfhdr *ehdr, int fd, int must_swab,
125
127
}
126
128
127
129
symtab = glue (find_section , SZ )(shdr_table , ehdr -> e_shnum , SHT_SYMTAB );
128
- if (!symtab )
129
- goto fail ;
130
+ if (!symtab ) {
131
+ return ;
132
+ }
130
133
syms = load_at (fd , symtab -> sh_offset , symtab -> sh_size );
131
- if (!syms )
132
- goto fail ;
134
+ if (!syms ) {
135
+ return ;
136
+ }
133
137
134
138
nsyms = symtab -> sh_size / sizeof (struct elf_sym );
135
139
136
140
/* String table */
137
141
if (symtab -> sh_link >= ehdr -> e_shnum ) {
138
- goto fail ;
142
+ return ;
139
143
}
140
144
strtab = & shdr_table [symtab -> sh_link ];
141
145
142
146
str = load_at (fd , strtab -> sh_offset , strtab -> sh_size );
143
147
if (!str ) {
144
- goto fail ;
148
+ return ;
145
149
}
146
150
147
151
i = 0 ;
@@ -170,8 +174,13 @@ static int glue(load_symbols, SZ)(struct elfhdr *ehdr, int fd, int must_swab,
170
174
}
171
175
i ++ ;
172
176
}
173
- syms = g_realloc (syms , nsyms * sizeof (* syms ));
174
177
178
+ /* check we have symbols left */
179
+ if (nsyms == 0 ) {
180
+ return ;
181
+ }
182
+
183
+ syms = g_realloc (syms , nsyms * sizeof (* syms ));
175
184
qsort (syms , nsyms , sizeof (* syms ), glue (symcmp , SZ ));
176
185
for (i = 0 ; i < nsyms - 1 ; i ++ ) {
177
186
if (syms [i ].st_size == 0 ) {
@@ -182,18 +191,11 @@ static int glue(load_symbols, SZ)(struct elfhdr *ehdr, int fd, int must_swab,
182
191
/* Commit */
183
192
s = g_malloc0 (sizeof (* s ));
184
193
s -> lookup_symbol = glue (lookup_symbol , SZ );
185
- glue (s -> disas_symtab .elf , SZ ) = syms ;
194
+ glue (s -> disas_symtab .elf , SZ ) = g_steal_pointer ( & syms ) ;
186
195
s -> disas_num_syms = nsyms ;
187
- s -> disas_strtab = str ;
196
+ s -> disas_strtab = g_steal_pointer ( & str ) ;
188
197
s -> next = syminfos ;
189
198
syminfos = s ;
190
- g_free (shdr_table );
191
- return 0 ;
192
- fail :
193
- g_free (syms );
194
- g_free (str );
195
- g_free (shdr_table );
196
- return -1 ;
197
199
}
198
200
199
201
static int glue (elf_reloc , SZ )(struct elfhdr * ehdr , int fd , int must_swab ,
0 commit comments