diff options
Diffstat (limited to 'mkbootimg/mkbootimg.c')
-rw-r--r-- | mkbootimg/mkbootimg.c | 13 |
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) { |