]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
[gdb/tdep] Handle memory error in s390_linux_get_syscall_number
authorTom de Vries <tdevries@suse.de>
Tue, 21 Nov 2023 12:57:19 +0000 (13:57 +0100)
committerTom de Vries <tdevries@suse.de>
Tue, 21 Nov 2023 12:57:19 +0000 (13:57 +0100)
In s390_linux_get_syscall_number, we use read_memory_unsigned_integer, which
can throw a memory error.

According to the function comment though, it should return -1 on error:
...
/* Retrieve the syscall number at a ptrace syscall-stop.  Return -1
   upon error. */
...

Catch the memory error by using safe_read_memory_unsigned_integer instead,
similar to how that was fixed for arm in commit eb42bb14895 ("[gdb/tdep] Fix
catching syscall execve exit for arm").

Approved-By: Ulrich Weigand <uweigand@de.ibm.com>
gdb/s390-linux-tdep.c

index ae45ec6b5df93afed4a63aab0c681be4df3a9eb8..1eaeff3616de96759e5c6ebbf3da0678efac773b 100644 (file)
@@ -572,12 +572,21 @@ s390_linux_get_syscall_number (struct gdbarch *gdbarch,
      don't currently support SVC via EXECUTE. */
   regcache_cooked_read_unsigned (regs, tdep->pc_regnum, &pc);
   pc -= 2;
-  opcode = read_memory_unsigned_integer ((CORE_ADDR) pc, 1, byte_order);
+
+  ULONGEST val;
+  if (!safe_read_memory_unsigned_integer ((CORE_ADDR) pc, 1, byte_order,
+                                         &val))
+    return -1;
+  opcode = val;
+
   if (opcode != op_svc)
     return -1;
 
-  svc_number = read_memory_unsigned_integer ((CORE_ADDR) pc + 1, 1,
-                                            byte_order);
+  if (!safe_read_memory_unsigned_integer ((CORE_ADDR) pc + 1, 1, byte_order,
+                                         &val))
+    return -1;
+  svc_number = val;
+
   if (svc_number == 0)
     regcache_cooked_read_unsigned (regs, S390_R1_REGNUM, &svc_number);