diff options
author | Antti P Miettinen <amiettinen@nvidia.com> | 2013-11-21 17:32:05 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-11-21 19:42:27 -0500 |
commit | 49204c116a9ee24536d371be02a2f05e6493c949 (patch) | |
tree | f212b1a3d8b8fef05f570658f6acd9efe596ad26 /block/partitions | |
parent | 51a0d036f995585e8c5c30797d5bce28645d9dd7 (diff) |
block/partitions/efi.c: fix bound check
Use ARRAY_SIZE instead of sizeof to get proper max for label length.
Since this is just a read out of bounds it's not that bad, but the
problem becomes user-visible eg if one tries to use DEBUG_PAGEALLOC and
DEBUG_RODATA, at least with some enhancements from Hiroshi. Of course
the destination array can contain garbage when we read beyond the end of
source array so that would be another user-visible problem.
Signed-off-by: Antti P Miettinen <amiettinen@nvidia.com>
Reviewed-by: Hiroshi Doyu <hdoyu@nvidia.com>
Tested-by: Hiroshi Doyu <hdoyu@nvidia.com>
Cc: Will Drewry <wad@chromium.org>
Cc: Matt Fleming <matt.fleming@intel.com>
Acked-by: Davidlohr Bueso <davidlohr@hp.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'block/partitions')
-rw-r--r-- | block/partitions/efi.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/block/partitions/efi.c b/block/partitions/efi.c index a8287b49d062..dc51f467a560 100644 --- a/block/partitions/efi.c +++ b/block/partitions/efi.c | |||
@@ -96,6 +96,7 @@ | |||
96 | * - Code works, detects all the partitions. | 96 | * - Code works, detects all the partitions. |
97 | * | 97 | * |
98 | ************************************************************/ | 98 | ************************************************************/ |
99 | #include <linux/kernel.h> | ||
99 | #include <linux/crc32.h> | 100 | #include <linux/crc32.h> |
100 | #include <linux/ctype.h> | 101 | #include <linux/ctype.h> |
101 | #include <linux/math64.h> | 102 | #include <linux/math64.h> |
@@ -715,8 +716,8 @@ int efi_partition(struct parsed_partitions *state) | |||
715 | efi_guid_unparse(&ptes[i].unique_partition_guid, info->uuid); | 716 | efi_guid_unparse(&ptes[i].unique_partition_guid, info->uuid); |
716 | 717 | ||
717 | /* Naively convert UTF16-LE to 7 bits. */ | 718 | /* Naively convert UTF16-LE to 7 bits. */ |
718 | label_max = min(sizeof(info->volname) - 1, | 719 | label_max = min(ARRAY_SIZE(info->volname) - 1, |
719 | sizeof(ptes[i].partition_name)); | 720 | ARRAY_SIZE(ptes[i].partition_name)); |
720 | info->volname[label_max] = 0; | 721 | info->volname[label_max] = 0; |
721 | while (label_count < label_max) { | 722 | while (label_count < label_max) { |
722 | u8 c = ptes[i].partition_name[label_count] & 0xff; | 723 | u8 c = ptes[i].partition_name[label_count] & 0xff; |