gen_init_cpio: remove leading `/' from file names
authorThomas Chou <thomas@wytron.com.tw>
Wed, 6 Oct 2010 07:13:53 +0000 (15:13 +0800)
committerMichal Marek <mmarek@suse.cz>
Thu, 2 Dec 2010 13:28:50 +0000 (14:28 +0100)
When we extracted the generated cpio archive using "cpio -id" command,
it complained,

cpio: Removing leading `/' from member names
var/run
cpio: Removing leading `/' from member names
var/lib
cpio: Removing leading `/' from member names
var/lib/misc

It is worse with the latest "cpio" or "pax", which tries to overwrite
the host file system with the leading '/'.

So the leading '/' of file names should be removed. This is consistent
with the initramfs come with major distributions such as Fedora or
Debian, etc.

Signed-off-by: Thomas Chou <thomas@wytron.com.tw>
Acked-by: Mike Frysinger<vapier@gentoo.org>
Signed-off-by: Michal Marek <mmarek@suse.cz>
usr/gen_init_cpio.c

index b2b3c2d..59df70d 100644 (file)
@@ -104,6 +104,8 @@ static int cpio_mkslink(const char *name, const char *target,
        char s[256];
        time_t mtime = time(NULL);
 
+       if (name[0] == '/')
+               name++;
        sprintf(s,"%s%08X%08X%08lX%08lX%08X%08lX"
               "%08X%08X%08X%08X%08X%08X%08X",
                "070701",               /* magic */
@@ -152,6 +154,8 @@ static int cpio_mkgeneric(const char *name, unsigned int mode,
        char s[256];
        time_t mtime = time(NULL);
 
+       if (name[0] == '/')
+               name++;
        sprintf(s,"%s%08X%08X%08lX%08lX%08X%08lX"
               "%08X%08X%08X%08X%08X%08X%08X",
                "070701",               /* magic */
@@ -245,6 +249,8 @@ static int cpio_mknod(const char *name, unsigned int mode,
        else
                mode |= S_IFCHR;
 
+       if (name[0] == '/')
+               name++;
        sprintf(s,"%s%08X%08X%08lX%08lX%08X%08lX"
               "%08X%08X%08X%08X%08X%08X%08X",
                "070701",               /* magic */
@@ -332,6 +338,8 @@ static int cpio_mkfile(const char *name, const char *location,
                /* data goes on last link */
                if (i == nlinks) size = buf.st_size;
 
+               if (name[0] == '/')
+                       name++;
                namesize = strlen(name) + 1;
                sprintf(s,"%s%08X%08X%08lX%08lX%08X%08lX"
                       "%08lX%08X%08X%08X%08X%08X%08X",