@@ -394,6 +394,7 @@ static int __einj_error_trigger(u64 trigger_paddr, u32 type,
394394 u64 param1 , u64 param2 )
395395{
396396 struct acpi_einj_trigger trigger_tab ;
397+ struct acpi_einj_trigger * full_trigger_tab ;
397398 struct apei_exec_context trigger_ctx ;
398399 struct apei_resources trigger_resources ;
399400 struct acpi_whea_header * trigger_entry ;
@@ -430,24 +431,27 @@ static int __einj_error_trigger(u64 trigger_paddr, u32 type,
430431
431432 rc = - EIO ;
432433 table_size = trigger_tab .table_size ;
434+ full_trigger_tab = kmalloc (table_size , GFP_KERNEL );
435+ if (!full_trigger_tab )
436+ goto out_rel_header ;
433437 r = request_mem_region (trigger_paddr + sizeof (trigger_tab ),
434438 table_size - sizeof (trigger_tab ),
435439 "APEI EINJ Trigger Table" );
436440 if (!r ) {
437441 pr_err ("Can not request [mem %#010llx-%#010llx] for Trigger Table Entry\n" ,
438442 (unsigned long long )trigger_paddr + sizeof (trigger_tab ),
439443 (unsigned long long )trigger_paddr + table_size - 1 );
440- goto out_rel_header ;
444+ goto out_free_trigger_tab ;
441445 }
442446 iounmap (p );
443447 p = ioremap_cache (trigger_paddr , table_size );
444448 if (!p ) {
445449 pr_err ("Failed to map trigger table!\n" );
446450 goto out_rel_entry ;
447451 }
448- memcpy_fromio (& trigger_tab , p , sizeof ( trigger_tab ) );
452+ memcpy_fromio (full_trigger_tab , p , table_size );
449453 trigger_entry = (struct acpi_whea_header * )
450- ((char * )& trigger_tab + sizeof (struct acpi_einj_trigger ));
454+ ((char * )full_trigger_tab + sizeof (struct acpi_einj_trigger ));
451455 apei_resources_init (& trigger_resources );
452456 apei_exec_ctx_init (& trigger_ctx , einj_ins_type ,
453457 ARRAY_SIZE (einj_ins_type ),
@@ -469,7 +473,7 @@ static int __einj_error_trigger(u64 trigger_paddr, u32 type,
469473
470474 apei_resources_init (& addr_resources );
471475 trigger_param_region = einj_get_trigger_parameter_region (
472- & trigger_tab , param1 , param2 );
476+ full_trigger_tab , param1 , param2 );
473477 if (trigger_param_region ) {
474478 rc = apei_resources_add (& addr_resources ,
475479 trigger_param_region -> address ,
@@ -500,6 +504,8 @@ static int __einj_error_trigger(u64 trigger_paddr, u32 type,
500504out_rel_entry :
501505 release_mem_region (trigger_paddr + sizeof (trigger_tab ),
502506 table_size - sizeof (trigger_tab ));
507+ out_free_trigger_tab :
508+ kfree (full_trigger_tab );
503509out_rel_header :
504510 release_mem_region (trigger_paddr , sizeof (trigger_tab ));
505511out :
0 commit comments