]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
fs/ext2: Fix a file not found error when a symlink filesize is equal to 60
authorYi Zhao <yi.zhao@windriver.com>
Fri, 8 Jan 2021 00:39:47 +0000 (08:39 +0800)
committerDaniel Kiper <daniel.kiper@oracle.com>
Wed, 10 Mar 2021 12:14:25 +0000 (13:14 +0100)
We encountered a file not found error when the symlink filesize is
equal to 60:

  $ ls -l initrd
  lrwxrwxrwx 1 root root 60 Jan  6 16:37 initrd -> secure-core-image-initramfs-5.10.2-yoctodev-standard.cpio.gz

When booting, we got the following error in the GRUB:

  error: file `/initrd' not found

The root cause is that the size of diro->inode.symlink is equal to 60
and a symlink name has to be terminated with NUL there. So, if the
symlink filesize is exactly 60 then it is also stored in a separate
block rather than in the inode itself.

Signed-off-by: Yi Zhao <yi.zhao@windriver.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
grub-core/fs/ext2.c

index ac33bcd68c4d393cb2e100c4ad271ef1a463ccdb..848bf939dba70e5117cdb80f55ca0aefa9da2e68 100644 (file)
@@ -729,10 +729,11 @@ grub_ext2_read_symlink (grub_fshelp_node_t node)
   if (! symlink)
     return 0;
 
-  /* If the filesize of the symlink is bigger than
-     60 the symlink is stored in a separate block,
-     otherwise it is stored in the inode.  */
-  if (grub_le_to_cpu32 (diro->inode.size) <= sizeof (diro->inode.symlink))
+  /*
+   * If the filesize of the symlink is equal to or bigger than 60 the symlink
+   * is stored in a separate block, otherwise it is stored in the inode.
+   */
+  if (grub_le_to_cpu32 (diro->inode.size) < sizeof (diro->inode.symlink))
     grub_memcpy (symlink,
                 diro->inode.symlink,
                 grub_le_to_cpu32 (diro->inode.size));