Fix SVACE issuses 47/289847/1
authorMateusz Moscicki <m.moscicki2@partner.samsung.com>
Tue, 14 Mar 2023 12:56:53 +0000 (13:56 +0100)
committerMateusz Moscicki <m.moscicki2@partner.samsung.com>
Tue, 14 Mar 2023 15:28:19 +0000 (16:28 +0100)
Change-Id: I371e7a235ce5502d8a5f01cdfecac509efac7cc9

src/crash-stack/crash-stack-arm.c
src/crash-stack/mem_map.c
src/crash-stack/proc.c
src/livedumper/core.hpp
src/livedumper/note.hpp

index 11eb0fa..a1032f7 100644 (file)
@@ -121,7 +121,7 @@ void _crash_stack_print_regs(json_object *jobj)
 
        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;
                }
index 66e721c..bc60f73 100644 (file)
 #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)
@@ -493,9 +488,7 @@ static int mem_region_read_word(struct mem_region *region,
         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)
@@ -523,9 +516,6 @@ static int mem_region_read_word(struct mem_region *region,
     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);
index 9174960..62bb548 100644 (file)
@@ -85,7 +85,6 @@ extern struct timeval unfreeze_time;
 /* extern int opt_verbose; */
 
 static int opt_proc_mem = 0;
-static int opt_verbose = 0;
 
 int proc_state(int pid)
 {
@@ -457,12 +456,7 @@ int copy_memory(int pid, struct mem_data_chunk **frames, int n_frames)
 {
     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;
         }
     }
index 37a79db..d084b08 100644 (file)
@@ -217,7 +217,11 @@ class Core {
 
        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) {
index 9758e76..65e112f 100644 (file)
@@ -29,6 +29,7 @@
 #include <memory>
 #include <string>
 #include <vector>
+#include <limits>
 
 #if defined(__arm__)
 typedef user_regs user_regs_struct;
@@ -175,7 +176,19 @@ class NoteCoreAUXV : public Note {
                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 {