sys_setuid() and sys_getuid() (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 23 Aug 2010 19:30:07 +0000 (12:30 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:52 +0000 (17:35 -0700)
The syscalls don't actually do anything, but it allows processes to
think it worked.  The other option would be to have glibc just lie about
it, but we might do something with these calls in the future.

Rebuild your cross compiler if you want these functions.

kern/include/ros/bits/syscall.h
kern/src/syscall.c
tools/compilers/gcc-glibc/glibc-2.11.1-ros/sysdeps/ros/setgid.c [new file with mode: 0644]
tools/compilers/gcc-glibc/glibc-2.11.1-ros/sysdeps/ros/setuid.c [new file with mode: 0644]

index da414da..95241db 100644 (file)
@@ -75,6 +75,8 @@
 #define SYS_gettimeofday               140
 #define SYS_tcgetattr                  141
 #define SYS_tcsetattr                  142
+#define SYS_setuid                             143
+#define SYS_setgid                             144
 
 /* Syscalls we plan to remove someday */
 #define SYS_cache_buster        200 
index 7973414..47e3f05 100644 (file)
@@ -1194,6 +1194,20 @@ intreg_t sys_tcsetattr(struct proc *p, int fd, int optional_actions,
        return ret;
 }
 
+/* TODO: we don't have any notion of UIDs or GIDs yet, but don't let that stop a
+ * process from thinking it can do these.  The other alternative is to have
+ * glibc return 0 right away, though someone might want to do something with
+ * these calls.  Someday. */
+intreg_t sys_setuid(struct proc *p, uid_t uid)
+{
+       return 0;
+}
+
+intreg_t sys_setgid(struct proc *p, gid_t gid)
+{
+       return 0;
+}
+
 /************** Syscall Invokation **************/
 
 /* Executes the given syscall.
@@ -1276,7 +1290,9 @@ intreg_t syscall(struct proc *p, uintreg_t syscallno, uintreg_t a1,
                [SYS_rmdir] = (syscall_t)sys_rmdir,
                [SYS_gettimeofday] = (syscall_t)sys_gettimeofday,
                [SYS_tcgetattr] = (syscall_t)sys_tcgetattr,
-               [SYS_tcsetattr] = (syscall_t)sys_tcsetattr
+               [SYS_tcsetattr] = (syscall_t)sys_tcsetattr,
+               [SYS_setuid] = (syscall_t)sys_setuid,
+               [SYS_setgid] = (syscall_t)sys_setgid
        };
 
        const int max_syscall = sizeof(syscall_table)/sizeof(syscall_table[0]);
diff --git a/tools/compilers/gcc-glibc/glibc-2.11.1-ros/sysdeps/ros/setgid.c b/tools/compilers/gcc-glibc/glibc-2.11.1-ros/sysdeps/ros/setgid.c
new file mode 100644 (file)
index 0000000..051d3e5
--- /dev/null
@@ -0,0 +1,34 @@
+/* Copyright (C) 1991, 1993, 1995, 1996, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <errno.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <ros/syscall.h>
+
+/* Set the group ID of the calling process to GID.
+   If the calling process is the super-user, the real
+   and effective group IDs, and the saved set-group-ID to GID;
+   if not, the effective group ID is set to GID.  */
+int
+__setgid (gid)
+     gid_t gid;
+{
+  return ros_syscall(SYS_setgid, gid, 0, 0, 0, 0);
+}
+weak_alias (__setgid, setgid)
diff --git a/tools/compilers/gcc-glibc/glibc-2.11.1-ros/sysdeps/ros/setuid.c b/tools/compilers/gcc-glibc/glibc-2.11.1-ros/sysdeps/ros/setuid.c
new file mode 100644 (file)
index 0000000..103d431
--- /dev/null
@@ -0,0 +1,34 @@
+/* Copyright (C) 1991, 1993, 1995, 1996, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <errno.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <ros/syscall.h>
+
+/* Set the user ID of the calling process to UID.
+   If the calling process is the super-user, the real
+   and effective user IDs, and the saved set-user-ID to UID;
+   if not, the effective user ID is set to UID.  */
+int
+__setuid (uid)
+     uid_t uid;
+{
+  return ros_syscall(SYS_setuid, uid, 0, 0, 0, 0);
+}
+weak_alias (__setuid, setuid)