diff options
author | Elliott Sales de Andrade <quantum.analyst@gmail.com> | 2017-04-21 03:10:56 (GMT) |
---|---|---|
committer | Elliott Sales de Andrade <quantum.analyst@gmail.com> | 2017-09-16 07:54:11 (GMT) |
commit | bf4fb03e4b266e7f75f88664b6a941d20650046b (patch) | |
tree | 1b1e26f0359d561cdf9b05469550b84a91a223a8 /src/deps_log.cc | |
parent | eb6cea27f23c0674cea47871f281aaffb8a8efc3 (diff) | |
download | Ninja-bf4fb03e4b266e7f75f88664b6a941d20650046b.zip Ninja-bf4fb03e4b266e7f75f88664b6a941d20650046b.tar.gz Ninja-bf4fb03e4b266e7f75f88664b6a941d20650046b.tar.bz2 |
Use 64-bit-alignment-safe timestamp reading.
Read and write the timestamp as two separate 32-bit integers in a fixed
order to prevent any issues with alignment or byte order.
Diffstat (limited to 'src/deps_log.cc')
-rw-r--r-- | src/deps_log.cc | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/src/deps_log.cc b/src/deps_log.cc index d7f0b26..4239426 100644 --- a/src/deps_log.cc +++ b/src/deps_log.cc @@ -135,7 +135,11 @@ bool DepsLog::RecordDeps(Node* node, TimeStamp mtime, int id = node->id(); if (fwrite(&id, 4, 1, file_) < 1) return false; - if (fwrite(&mtime, 8, 1, file_) < 1) + uint32_t mtime_part = static_cast<uint32_t>(mtime & 0xffffffff); + if (fwrite(&mtime_part, 4, 1, file_) < 1) + return false; + mtime_part = static_cast<uint32_t>((mtime >> 32) & 0xffffffff); + if (fwrite(&mtime_part, 4, 1, file_) < 1) return false; for (int i = 0; i < node_count; ++i) { id = nodes[i]->id(); @@ -217,7 +221,9 @@ bool DepsLog::Load(const string& path, State* state, string* err) { assert(size % 4 == 0); int* deps_data = reinterpret_cast<int*>(buf); int out_id = deps_data[0]; - TimeStamp mtime = reinterpret_cast<TimeStamp*>(&deps_data[1])[0]; + TimeStamp mtime; + mtime = (TimeStamp)(((uint64_t)(unsigned int)deps_data[2] << 32) | + (uint64_t)(unsigned int)deps_data[1]); deps_data += 3; int deps_count = (size / 4) - 3; |