diff --git a/init/initramfs.c b/init/initramfs.c index de10d99ae2f5ade13bf75514b02c6a2edc00775a..8b6870f914db412fa1dcfd9540a1f81de524b025 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);