logger.log_error("lseek64 error: %s", std::system_category().default_error_condition(errno).message().c_str());
if (!minicore || static_cast<ProgramTableEntryLoad<T>*>(record.get())->important)
CopyData(mem_fd, core_file, record->header.p_filesz);
- else
- core_file.seekp(record->header.p_filesz, std::ios_base::cur);
+ else {
+ if (sizeof(std::streamoff) == sizeof(uint32_t) && record->header.p_filesz > INT_MAX) {
+ core_file.seekp(INT_MAX, std::ios_base::cur);
+ core_file.seekp(static_cast<std::streamoff>(record->header.p_filesz - INT_MAX), std::ios_base::cur);
+ } else {
+ core_file.seekp(static_cast<std::streamoff>(record->header.p_filesz), std::ios_base::cur);
+ }
+ }
}
}
return;
}
- output.seekp(oaddress, std::ios_base::beg);
+ /* Since std::streamoff is signed type, unsigned typed value can overwrite signed bit */
+ if (sizeof(typename T::Addr) == sizeof(std::streamoff) && oaddress > INT_MAX) {
+ output.seekp(INT_MAX, std::ios_base::beg);
+ output.seekp(static_cast<std::streamoff>(oaddress - INT_MAX), std::ios_base::cur);
+ } else {
+ output.seekp(static_cast<std::streamoff>(oaddress), std::ios_base::beg);
+ }
constexpr const char * format = std::is_same<T, Elf64>::value ?
"dumping %s: 0x%" PRIx64 "-0x%" PRIx64 " to 0x%" PRIx64 " (%zu bytes)" :
"dumping %s: 0x%" PRIx32 "-0x%" PRIx32 " to 0x%" PRIx32 " (%zu bytes)";