Commit 499104b6 authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] Fix sprintf modifiers in usr/gen_init_cpio.c for cygwin

From: Pragnesh Sampat <pragnesh.sampat@timesys.com>

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.
parent aa81900e
...@@ -56,7 +56,7 @@ static void cpio_trailer(void) ...@@ -56,7 +56,7 @@ static void cpio_trailer(void)
const char name[] = "TRAILER!!!"; const char name[] = "TRAILER!!!";
sprintf(s, "%s%08X%08X%08lX%08lX%08X%08lX" 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 */ "070701", /* magic */
0, /* ino */ 0, /* ino */
0, /* mode */ 0, /* mode */
...@@ -69,7 +69,7 @@ static void cpio_trailer(void) ...@@ -69,7 +69,7 @@ static void cpio_trailer(void)
0, /* minor */ 0, /* minor */
0, /* rmajor */ 0, /* rmajor */
0, /* rminor */ 0, /* rminor */
strlen(name) + 1, /* namesize */ (unsigned)strlen(name) + 1, /* namesize */
0); /* chksum */ 0); /* chksum */
push_hdr(s); push_hdr(s);
push_rest(name); push_rest(name);
...@@ -87,7 +87,7 @@ static void cpio_mkdir(const char *name, unsigned int mode, ...@@ -87,7 +87,7 @@ static void cpio_mkdir(const char *name, unsigned int mode,
time_t mtime = time(NULL); time_t mtime = time(NULL);
sprintf(s,"%s%08X%08X%08lX%08lX%08X%08lX" 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 */ "070701", /* magic */
ino++, /* ino */ ino++, /* ino */
S_IFDIR | mode, /* mode */ S_IFDIR | mode, /* mode */
...@@ -100,7 +100,7 @@ static void cpio_mkdir(const char *name, unsigned int mode, ...@@ -100,7 +100,7 @@ static void cpio_mkdir(const char *name, unsigned int mode,
1, /* minor */ 1, /* minor */
0, /* rmajor */ 0, /* rmajor */
0, /* rminor */ 0, /* rminor */
strlen(name) + 1, /* namesize */ (unsigned)strlen(name) + 1,/* namesize */
0); /* chksum */ 0); /* chksum */
push_hdr(s); push_hdr(s);
push_rest(name); push_rest(name);
...@@ -119,7 +119,7 @@ static void cpio_mknod(const char *name, unsigned int mode, ...@@ -119,7 +119,7 @@ static void cpio_mknod(const char *name, unsigned int mode,
mode |= S_IFCHR; mode |= S_IFCHR;
sprintf(s,"%s%08X%08X%08lX%08lX%08X%08lX" 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 */ "070701", /* magic */
ino++, /* ino */ ino++, /* ino */
mode, /* mode */ mode, /* mode */
...@@ -132,7 +132,7 @@ static void cpio_mknod(const char *name, unsigned int mode, ...@@ -132,7 +132,7 @@ static void cpio_mknod(const char *name, unsigned int mode,
1, /* minor */ 1, /* minor */
maj, /* rmajor */ maj, /* rmajor */
min, /* rminor */ min, /* rminor */
strlen(name) + 1, /* namesize */ (unsigned)strlen(name) + 1,/* namesize */
0); /* chksum */ 0); /* chksum */
push_hdr(s); push_hdr(s);
push_rest(name); push_rest(name);
...@@ -176,7 +176,7 @@ void cpio_mkfile(const char *filename, const char *location, ...@@ -176,7 +176,7 @@ void cpio_mkfile(const char *filename, const char *location,
} }
sprintf(s,"%s%08X%08X%08lX%08lX%08X%08lX" 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 */ "070701", /* magic */
ino++, /* ino */ ino++, /* ino */
mode, /* mode */ mode, /* mode */
...@@ -189,7 +189,7 @@ void cpio_mkfile(const char *filename, const char *location, ...@@ -189,7 +189,7 @@ void cpio_mkfile(const char *filename, const char *location,
1, /* minor */ 1, /* minor */
0, /* rmajor */ 0, /* rmajor */
0, /* rminor */ 0, /* rminor */
strlen(location) + 1, /* namesize */ (unsigned)strlen(location) + 1,/* namesize */
0); /* chksum */ 0); /* chksum */
push_hdr(s); push_hdr(s);
push_string(location); push_string(location);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment