]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
* grub-core/fs/ufs.c (grub_ufs_lookup_symlink): Use proper check for
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Thu, 3 May 2012 07:21:09 +0000 (09:21 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Thu, 3 May 2012 07:21:09 +0000 (09:21 +0200)
inline symlinks in addition to workaround.

ChangeLog
grub-core/fs/ufs.c

index afb2d5386d3379b18c3eee915ca666276870142c..9fbf1b62ad27d9e83da0f75472ef603415f34255 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2012-05-03  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       * grub-core/fs/ufs.c (grub_ufs_lookup_symlink): Use proper check for
+       inline symlinks in addition to workaround.
+
 2012-05-03  Vladimir Serbinenko  <phcoder@gmail.com>
 
        * grub-core/fs/xfs.c (grub_xfs_iterate_dir): Handle read_inode errors.
index 1d0f7a08810d573fd040b3584c279281a0f01513..9d4775e2df709e054e27b3773831d4d8973cec54 100644 (file)
@@ -401,7 +401,13 @@ grub_ufs_lookup_symlink (struct grub_ufs_data *data, int ino)
   if (++data->linknest > GRUB_UFS_MAX_SYMLNK_CNT)
     return grub_error (GRUB_ERR_SYMLINK_LOOP, N_("too deep nesting of symlinks"));
 
-  if (INODE_SIZE (data) <= sizeof (data->inode.symlink))
+  /* Normally we should just check that data->inode.nblocks == 0.
+     However old Linux doesn't maintain nblocks correctly and so it's always
+     0. If size is bigger than inline space then the symlink is surely not
+     inline.  */
+  /* Check against zero is paylindromic, no need to swap.  */
+  if (data->inode.nblocks == 0
+      && INODE_SIZE (data) <= sizeof (data->inode.symlink))
     grub_strcpy (symlink, (char *) INODE (data, symlink));
   else
     grub_ufs_read_file (data, 0, 0, INODE_SIZE (data), symlink);