From 9e0edbcea8d14446487f13f56b65c669ba580673 Mon Sep 17 00:00:00 2001 From: Marco Elver Date: Mon, 10 Sep 2012 11:57:43 -0400 Subject: [PATCH] Mem: Allow serializing of more than INT_MAX bytes Despite gzwrite taking an unsigned for length, it returns an int for bytes written; gzwrite fails if (int)len < 0. Because of this, call gzwrite with len no larger than INT_MAX: write in blocks of INT_MAX if data to be written is larger than INT_MAX. --- src/mem/abstract_mem.cc | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/mem/abstract_mem.cc b/src/mem/abstract_mem.cc index a7016bb51..775517e3b 100644 --- a/src/mem/abstract_mem.cc +++ b/src/mem/abstract_mem.cc @@ -51,6 +51,7 @@ #include #include +#include #include #include @@ -486,9 +487,17 @@ AbstractMemory::serialize(ostream &os) fatal("Insufficient memory to allocate compression state for %s\n", filename); - if (gzwrite(compressedMem, pmemAddr, size()) != (int)size()) { - fatal("Write failed on physical memory checkpoint file '%s'\n", - filename); + uint64_t pass_size = 0; + // gzwrite fails if (int)len < 0 (gzwrite returns int) + for (uint64_t written = 0; written < size(); written += pass_size) { + pass_size = (uint64_t)INT_MAX < (size() - written) ? + (uint64_t)INT_MAX : (size() - written); + + if (gzwrite(compressedMem, pmemAddr + written, + (unsigned int) pass_size) != (int)pass_size) { + fatal("Write failed on physical memory checkpoint file '%s'\n", + filename); + } } if (gzclose(compressedMem)) -- 2.30.2