From eee4910fb7189773074e4c89d4ba249704ba5d11 Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Tue, 9 Apr 2013 09:58:54 -0700 Subject: On invalid depslog header, restart build instead of showing an error. Also add tests for invalid headers. --- src/deps_log.cc | 14 +++++--------- src/deps_log_test.cc | 26 ++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/src/deps_log.cc b/src/deps_log.cc index 8946e32..79daba5 100644 --- a/src/deps_log.cc +++ b/src/deps_log.cc @@ -136,16 +136,12 @@ bool DepsLog::Load(const string& path, State* state, string* err) { return false; } - if (!fgets(buf, sizeof(buf), f)) { - *err = strerror(errno); - return false; - } + bool valid_header = true; int version = 0; - if (fread(&version, 4, 1, f) < 1) { - *err = strerror(errno); - return false; - } - if (version != kCurrentVersion) { + if (!fgets(buf, sizeof(buf), f) || fread(&version, 4, 1, f) < 1) + valid_header = false; + if (!valid_header || strcmp(buf, kFileSignature) != 0 || + version != kCurrentVersion) { *err = "bad deps log signature or version; starting over"; fclose(f); unlink(path.c_str()); diff --git a/src/deps_log_test.cc b/src/deps_log_test.cc index 2d91c0e..06fffeb 100644 --- a/src/deps_log_test.cc +++ b/src/deps_log_test.cc @@ -192,4 +192,30 @@ TEST_F(DepsLogTest, Recompact) { } } +// Verify that invalid file headers cause a new build. +TEST_F(DepsLogTest, InvalidHeader) { + const char *kInvalidHeaders[] = { + "", // Emtpy file. + "# ninjad", // Truncated first line. + "# ninjadeps\n", // No version int. + "# ninjadeps\n\001\002", // Truncated version int. + "# ninjadeps\n\001\002\003\004" // Invalid version int. + }; + for (size_t i = 0; i < sizeof(kInvalidHeaders) / sizeof(kInvalidHeaders[0]); + ++i) { + FILE* deps_log = fopen(kTestFilename, "wb"); + ASSERT_TRUE(deps_log != NULL); + ASSERT_EQ( + strlen(kInvalidHeaders[i]), + fwrite(kInvalidHeaders[i], 1, strlen(kInvalidHeaders[i]), deps_log)); + ASSERT_EQ(0 ,fclose(deps_log)); + + string err; + DepsLog log; + State state; + ASSERT_TRUE(log.Load(kTestFilename, &state, &err)); + EXPECT_EQ("bad deps log signature or version; starting over", err); + } +} + } // anonymous namespace -- cgit v0.12