@@ -131,10 +131,12 @@ static void e32_process_dyn_rel(const Elf32_Sym *sym_tab, size_t num_syms,
131
131
size_t name_idx = 0 ;
132
132
133
133
sym_idx = ELF32_R_SYM (rel -> r_info );
134
- assert (sym_idx < num_syms );
134
+ if (sym_idx >= num_syms )
135
+ err (TEE_ERROR_GENERIC , "Symbol index out of range" );
135
136
136
137
name_idx = sym_tab [sym_idx ].st_name ;
137
- assert (name_idx < str_tab_size );
138
+ if (name_idx >= str_tab_size )
139
+ err (TEE_ERROR_GENERIC , "Name index out of range" );
138
140
name = str_tab + name_idx ;
139
141
140
142
resolve_sym (name , & val );
@@ -161,15 +163,17 @@ static void e32_relocate(struct ta_elf *elf, unsigned int rel_sidx)
161
163
if (sym_tab_idx ) {
162
164
size_t str_tab_idx = 0 ;
163
165
164
- assert (sym_tab_idx < elf -> e_shnum );
166
+ if (sym_tab_idx >= elf -> e_shnum )
167
+ err (TEE_ERROR_GENERIC , "Symtab index out of range" );
165
168
166
169
assert (shdr [sym_tab_idx ].sh_entsize == sizeof (Elf32_Sym ));
167
170
168
171
/* Check the address is inside ELF memory */
169
172
if (ADD_OVERFLOW (shdr [sym_tab_idx ].sh_addr ,
170
173
shdr [sym_tab_idx ].sh_size , & sh_end ))
171
174
err (TEE_ERROR_SECURITY , "Overflow" );
172
- assert (sh_end < (elf -> max_addr - elf -> load_addr ));
175
+ if (sh_end >= (elf -> max_addr - elf -> load_addr ))
176
+ err (TEE_ERROR_GENERIC , "Symbol table out of range" );
173
177
174
178
sym_tab = (Elf32_Sym * )(elf -> load_addr +
175
179
shdr [sym_tab_idx ].sh_addr );
@@ -182,7 +186,9 @@ static void e32_relocate(struct ta_elf *elf, unsigned int rel_sidx)
182
186
if (ADD_OVERFLOW (shdr [str_tab_idx ].sh_addr ,
183
187
shdr [str_tab_idx ].sh_size , & sh_end ))
184
188
err (TEE_ERROR_SECURITY , "Overflow" );
185
- assert (sh_end < (elf -> max_addr - elf -> load_addr ));
189
+ if (sh_end >= (elf -> max_addr - elf -> load_addr ))
190
+ err (TEE_ERROR_GENERIC ,
191
+ "String table out of range" );
186
192
187
193
str_tab = (const char * )(elf -> load_addr +
188
194
shdr [str_tab_idx ].sh_addr );
@@ -191,27 +197,30 @@ static void e32_relocate(struct ta_elf *elf, unsigned int rel_sidx)
191
197
}
192
198
193
199
/* Check the address is inside TA memory */
194
- assert (shdr [rel_sidx ].sh_addr < (elf -> max_addr - elf -> load_addr ));
200
+ if (ADD_OVERFLOW (shdr [rel_sidx ].sh_addr ,
201
+ shdr [rel_sidx ].sh_size , & sh_end ))
202
+ err (TEE_ERROR_SECURITY , "Overflow" );
203
+ if (sh_end >= (elf -> max_addr - elf -> load_addr ))
204
+ err (TEE_ERROR_GENERIC , "Relocation table out of range" );
195
205
rel = (Elf32_Rel * )(elf -> load_addr + shdr [rel_sidx ].sh_addr );
196
206
197
- /* Check the address is inside TA memory */
198
- if (ADD_OVERFLOW (shdr [rel_sidx ].sh_addr , shdr [rel_sidx ].sh_size ,
199
- & sh_end ))
200
- err (TEE_ERROR_SECURITY , "Overflow" );
201
- assert (sh_end < (elf -> max_addr - elf -> load_addr ));
202
207
rel_end = rel + shdr [rel_sidx ].sh_size / sizeof (Elf32_Rel );
203
208
for (; rel < rel_end ; rel ++ ) {
204
209
Elf32_Addr * where = NULL ;
205
210
size_t sym_idx = 0 ;
206
211
207
212
/* Check the address is inside TA memory */
208
- assert (rel -> r_offset < (elf -> max_addr - elf -> load_addr ));
213
+ if (rel -> r_offset >= (elf -> max_addr - elf -> load_addr ))
214
+ err (TEE_ERROR_GENERIC ,
215
+ "Relocation offset out of range" );
209
216
where = (Elf32_Addr * )(elf -> load_addr + rel -> r_offset );
210
217
211
218
switch (ELF32_R_TYPE (rel -> r_info )) {
212
219
case R_ARM_ABS32 :
213
220
sym_idx = ELF32_R_SYM (rel -> r_info );
214
- assert (sym_idx < num_syms );
221
+ if (sym_idx >= num_syms )
222
+ err (TEE_ERROR_GENERIC ,
223
+ "Symbol index out of range" );
215
224
if (sym_tab [sym_idx ].st_shndx == SHN_UNDEF ) {
216
225
/* Symbol is external */
217
226
e32_process_dyn_rel (sym_tab , num_syms , str_tab ,
@@ -223,7 +232,9 @@ static void e32_relocate(struct ta_elf *elf, unsigned int rel_sidx)
223
232
break ;
224
233
case R_ARM_REL32 :
225
234
sym_idx = ELF32_R_SYM (rel -> r_info );
226
- assert (sym_idx < num_syms );
235
+ if (sym_idx >= num_syms )
236
+ err (TEE_ERROR_GENERIC ,
237
+ "Symbol index out of range" );
227
238
* where += sym_tab [sym_idx ].st_value - rel -> r_offset ;
228
239
break ;
229
240
case R_ARM_RELATIVE :
@@ -252,10 +263,12 @@ static void e64_process_dyn_rela(const Elf64_Sym *sym_tab, size_t num_syms,
252
263
size_t name_idx = 0 ;
253
264
254
265
sym_idx = ELF64_R_SYM (rela -> r_info );
255
- assert (sym_idx < num_syms );
266
+ if (sym_idx >= num_syms )
267
+ err (TEE_ERROR_GENERIC , "Symbol index out of range" );
256
268
257
269
name_idx = sym_tab [sym_idx ].st_name ;
258
- assert (name_idx < str_tab_size );
270
+ if (name_idx >= str_tab_size )
271
+ err (TEE_ERROR_GENERIC , "Name index out of range" );
259
272
name = str_tab + name_idx ;
260
273
261
274
resolve_sym (name , & val );
@@ -282,15 +295,17 @@ static void e64_relocate(struct ta_elf *elf, unsigned int rel_sidx)
282
295
if (sym_tab_idx ) {
283
296
size_t str_tab_idx = 0 ;
284
297
285
- assert (sym_tab_idx < elf -> e_shnum );
298
+ if (sym_tab_idx >= elf -> e_shnum )
299
+ err (TEE_ERROR_GENERIC , "Symtab index out of range" );
286
300
287
301
assert (shdr [sym_tab_idx ].sh_entsize == sizeof (Elf64_Sym ));
288
302
289
303
/* Check the address is inside TA memory */
290
304
if (ADD_OVERFLOW (shdr [sym_tab_idx ].sh_addr ,
291
305
shdr [sym_tab_idx ].sh_size , & sh_end ))
292
306
err (TEE_ERROR_SECURITY , "Overflow" );
293
- assert (sh_end < (elf -> max_addr - elf -> load_addr ));
307
+ if (sh_end >= (elf -> max_addr - elf -> load_addr ))
308
+ err (TEE_ERROR_GENERIC , "Symbol table out of range" );
294
309
295
310
sym_tab = (Elf64_Sym * )(elf -> load_addr +
296
311
shdr [sym_tab_idx ].sh_addr );
@@ -303,7 +318,9 @@ static void e64_relocate(struct ta_elf *elf, unsigned int rel_sidx)
303
318
if (ADD_OVERFLOW (shdr [str_tab_idx ].sh_addr ,
304
319
shdr [str_tab_idx ].sh_size , & sh_end ))
305
320
err (TEE_ERROR_SECURITY , "Overflow" );
306
- assert (sh_end < (elf -> max_addr - elf -> load_addr ));
321
+ if (sh_end >= (elf -> max_addr - elf -> load_addr ))
322
+ err (TEE_ERROR_GENERIC ,
323
+ "String table out of range" );
307
324
308
325
str_tab = (const char * )(elf -> load_addr +
309
326
shdr [str_tab_idx ].sh_addr );
@@ -312,28 +329,31 @@ static void e64_relocate(struct ta_elf *elf, unsigned int rel_sidx)
312
329
}
313
330
314
331
/* Check the address is inside TA memory */
315
- assert (shdr [rel_sidx ].sh_addr < (elf -> max_addr - elf -> load_addr ));
332
+ if (ADD_OVERFLOW (shdr [rel_sidx ].sh_addr ,
333
+ shdr [rel_sidx ].sh_size , & sh_end ))
334
+ err (TEE_ERROR_SECURITY , "Overflow" );
335
+ if (sh_end >= (elf -> max_addr - elf -> load_addr ))
336
+ err (TEE_ERROR_GENERIC , "Relocation table out of range" );
316
337
rela = (Elf64_Rela * )(elf -> load_addr + shdr [rel_sidx ].sh_addr );
317
338
318
- /* Check the address is inside TA memory */
319
- if (ADD_OVERFLOW (shdr [rel_sidx ].sh_addr , shdr [rel_sidx ].sh_size ,
320
- & sh_end ))
321
- err (TEE_ERROR_SECURITY , "Overflow" );
322
- assert (sh_end < (elf -> max_addr - elf -> load_addr ));
323
339
rela_end = rela + shdr [rel_sidx ].sh_size / sizeof (Elf64_Rela );
324
340
for (; rela < rela_end ; rela ++ ) {
325
341
Elf64_Addr * where = NULL ;
326
342
size_t sym_idx = 0 ;
327
343
328
344
/* Check the address is inside TA memory */
329
- assert (rela -> r_offset < (elf -> max_addr - elf -> load_addr ));
345
+ if (rela -> r_offset >= (elf -> max_addr - elf -> load_addr ))
346
+ err (TEE_ERROR_GENERIC ,
347
+ "Relocation offset out of range" );
330
348
331
349
where = (Elf64_Addr * )(elf -> load_addr + rela -> r_offset );
332
350
333
351
switch (ELF64_R_TYPE (rela -> r_info )) {
334
352
case R_AARCH64_ABS64 :
335
353
sym_idx = ELF64_R_SYM (rela -> r_info );
336
- assert (sym_idx < num_syms );
354
+ if (sym_idx >= num_syms )
355
+ err (TEE_ERROR_GENERIC ,
356
+ "Symbol index out of range" );
337
357
if (sym_tab [sym_idx ].st_shndx == SHN_UNDEF ) {
338
358
/* Symbol is external */
339
359
e64_process_dyn_rela (sym_tab , num_syms , str_tab ,
0 commit comments