for (size_t i = 0; i < ARRAY_SIZE(regs); i++) {
char value_str[8+3];
- if (sprintf(value_str, "0x%08lx", g_registers.uregs[regs[i].index]) == -1) {
+ if (snprintf(value_str, ARRAY_SIZE(value_str), "0x%08lx", g_registers.uregs[regs[i].index]) == -1) {
_E("Cannot print register value: %m");
continue;
}
#define VSYSCALL_START (-10UL << 20)
#endif
-// extern int opt_verbose;
-// extern int opt_ignore_deleted;
-static int opt_verbose = 1;
-static int opt_ignore_deleted = 0;
-
static void mem_region_print(const struct mem_region *region);
static int in(const void *point, const void *start, size_t size)
return -1;
case MEM_REGION_TYPE_DELETED:
- if (!opt_ignore_deleted)
- return -2;
- break;
+ return -2;
case MEM_REGION_TYPE_MMAP:
if (region->fd < 0 && mem_region_map_file(region) < 0)
if (chunk == NULL) {
size_t i;
- if (!opt_verbose)
- return -1;
-
_E("No chunk of memory containing %p at region %p-%p",
addr, region->start, region->start + region->length);
mem_region_print(region);
/* extern int opt_verbose; */
static int opt_proc_mem = 0;
-static int opt_verbose = 0;
int proc_state(int pid)
{
{
if (!opt_proc_mem) {
int rc = copy_memory_process_vm_readv(pid, frames, n_frames);
- if (rc == ENOSYS) {
- if (opt_verbose) {
- _E("process_vm_readv is not supported, falling "
- "back to /proc/pid/mem");
- }
- } else {
+ if (rc != ENOSYS) {
return rc;
}
}
void ReadFromFile(std::ifstream &input, unsigned long address, void *data, size_t len) {
input.seekg(address, std::ios_base::beg);
- input.read(static_cast<char*>(data), len);
+ if (len > std::numeric_limits<std::streamsize>::max()) {
+ logger.log_error("Such a large data cannot be read");
+ } else {
+ input.read(static_cast<char*>(data), len);
+ }
}
void ReadFromFile(const int fd, unsigned long address, void *data, size_t len) {
#include <memory>
#include <string>
#include <vector>
+#include <limits>
#if defined(__arm__)
typedef user_regs user_regs_struct;
desc_size = m_auxv.size();
}
void SaveDataTo(std::ofstream &core_file) const {
- core_file.write(m_auxv.data(), m_auxv.size());
+ std::vector<char>::size_type remaining = m_auxv.size();
+ std::vector<char>::size_type offset = 0;
+ while (remaining > 0) {
+ std::streamsize chunk_size;
+ if (remaining > std::numeric_limits<std::streamsize>::max()) {
+ chunk_size = std::numeric_limits<std::streamsize>::max();
+ } else {
+ chunk_size = remaining;
+ }
+ remaining -= chunk_size;
+ core_file.write(m_auxv.data() + offset, chunk_size);
+ offset += chunk_size;
+ }
}
const std::vector<char>& auxv() const {