caller.py: don't try to make zero-sized memory accesses, they error
authorJacob Lifshay <programmerjake@gmail.com>
Wed, 6 Dec 2023 09:07:42 +0000 (01:07 -0800)
committerJacob Lifshay <programmerjake@gmail.com>
Wed, 13 Dec 2023 00:59:12 +0000 (16:59 -0800)
src/openpower/decoder/isa/caller.py

index e14fa8438f005ffe6a6842e3bb96a3de48a40c7c..53427313c2b21247fe690d5e2b9eba92215e3723 100644 (file)
@@ -1180,7 +1180,10 @@ class SyscallEmulator(openpower.syscalls.Dispatcher):
         raise ExitSyscallCalled(status)
 
     def sys_write(self, fd, buf, count, *rest):
-        buf = self.__isacaller.mem.get_ctypes(buf, count, is_write=False)
+        if count != 0:
+            buf = self.__isacaller.mem.get_ctypes(buf, count, is_write=False)
+        else:
+            buf = b""
         try:
             return os.write(fd, buf)
         except OSError as e:
@@ -1210,7 +1213,10 @@ class SyscallEmulator(openpower.syscalls.Dispatcher):
             return -e.errno
 
     def sys_read(self, fd, buf, count, *rest):
-        buf = self.__isacaller.mem.get_ctypes(buf, count, is_write=True)
+        if count != 0:
+            buf = self.__isacaller.mem.get_ctypes(buf, count, is_write=True)
+        else:
+            buf = bytearray()
         try:
             return os.readv(fd, [buf])
         except OSError as e:
@@ -1290,7 +1296,11 @@ class SyscallEmulator(openpower.syscalls.Dispatcher):
     def sys_readlinkat(self, dirfd, pathname, buf, bufsiz, *rest):
         try:
             path = self.__isacaller.mem.read_cstr(pathname)
-            buf = self.__isacaller.mem.get_ctypes(buf, bufsiz, is_write=True)
+            if bufsiz != 0:
+                buf = self.__isacaller.mem.get_ctypes(
+                    buf, bufsiz, is_write=True)
+            else:
+                buf = bytearray()
         except (ValueError, MemException):
             return -errno.EFAULT
         try: