All of lore.kernel.org
 help / color / mirror / Atom feed
From: Christian Franke <Christian.Franke@t-online.de>
To: grub-devel@gnu.org
Subject: [PATCH] Fix crash on open of nonexisting tar/cpio file, fix cpio trailer detection
Date: Wed, 06 Feb 2008 00:02:37 +0100	[thread overview]
Message-ID: <47A8EB0D.6070103@t-online.de> (raw)

[-- Attachment #1: Type: text/plain, Size: 1483 bytes --]

Two issues found in current CVS:

1. Booting a grub2-mkrescue floppy crashes if 
"(memdisk)/boot/grub/grub.cfg" does not exist. This is because 
grub_cpio_open does not set grub_errno if a file does not exist.

2. The cpio format may not work. Header scan finishes early if data size 
is empty (directory, empty file). The cpio format uses the name 
"TRAILER!!!" to mark the last block.

This patch fixes both issues.


"grub-mkrescue --image-type=floppy" now works with both tar and cpio 
memdisk. Cpio was tested with this change to grub-mkrescue:

-  tar -C ${aux_dir} -cf ${memdisk_img} boot
+  ( cd ${aux_dir} && find boot | cpio -o > ${memdisk_img} )


Open issues not fixed in this patch:

- Directory detection relies on a trailing '/' in path name. This works 
for typical tar files, but not for cpio. As a consequence, tab 
completion and "ls -l" are not correct. The "mode" in the header should 
be checked instead.

- CPIO would not work on big endian architectures yet.


Christian

2008-02-05  Christian Franke  <franke@computer.org>

	* fs/cpio.c (grub_cpio_find_file): Return GRUB_ERR_NONE
	and (*ofs = 0) instead of GRUB_ERR_FILE_NOT_FOUND on last
	block of a cpio or tar stream.
	Check for "TRAILER!!!" instead of any empty data
	block to detect last block of a cpio stream.
	(grub_cpio_dir): Fix constness of variable np.
	(grub_cpio_open): Return GRUB_ERR_FILE_NOT_FOUND if
	cpio or tar trailer is detected.  This fixes a crash
	on open of a non existing file.



[-- Attachment #2: grub2-cpio-eof.patch --]
[-- Type: text/x-patch, Size: 1530 bytes --]

--- grub2.orig/fs/cpio.c	2008-02-03 20:29:51.718750000 +0100
+++ grub2/fs/cpio.c	2008-02-05 22:59:50.031250000 +0100
@@ -98,11 +98,6 @@ grub_cpio_find_file (struct grub_cpio_da
 	return grub_error (GRUB_ERR_BAD_FS, "Invalid cpio archive");
 
       data->size = (((grub_uint32_t) hd.filesize_1) << 16) + hd.filesize_2;
-      if (data->size == 0)
-	{
-	  *ofs = 0;
-	  return GRUB_ERR_FILE_NOT_FOUND;
-	}
 
       if (hd.namesize & 1)
 	hd.namesize++;
@@ -117,6 +112,13 @@ grub_cpio_find_file (struct grub_cpio_da
 	  return grub_errno;
 	}
 
+      if (data->size == 0 && hd.mode == 0 && hd.namesize == 11 + 1
+	  && ! grub_memcmp(*name, "TRAILER!!!", 11))
+	{
+	  *ofs = 0;
+	  return GRUB_ERR_NONE;
+	}
+
       data->dofs = data->hofs + sizeof (hd) + hd.namesize;
       *ofs = data->dofs + data->size;
       if (data->size & 1)
@@ -133,7 +135,7 @@ grub_cpio_find_file (struct grub_cpio_da
       if (!hd.name[0])
 	{
 	  *ofs = 0;
-	  return GRUB_ERR_FILE_NOT_FOUND;
+	  return GRUB_ERR_NONE;
 	}
 
       if (grub_memcmp (hd.magic, MAGIC_USTAR, sizeof (MAGIC_USTAR) - 1))
@@ -188,7 +190,8 @@ grub_cpio_dir (grub_device_t device, con
 {
   struct grub_cpio_data *data;
   grub_uint32_t ofs;
-  char *prev, *name, *np;
+  char *prev, *name;
+  const char *np;
   int len;
 
 #ifndef GRUB_UTIL
@@ -275,7 +278,10 @@ grub_cpio_open (grub_file_t file, const 
 	goto fail;
 
       if (!ofs)
-	break;
+	{
+	  grub_error (GRUB_ERR_FILE_NOT_FOUND, "file not found");
+	  break;
+	}
 
       if (grub_strcmp (name + 1, fn) == 0)
 	{

             reply	other threads:[~2008-02-05 23:02 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-02-05 23:02 Christian Franke [this message]
2008-02-06  0:24 ` [PATCH] Fix crash on open of nonexisting tar/cpio file, fix cpio trailer detection Robert Millan
2008-02-06  8:07   ` Christian Franke
2008-02-06 17:42   ` Christian Franke
2008-02-06  7:29 ` Bean
2008-02-06 19:18   ` Robert Millan
2008-02-06 19:56     ` Bean

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=47A8EB0D.6070103@t-online.de \
    --to=christian.franke@t-online.de \
    --cc=grub-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.