1*4882a593SmuzhiyunFrom 8d3ae59dee2930d640add3bba983006e1f5dd1b6 Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Daniel Axtens <dja@axtens.net> 3*4882a593SmuzhiyunDate: Mon, 18 Jan 2021 14:34:58 +1100 4*4882a593SmuzhiyunSubject: [PATCH] fs/sfs: Fix over-read of root object name 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunThere's a read of the name of the root object that assumes that the name 7*4882a593Smuzhiyunis nul-terminated within the root block. This isn't guaranteed - it seems 8*4882a593SmuzhiyunSFS would require you to read multiple blocks to get a full name in general, 9*4882a593Smuzhiyunbut maybe that doesn't apply to the root object. 10*4882a593Smuzhiyun 11*4882a593SmuzhiyunEither way, figure out how much space is left in the root block and don't 12*4882a593Smuzhiyunover-read it. This fixes some OOB reads. 13*4882a593Smuzhiyun 14*4882a593SmuzhiyunSigned-off-by: Daniel Axtens <dja@axtens.net> 15*4882a593SmuzhiyunReviewed-by: Daniel Kiper <daniel.kiper@oracle.com> 16*4882a593SmuzhiyunSigned-off-by: Stefan Sørensen <stefan.sorensen@spectralink.com> 17*4882a593Smuzhiyun--- 18*4882a593Smuzhiyun grub-core/fs/sfs.c | 9 ++++++++- 19*4882a593Smuzhiyun 1 file changed, 8 insertions(+), 1 deletion(-) 20*4882a593Smuzhiyun 21*4882a593Smuzhiyundiff --git a/grub-core/fs/sfs.c b/grub-core/fs/sfs.c 22*4882a593Smuzhiyunindex de2b107..983e880 100644 23*4882a593Smuzhiyun--- a/grub-core/fs/sfs.c 24*4882a593Smuzhiyun+++ b/grub-core/fs/sfs.c 25*4882a593Smuzhiyun@@ -373,6 +373,7 @@ grub_sfs_mount (grub_disk_t disk) 26*4882a593Smuzhiyun struct grub_sfs_objc *rootobjc; 27*4882a593Smuzhiyun char *rootobjc_data = 0; 28*4882a593Smuzhiyun grub_uint32_t blk; 29*4882a593Smuzhiyun+ unsigned int max_len; 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun data = grub_malloc (sizeof (*data)); 32*4882a593Smuzhiyun if (!data) 33*4882a593Smuzhiyun@@ -421,7 +422,13 @@ grub_sfs_mount (grub_disk_t disk) 34*4882a593Smuzhiyun data->diropen.data = data; 35*4882a593Smuzhiyun data->diropen.cache = 0; 36*4882a593Smuzhiyun data->disk = disk; 37*4882a593Smuzhiyun- data->label = grub_strdup ((char *) (rootobjc->objects[0].filename)); 38*4882a593Smuzhiyun+ 39*4882a593Smuzhiyun+ /* We only read 1 block of data, so truncate the name if needed. */ 40*4882a593Smuzhiyun+ max_len = ((GRUB_DISK_SECTOR_SIZE << data->log_blocksize) 41*4882a593Smuzhiyun+ - 24 /* offsetof (struct grub_sfs_objc, objects) */ 42*4882a593Smuzhiyun+ - 25); /* offsetof (struct grub_sfs_obj, filename) */ 43*4882a593Smuzhiyun+ data->label = grub_zalloc (max_len + 1); 44*4882a593Smuzhiyun+ grub_strncpy (data->label, (char *) rootobjc->objects[0].filename, max_len); 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun grub_free (rootobjc_data); 47*4882a593Smuzhiyun return data; 48*4882a593Smuzhiyun-- 49*4882a593Smuzhiyun2.14.2 50*4882a593Smuzhiyun 51