linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* INITRAMFS: allow no trailer
@ 2004-12-04  1:47 Milton Miller
  2004-12-04  2:10 ` [klibc] " H. Peter Anvin
  2004-12-04  2:11 ` H. Peter Anvin
  0 siblings, 2 replies; 3+ messages in thread
From: Milton Miller @ 2004-12-04  1:47 UTC (permalink / raw)
  To: klibc, linux-kernel; +Cc: hpa, viro, akpm

According to "initramfs buffer format -- third draft"
http://lwn.net/2002/0117/a/initramfs-buffer-format.php3
"the cpio "TRAILER!!!" entry (cpio end-of-archive) is optional, but is
not ignored"

The kernel handling does not follow this spec.   If you add null padding
after an uncompressed cpio without TRAILER!!! the kernel complains "no
cpio magic".  In a gzipped archive one gets "junk in gzipped archive"
without the TRAILER!!!

This patch changes the state transitions so the kernel will follow the spec.

Tested: padded uncompressed, padded compressed, unpadded compressed (error)
and trailing junk in compressed (error).

---
I have a boot loader that knows how to load files, determine their size,
and advance to the next 4-byte boundary and reports the total size of 
the files loaded.  It doesn't understand about converting this number
to some ASCII representation.

With this patch I can embed the contents of a file padded with NULs
with out knowing the exact size of the file with the following files:

1) file containing cpio header & file name, padded to 4 bytes
2) contents of file
3) pad file of zeros, the size at least as large as the that specified
   for the file.

hpa points out that you should be careful with the headers, use unique
inode numbers and/or add a cpio header with just TRAILER!!! to reset
the inode hash table to avoid unwanted hard links.  I just put this
sequence as the last files loaded.

---

 gr_work-miltonm/init/initramfs.c |    9 ++++++---
 1 files changed, 6 insertions(+), 3 deletions(-)

diff -puN init/initramfs.c~allow-no-trailer init/initramfs.c
--- gr_work/init/initramfs.c~allow-no-trailer	2004-12-03 16:54:02.778579302 -0600
+++ gr_work-miltonm/init/initramfs.c	2004-12-03 16:54:02.789577561 -0600
@@ -241,10 +241,9 @@ static __initdata int wfd;
 static int __init do_name(void)
 {
 	state = SkipIt;
-	next_state = Start;
+	next_state = Reset;
 	if (strcmp(collected, "TRAILER!!!") == 0) {
 		free_hash();
-		next_state = Reset;
 		return 0;
 	}
 	if (dry_run)
@@ -295,7 +294,7 @@ static int __init do_symlink(void)
 	sys_symlink(collected + N_ALIGN(name_len), collected);
 	sys_lchown(collected, uid, gid);
 	state = SkipIt;
-	next_state = Start;
+	next_state = Reset;
 	return 0;
 }
 
@@ -331,6 +330,10 @@ static void __init flush_buffer(char *bu
 			buf += written;
 			len -= written;
 			state = Start;
+		} else if (c == 0) {
+			buf += written;
+			len -= written;
+			state = Reset;
 		} else
 			error("junk in compressed archive");
 	}
_

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [klibc] INITRAMFS: allow no trailer
  2004-12-04  1:47 INITRAMFS: allow no trailer Milton Miller
@ 2004-12-04  2:10 ` H. Peter Anvin
  2004-12-04  2:11 ` H. Peter Anvin
  1 sibling, 0 replies; 3+ messages in thread
From: H. Peter Anvin @ 2004-12-04  2:10 UTC (permalink / raw)
  To: Milton Miller; +Cc: klibc, linux-kernel, akpm, viro

Milton Miller wrote:
> 
> hpa points out that you should be careful with the headers, use unique
> inode numbers and/or add a cpio header with just TRAILER!!! to reset
> the inode hash table to avoid unwanted hard links.  I just put this
> sequence as the last files loaded.
> 

You still need unique inode numbers, though; just 1, 2, 3, ... is 
sufficient.

	-hpa

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: INITRAMFS: allow no trailer
  2004-12-04  1:47 INITRAMFS: allow no trailer Milton Miller
  2004-12-04  2:10 ` [klibc] " H. Peter Anvin
@ 2004-12-04  2:11 ` H. Peter Anvin
  1 sibling, 0 replies; 3+ messages in thread
From: H. Peter Anvin @ 2004-12-04  2:11 UTC (permalink / raw)
  To: Milton Miller; +Cc: klibc, linux-kernel, viro, akpm

Milton Miller wrote:
> 
> hpa points out that you should be careful with the headers, use unique
> inode numbers and/or add a cpio header with just TRAILER!!! to reset
> the inode hash table to avoid unwanted hard links.  I just put this
> sequence as the last files loaded.
> 

Correction.  I just remembered we wrote the spec so that a file with a 
link count of 1 is not entered in the hash table and therefore is never 
hardlinked.  This should do what you need.  (This was obviously done for 
exactly this reason.)

	-hpa

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2004-12-04  2:12 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-12-04  1:47 INITRAMFS: allow no trailer Milton Miller
2004-12-04  2:10 ` [klibc] " H. Peter Anvin
2004-12-04  2:11 ` H. Peter Anvin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).