| .. | .. |
|---|
| 385 | 385 | efi_kobj = kobject_create_and_add("efi", firmware_kobj); |
|---|
| 386 | 386 | if (!efi_kobj) { |
|---|
| 387 | 387 | pr_err("efi: Firmware registration failed.\n"); |
|---|
| 388 | | - destroy_workqueue(efi_rts_wq); |
|---|
| 389 | | - return -ENOMEM; |
|---|
| 388 | + error = -ENOMEM; |
|---|
| 389 | + goto err_destroy_wq; |
|---|
| 390 | 390 | } |
|---|
| 391 | 391 | |
|---|
| 392 | 392 | if (efi_rt_services_supported(EFI_RT_SUPPORTED_GET_VARIABLE | |
|---|
| .. | .. |
|---|
| 429 | 429 | generic_ops_unregister(); |
|---|
| 430 | 430 | err_put: |
|---|
| 431 | 431 | kobject_put(efi_kobj); |
|---|
| 432 | | - destroy_workqueue(efi_rts_wq); |
|---|
| 432 | +err_destroy_wq: |
|---|
| 433 | + if (efi_rts_wq) |
|---|
| 434 | + destroy_workqueue(efi_rts_wq); |
|---|
| 435 | + |
|---|
| 433 | 436 | return error; |
|---|
| 434 | 437 | } |
|---|
| 435 | 438 | |
|---|
| .. | .. |
|---|
| 590 | 593 | |
|---|
| 591 | 594 | seed = early_memremap(efi_rng_seed, sizeof(*seed)); |
|---|
| 592 | 595 | if (seed != NULL) { |
|---|
| 593 | | - size = min(seed->size, EFI_RANDOM_SEED_SIZE); |
|---|
| 596 | + size = min_t(u32, seed->size, SZ_1K); // sanity check |
|---|
| 594 | 597 | early_memunmap(seed, sizeof(*seed)); |
|---|
| 595 | 598 | } else { |
|---|
| 596 | 599 | pr_err("Could not map UEFI random seed!\n"); |
|---|
| .. | .. |
|---|
| 599 | 602 | seed = early_memremap(efi_rng_seed, |
|---|
| 600 | 603 | sizeof(*seed) + size); |
|---|
| 601 | 604 | if (seed != NULL) { |
|---|
| 602 | | - pr_notice("seeding entropy pool\n"); |
|---|
| 603 | 605 | add_bootloader_randomness(seed->bits, size); |
|---|
| 606 | + memzero_explicit(seed->bits, size); |
|---|
| 604 | 607 | early_memunmap(seed, sizeof(*seed) + size); |
|---|
| 605 | 608 | } else { |
|---|
| 606 | 609 | pr_err("Could not map UEFI random seed!\n"); |
|---|
| .. | .. |
|---|
| 947 | 950 | /* first try to find a slot in an existing linked list entry */ |
|---|
| 948 | 951 | for (prsv = efi_memreserve_root->next; prsv; ) { |
|---|
| 949 | 952 | rsv = memremap(prsv, sizeof(*rsv), MEMREMAP_WB); |
|---|
| 953 | + if (!rsv) |
|---|
| 954 | + return -ENOMEM; |
|---|
| 950 | 955 | index = atomic_fetch_add_unless(&rsv->count, 1, rsv->size); |
|---|
| 951 | 956 | if (index < rsv->size) { |
|---|
| 952 | 957 | rsv->entry[index].base = addr; |
|---|