summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/deps_log.cc14
-rw-r--r--src/deps_log_test.cc26
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