lkml.org 
[lkml]   [2006]   [Mar]   [22]   [last100]   RSS Feed
Views: [more markup]  [less markup]  [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
FromMichael Neuling <>
Subject[PATCH] initramfs: CPIO unpacking fix
DateWed, 22 Mar 2006 17:12:18 +1100
Unlink files, symlinks, FIFOs, devices etc. (except directories) before
writing them when extracting CPIOs.  This stops weird behaviour like:
 1) writing through symlinks created in earlier CPIOs. eg foo->bar in
    the first CPIO.  Having foo as a non-link in a subsequent CPIO,
    results in bar being written and foo remaining as a symlink.  
 2) if the first version of file foo is larger than foo in a
    subsequent CPIO, we end up with a mix of the two.  ie. neither
    the first or second version of /foo.
 3) special files like devices, fifo etc. can't be overwritten in
    subsequent CPIOS.

With this, the kernel will more closely replicate
  for i in *.cpio; do cpio --extract --unconditional < $i ; done

This is a change but it's regarded as fixing broken functionality.

Signed-off-by: Michael Neuling <mikey@neuling.org>
---
This is a retransmission.
 init/initramfs.c |    3 +++
 1 files changed, 3 insertions(+)
Index: linux-2.6.15/init/initramfs.c
===================================================================
--- linux-2.6.15.orig/init/initramfs.c
+++ linux-2.6.15/init/initramfs.c
@@ -249,6 +249,7 @@ static int __init do_name(void)
 	if (dry_run)
 		return 0;
 	if (S_ISREG(mode)) {
+		sys_unlink(collected);
 		if (maybe_link() >= 0) {
 			wfd = sys_open(collected, O_WRONLY|O_CREAT, mode);
 			if (wfd >= 0) {
@@ -263,6 +264,7 @@ static int __init do_name(void)
 		sys_chmod(collected, mode);
 	} else if (S_ISBLK(mode) || S_ISCHR(mode) ||
 		   S_ISFIFO(mode) || S_ISSOCK(mode)) {
+		sys_unlink(collected);
 		if (maybe_link() == 0) {
 			sys_mknod(collected, mode, rdev);
 			sys_chown(collected, uid, gid);
@@ -291,6 +293,7 @@ static int __init do_copy(void)
 static int __init do_symlink(void)
 {
 	collected[N_ALIGN(name_len) + body_len] = '\0';
+	sys_unlink(collected);
 	sys_symlink(collected + N_ALIGN(name_len), collected);
 	sys_lchown(collected, uid, gid);
 	state = SkipIt;

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2006-03-22 07:14    [from the cache]
©2003-2008