summaryrefslogtreecommitdiffstats
path: root/src/deps_log.cc
diff options
context:
space:
mode:
authorNico Weber <nicolasweber@gmx.de>2013-07-24 20:30:29 (GMT)
committerNico Weber <nicolasweber@gmx.de>2013-07-24 20:30:29 (GMT)
commitf6f00aa40f0c541df06747228b1cc928d4972b3e (patch)
treedec640236366316f728cbab43f1107c26430da39 /src/deps_log.cc
parent7c9220bbfa5d081a1109a25733805f17b1e0b284 (diff)
parent70f18e1138c9af638afae95b8a521c257e42ccce (diff)
downloadNinja-f6f00aa40f0c541df06747228b1cc928d4972b3e.zip
Ninja-f6f00aa40f0c541df06747228b1cc928d4972b3e.tar.gz
Ninja-f6f00aa40f0c541df06747228b1cc928d4972b3e.tar.bz2
Merge pull request #612 from maximuska/proposed/deps_log_write_errors_checking
Proposed/deps log write errors checking
Diffstat (limited to 'src/deps_log.cc')
-rw-r--r--src/deps_log.cc55
1 files changed, 41 insertions, 14 deletions
diff --git a/src/deps_log.cc b/src/deps_log.cc
index 63e0d95..2c4e3c2 100644
--- a/src/deps_log.cc
+++ b/src/deps_log.cc
@@ -37,6 +37,9 @@ const int kCurrentVersion = 1;
// buffer after every record to make sure records aren't written partially.
const int kMaxBufferSize = 1 << 15;
+// Record size is currently limited to 15 bit
+const size_t kMaxRecordSize = (1 << 15) - 1;
+
DepsLog::~DepsLog() {
Close();
}
@@ -69,8 +72,10 @@ bool DepsLog::OpenForWrite(const string& path, string* err) {
return false;
}
}
- fflush(file_);
-
+ if (fflush(file_) != 0) {
+ *err = strerror(errno);
+ return false;
+ }
return true;
}
@@ -87,12 +92,14 @@ bool DepsLog::RecordDeps(Node* node, TimeStamp mtime,
// Assign ids to all nodes that are missing one.
if (node->id() < 0) {
- RecordId(node);
+ if (!RecordId(node))
+ return false;
made_change = true;
}
for (int i = 0; i < node_count; ++i) {
if (nodes[i]->id() < 0) {
- RecordId(nodes[i]);
+ if (!RecordId(nodes[i]))
+ return false;
made_change = true;
}
}
@@ -119,18 +126,28 @@ bool DepsLog::RecordDeps(Node* node, TimeStamp mtime,
return true;
// Update on-disk representation.
- uint16_t size = 4 * (1 + 1 + (uint16_t)node_count);
+ size_t size = 4 * (1 + 1 + (uint16_t)node_count);
+ if (size > kMaxRecordSize) {
+ errno = ERANGE;
+ return false;
+ }
size |= 0x8000; // Deps record: set high bit.
- fwrite(&size, 2, 1, file_);
+ uint16_t size16 = (uint16_t)size;
+ if (fwrite(&size16, 2, 1, file_) < 1)
+ return false;
int id = node->id();
- fwrite(&id, 4, 1, file_);
+ if (fwrite(&id, 4, 1, file_) < 1)
+ return false;
int timestamp = mtime;
- fwrite(&timestamp, 4, 1, file_);
+ if (fwrite(&timestamp, 4, 1, file_) < 1)
+ return false;
for (int i = 0; i < node_count; ++i) {
id = nodes[i]->id();
- fwrite(&id, 4, 1, file_);
+ if (fwrite(&id, 4, 1, file_) < 1)
+ return false;
}
- fflush(file_);
+ if (fflush(file_) != 0)
+ return false;
// Update in-memory representation.
Deps* deps = new Deps(mtime, node_count);
@@ -323,10 +340,20 @@ bool DepsLog::UpdateDeps(int out_id, Deps* deps) {
}
bool DepsLog::RecordId(Node* node) {
- uint16_t size = (uint16_t)node->path().size();
- fwrite(&size, 2, 1, file_);
- fwrite(node->path().data(), node->path().size(), 1, file_);
- fflush(file_);
+ size_t size = node->path().size();
+ if (size > kMaxRecordSize) {
+ errno = ERANGE;
+ return false;
+ }
+ uint16_t size16 = (uint16_t)size;
+ if (fwrite(&size16, 2, 1, file_) < 1)
+ return false;
+ if (fwrite(node->path().data(), node->path().size(), 1, file_) < 1) {
+ assert(node->path().size() > 0);
+ return false;
+ }
+ if (fflush(file_) != 0)
+ return false;
node->set_id(nodes_.size());
nodes_.push_back(node);