diff --git a/init/initramfs.c b/init/initramfs.c index 6111a6cfca1e014094ed019e83c89b411497e000..fdbab9d20214ec17c9a40c39129a6436526d0c14 100644 --- a/init/initramfs.c +++ b/init/initramfs.c @@ -411,6 +411,15 @@ static int __init do_name(void) { state = SkipIt; next_state = Reset; + + /* name_len > 0 && name_len <= PATH_MAX checked in do_header */ + if (collected[name_len - 1] != '\0') { + pr_err("initramfs name without nulterm: %.*s\n", + (int)name_len, collected); + error("malformed archive"); + return 1; + } + if (strcmp(collected, "TRAILER!!!") == 0) { free_hash(); return 0; @@ -518,6 +527,12 @@ static int __init do_copy(void) static int __init do_symlink(void) { + if (collected[name_len - 1] != '\0') { + pr_err("initramfs symlink without nulterm: %.*s\n", + (int)name_len, collected); + error("malformed archive"); + return 1; + } collected[N_ALIGN(name_len) + body_len] = '\0'; memcpy(previous_name_buf, collected, strlen(collected) + 1); clean_path(collected, 0);