Re: [PATCH] sprintf modifiers in usr/gen_init_cpio.c

From: Andrew Morton
Date: Tue Feb 17 2004 - 19:52:31 EST


Pragnesh Sampat <pragnesh.sampat@xxxxxxxxxxx> wrote:
>
> The file initramfs_data.cpio is slightly different when generated on
> cygwin, compared to linux, which causes the kernel to panic with the
> message "no cpio magic" (See Documentation/early-userspace/README).
>
> The problem in cpio generation is due to the difference in sprintf
> modifiers on cygwin. The code uses "%08ZX" for strlen of a device
> node. printf man pages discourages "Z" and has 'z' instead.
> Both of these are not available on cygwin sprintf (at least some
> versions of cygwin). The net result of all of this is that the
> generated file literally contains "ZX" and then the strlen after that
> and messes up that 110 offset etc. The file is 516 bytes long on the
> system that I tested and on linux it is 512 bytes.
>
> The fix below just uses "%08X" for that field. Any basic portable
> modifier should be ok, I think.

ugh, OK.

We'll also need to cast the return value of strlen to the correct type. On
ppc64 (at least) size_t is 8 bytes and the printf will otherwise grab the wrong
things off the stack.



diff -puN usr/gen_init_cpio.c~cygwin-cpio-fix usr/gen_init_cpio.c
--- 25/usr/gen_init_cpio.c~cygwin-cpio-fix Tue Feb 17 16:42:36 2004
+++ 25-akpm/usr/gen_init_cpio.c Tue Feb 17 16:43:49 2004
@@ -56,7 +56,7 @@ static void cpio_trailer(void)
const char name[] = "TRAILER!!!";

sprintf(s, "%s%08X%08X%08lX%08lX%08X%08lX"
- "%08X%08X%08X%08X%08X%08ZX%08X",
+ "%08X%08X%08X%08X%08X%08X%08X",
"070701", /* magic */
0, /* ino */
0, /* mode */
@@ -69,7 +69,7 @@ static void cpio_trailer(void)
0, /* minor */
0, /* rmajor */
0, /* rminor */
- strlen(name) + 1, /* namesize */
+ (unsigned)strlen(name) + 1, /* namesize */
0); /* chksum */
push_hdr(s);
push_rest(name);
@@ -87,7 +87,7 @@ static void cpio_mkdir(const char *name,
time_t mtime = time(NULL);

sprintf(s,"%s%08X%08X%08lX%08lX%08X%08lX"
- "%08X%08X%08X%08X%08X%08ZX%08X",
+ "%08X%08X%08X%08X%08X%08X%08X",
"070701", /* magic */
ino++, /* ino */
S_IFDIR | mode, /* mode */
@@ -100,7 +100,7 @@ static void cpio_mkdir(const char *name,
1, /* minor */
0, /* rmajor */
0, /* rminor */
- strlen(name) + 1, /* namesize */
+ (unsigned)strlen(name) + 1,/* namesize */
0); /* chksum */
push_hdr(s);
push_rest(name);
@@ -119,7 +119,7 @@ static void cpio_mknod(const char *name,
mode |= S_IFCHR;

sprintf(s,"%s%08X%08X%08lX%08lX%08X%08lX"
- "%08X%08X%08X%08X%08X%08ZX%08X",
+ "%08X%08X%08X%08X%08X%08X%08X",
"070701", /* magic */
ino++, /* ino */
mode, /* mode */
@@ -132,7 +132,7 @@ static void cpio_mknod(const char *name,
1, /* minor */
maj, /* rmajor */
min, /* rminor */
- strlen(name) + 1, /* namesize */
+ (unsigned)strlen(name) + 1,/* namesize */
0); /* chksum */
push_hdr(s);
push_rest(name);
@@ -176,7 +176,7 @@ void cpio_mkfile(const char *filename, c
}

sprintf(s,"%s%08X%08X%08lX%08lX%08X%08lX"
- "%08X%08X%08X%08X%08X%08ZX%08X",
+ "%08X%08X%08X%08X%08X%08X%08X",
"070701", /* magic */
ino++, /* ino */
mode, /* mode */
@@ -189,7 +189,7 @@ void cpio_mkfile(const char *filename, c
1, /* minor */
0, /* rmajor */
0, /* rminor */
- strlen(location) + 1, /* namesize */
+ (unsigned)strlen(location) + 1,/* namesize */
0); /* chksum */
push_hdr(s);
push_string(location);

_

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