浏览代码

UserspaceEmulator: Implement the setuid() and setgid() syscalls

Note that running a setuid program (e.g /bin/ping) in UE does not
actually run uid=0. You'll have to run UE itself as uid=0 if you want
to test programs that do setuid/setgid.
Andreas Kling 5 年之前
父节点
当前提交
d9f933df7b
共有 2 个文件被更改,包括 16 次插入0 次删除
  1. 14 0
      DevTools/UserspaceEmulator/Emulator.cpp
  2. 2 0
      DevTools/UserspaceEmulator/Emulator.h

+ 14 - 0
DevTools/UserspaceEmulator/Emulator.cpp

@@ -278,6 +278,10 @@ u32 Emulator::virt_syscall(u32 function, u32 arg1, u32 arg2, u32 arg3)
         return virt$getuid();
     case SC_getgid:
         return virt$getgid();
+    case SC_setuid:
+        return virt$setuid(arg1);
+    case SC_setgid:
+        return virt$setgid(arg2);
     case SC_close:
         return virt$close(arg1);
     case SC_fstat:
@@ -791,6 +795,16 @@ gid_t Emulator::virt$getgid()
     return getgid();
 }
 
+int Emulator::virt$setuid(uid_t uid)
+{
+    return syscall(SC_setuid, uid);
+}
+
+int Emulator::virt$setgid(gid_t gid)
+{
+    return syscall(SC_setgid, gid);
+}
+
 u32 Emulator::virt$write(int fd, FlatPtr data, ssize_t size)
 {
     if (size < 0)

+ 2 - 0
DevTools/UserspaceEmulator/Emulator.h

@@ -88,6 +88,8 @@ private:
     u32 virt$pledge(u32);
     uid_t virt$getuid();
     gid_t virt$getgid();
+    int virt$setuid(uid_t);
+    int virt$setgid(gid_t);
     u32 virt$read(int, FlatPtr, ssize_t);
     u32 virt$write(int, FlatPtr, ssize_t);
     u32 virt$mprotect(FlatPtr, size_t, int);