summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'mkbootimg/mkbootimg.c')
-rw-r--r--mkbootimg/mkbootimg.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/mkbootimg/mkbootimg.c b/mkbootimg/mkbootimg.c
index 34a879b5a..d598f0395 100644
--- a/mkbootimg/mkbootimg.c
+++ b/mkbootimg/mkbootimg.c
@@ -114,6 +114,7 @@ int main(int argc, char **argv)
114 unsigned ramdisk_offset = 0x01000000; 114 unsigned ramdisk_offset = 0x01000000;
115 unsigned second_offset = 0x00f00000; 115 unsigned second_offset = 0x00f00000;
116 unsigned tags_offset = 0x00000100; 116 unsigned tags_offset = 0x00000100;
117 size_t cmdlen;
117 118
118 argc--; 119 argc--;
119 argv++; 120 argv++;
@@ -192,11 +193,19 @@ int main(int argc, char **argv)
192 193
193 memcpy(hdr.magic, BOOT_MAGIC, BOOT_MAGIC_SIZE); 194 memcpy(hdr.magic, BOOT_MAGIC, BOOT_MAGIC_SIZE);
194 195
195 if(strlen(cmdline) > (BOOT_ARGS_SIZE - 1)) { 196 cmdlen = strlen(cmdline);
197 if(cmdlen > (BOOT_ARGS_SIZE + BOOT_EXTRA_ARGS_SIZE - 2)) {
196 fprintf(stderr,"error: kernel commandline too large\n"); 198 fprintf(stderr,"error: kernel commandline too large\n");
197 return 1; 199 return 1;
198 } 200 }
199 strcpy((char*)hdr.cmdline, cmdline); 201 /* Even if we need to use the supplemental field, ensure we
202 * are still NULL-terminated */
203 strncpy((char *)hdr.cmdline, cmdline, BOOT_ARGS_SIZE - 1);
204 hdr.cmdline[BOOT_ARGS_SIZE - 1] = '\0';
205 if (cmdlen >= (BOOT_ARGS_SIZE - 1)) {
206 cmdline += (BOOT_ARGS_SIZE - 1);
207 strncpy((char *)hdr.extra_cmdline, cmdline, BOOT_EXTRA_ARGS_SIZE);
208 }
200 209
201 kernel_data = load_file(kernel_fn, &hdr.kernel_size); 210 kernel_data = load_file(kernel_fn, &hdr.kernel_size);
202 if(kernel_data == 0) { 211 if(kernel_data == 0) {