aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/arc/kernel/unwind.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/arch/arc/kernel/unwind.c b/arch/arc/kernel/unwind.c
index 9f9ecc15556e..cf2828ab0905 100644
--- a/arch/arc/kernel/unwind.c
+++ b/arch/arc/kernel/unwind.c
@@ -293,13 +293,13 @@ static void init_unwind_hdr(struct unwind_table *table,
293 const u32 *cie = cie_for_fde(fde, table); 293 const u32 *cie = cie_for_fde(fde, table);
294 signed ptrType; 294 signed ptrType;
295 295
296 if (cie == &not_fde) 296 if (cie == &not_fde) /* only process FDE here */
297 continue; 297 continue;
298 if (cie == NULL || cie == &bad_cie) 298 if (cie == NULL || cie == &bad_cie)
299 return; 299 continue; /* say FDE->CIE.version != 1 */
300 ptrType = fde_pointer_type(cie); 300 ptrType = fde_pointer_type(cie);
301 if (ptrType < 0) 301 if (ptrType < 0)
302 return; 302 continue;
303 303
304 ptr = (const u8 *)(fde + 2); 304 ptr = (const u8 *)(fde + 2);
305 if (!read_pointer(&ptr, (const u8 *)(fde + 1) + *fde, 305 if (!read_pointer(&ptr, (const u8 *)(fde + 1) + *fde,
@@ -343,6 +343,10 @@ static void init_unwind_hdr(struct unwind_table *table,
343 343
344 if (fde[1] == 0xffffffff) 344 if (fde[1] == 0xffffffff)
345 continue; /* this is a CIE */ 345 continue; /* this is a CIE */
346
347 if (*(u8 *)(cie + 2) != 1)
348 continue; /* FDE->CIE.version not supported */
349
346 ptr = (const u8 *)(fde + 2); 350 ptr = (const u8 *)(fde + 2);
347 header->table[n].start = read_pointer(&ptr, 351 header->table[n].start = read_pointer(&ptr,
348 (const u8 *)(fde + 1) + 352 (const u8 *)(fde + 1) +
@@ -519,7 +523,8 @@ static const u32 *cie_for_fde(const u32 *fde, const struct unwind_table *table)
519 523
520 if (*cie <= sizeof(*cie) + 4 || *cie >= fde[1] - sizeof(*fde) 524 if (*cie <= sizeof(*cie) + 4 || *cie >= fde[1] - sizeof(*fde)
521 || (*cie & (sizeof(*cie) - 1)) 525 || (*cie & (sizeof(*cie) - 1))
522 || (cie[1] != 0xffffffff)) 526 || (cie[1] != 0xffffffff)
527 || ( *(u8 *)(cie + 2) != 1)) /* version 1 supported */
523 return NULL; /* this is not a (valid) CIE */ 528 return NULL; /* this is not a (valid) CIE */
524 return cie; 529 return cie;
525} 530}