gen_init_cpio: remove leading `/' from file names

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>
This commit is contained in:
Thomas Chou 2010-10-06 15:13:53 +08:00 committed by Michal Marek
parent 01660dfc37
commit 43f901fbc8

View File

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