[Fakeroot-commits] [SCM] fakeroot branch, upstream, updated. 08ed00124d8b6b445d3b91a9aa15eec638b02f05

Clint Adams schizo at debian.org
Sun Nov 15 03:16:57 UTC 2009


The following commit has been merged in the upstream branch:
commit 04efce2be54597c0e37ba3972d3af084474cb96f
Author: Clint Adams <schizo at debian.org>
Date:   Sat Nov 27 17:56:24 2004 +0000

    Apply Dmitry V. Levin's getresuid/getresgid/setfsuid/setfsgid patch
    
    fakeroot (1.2) unstable; urgency=low
    
      * Apply patch from Dmitry V. Levin <ldv at altlinux.org>:
        (Implement wrappers for getresuid, getresgid, setfsuid and
         setfsgid functions.)
       - communicate.h: New macros: FAKEROOTFUID_ENV, FAKEROOTFGID_ENV.
       - configure.ac: Check for getresuid, getresgid, setfsuid and
         setfsgid functions.
       - libfakeroot.c: (faked_fs_uid, faked_fs_gid): New variables.
         (set_faked_uid, set_faked_gid, set_faked_euid, set_faked_egid,
         set_faked_reuid, set_faked_regid, set_faked_resuid,
         set_faked_resgid): Set these variables.
         (read_fs_uid, read_fs_gid, write_fs_uid, write_fs_gid): New
         functions.
         (read_uids, read_gids, write_uids, write_gids, set_faked_euid,
         set_faked_egid): Use these functions.
         (get_faked_suid, get_faked_sgid, get_faked_fsuid,
         get_faked_fsgid, set_faked_fsuid, set_faked_fsgid): New functions.
         [HAVE_GETRESUID] (getresuid): New function.
         [HAVE_GETRESGID] (getresgid): Likewise.
         [HAVE_SETFSUID] (set_faked_fsuid, setfsuid): New functions.
         [HAVE_SETFSGID] (set_faked_fsgid, setfsgid): Likewise.
       - wrapfunc.inp [HAVE_GETRESUID] (getresuid): New wrapper.
         [HAVE_GETRESGID] (getresgid): Likewise.
         [HAVE_SETFSUID] (setfsuid): Likewise.
         [HAVE_SETFSGID] (setfsgid): Likewise.
    
    git-archimport-id: fakeroot at packages.debian.org--fakeroot/fakeroot--main--0.0--patch-39

diff --git a/communicate.h b/communicate.h
index 2da49a0..bd76e3a 100644
--- a/communicate.h
+++ b/communicate.h
@@ -68,6 +68,8 @@
 #define FAKEROOTEGID_ENV          "FAKEROOTEGID"
 #define FAKEROOTSUID_ENV          "FAKEROOTSUID"
 #define FAKEROOTSGID_ENV          "FAKEROOTSGID"
+#define FAKEROOTFUID_ENV          "FAKEROOTFUID"
+#define FAKEROOTFGID_ENV          "FAKEROOTFGID"
 #define FAKEROOTDONTTRYCHOWN_ENV  "FAKEROOTDONTTRYCHOWN"
 
 #define FAKELIBDIR                "/usr/lib/fakeroot"
diff --git a/configure.ac b/configure.ac
index 40dfd17..f589f62 100644
--- a/configure.ac
+++ b/configure.ac
@@ -343,7 +343,7 @@ esac
 AC_DEFINE_UNQUOTED([LIBCPATH], "$libcpath", [path to libc shared object])
 
 dnl Checks for library functions.
-AC_CHECK_FUNCS(strdup strstr setresuid setresgid)
+AC_CHECK_FUNCS(strdup strstr getresuid setresuid getresgid setresgid setfsuid setfsgid)
 
 dnl kludge
 AH_VERBATIM([WRAP_STAT],
diff --git a/libfakeroot.c b/libfakeroot.c
index 6d38bb8..ee137f1 100644
--- a/libfakeroot.c
+++ b/libfakeroot.c
@@ -180,6 +180,8 @@ static uid_t faked_effective_uid = -1;
 static gid_t faked_effective_gid = -1;
 static uid_t faked_saved_uid = -1;
 static gid_t faked_saved_gid = -1;
+static uid_t faked_fs_uid = -1;
+static gid_t faked_fs_gid = -1;
 
 /* Read user ID */
 
@@ -195,10 +197,15 @@ static void read_saved_uid() {
   read_id(&faked_saved_uid, FAKEROOTSUID_ENV);
 }
 
+static void read_fs_uid() {
+  read_id(&faked_fs_uid, FAKEROOTFUID_ENV);
+}
+
 static void read_uids() {
   read_real_uid();
   read_effective_uid();
   read_saved_uid();
+  read_fs_uid();
 }
 
 /* Read group ID */
@@ -215,10 +222,15 @@ static void read_saved_gid() {
   read_id(&faked_saved_gid, FAKEROOTSGID_ENV);
 }
 
+static void read_fs_gid() {
+  read_id(&faked_fs_gid, FAKEROOTFGID_ENV);
+}
+
 static void read_gids() {
   read_real_gid();
   read_effective_gid();
   read_saved_gid();
+  read_fs_gid();
 }
 
 /* Write user ID */
@@ -235,6 +247,10 @@ static int write_saved_uid() {
   return write_id(FAKEROOTSUID_ENV, faked_saved_uid);
 }
 
+static int write_fs_uid() {
+  return write_id(FAKEROOTFUID_ENV, faked_fs_uid);
+}
+
 static int write_uids() {
   if (write_real_uid() < 0)
     return -1;
@@ -242,6 +258,8 @@ static int write_uids() {
     return -1;
   if (write_saved_uid() < 0)
     return -1;
+  if (write_fs_uid() < 0)
+    return -1;
   return 0;
 }
 
@@ -259,6 +277,10 @@ static int write_saved_gid() {
   return write_id(FAKEROOTSGID_ENV, faked_saved_gid);
 }
 
+static int write_fs_gid() {
+  return write_id(FAKEROOTFGID_ENV, faked_fs_gid);
+}
+
 static int write_gids() {
   if (write_real_gid() < 0)
     return -1;
@@ -266,6 +288,8 @@ static int write_gids() {
     return -1;
   if (write_saved_gid() < 0)
     return -1;
+  if (write_fs_gid() < 0)
+    return -1;
   return 0;
 }
 
@@ -291,6 +315,26 @@ static gid_t get_faked_egid() {
   return faked_effective_gid;
 }
 
+static uid_t get_faked_suid() {
+  read_saved_uid();
+  return faked_saved_uid;
+}
+
+static gid_t get_faked_sgid() {
+  read_saved_gid();
+  return faked_saved_gid;
+}
+
+static uid_t get_faked_fsuid() {
+  read_fs_uid();
+  return faked_fs_uid;
+}
+
+static gid_t get_faked_fsgid() {
+  read_fs_gid();
+  return faked_fs_gid;
+}
+
 /* Faked set functions */
 
 static int set_faked_uid(uid_t uid) {
@@ -302,6 +346,7 @@ static int set_faked_uid(uid_t uid) {
   } else {
     faked_effective_uid = uid;
   }
+  faked_fs_uid = uid;
   return write_uids();
 }
 
@@ -314,19 +359,32 @@ static int set_faked_gid(gid_t gid) {
   } else {
     faked_effective_gid = gid;
   }
+  faked_fs_gid = gid;
   return write_gids();
 }
 
 static int set_faked_euid(uid_t euid) {
   read_effective_uid();
   faked_effective_uid = euid;
-  return write_effective_uid();
+  read_fs_uid();
+  faked_fs_uid = euid;
+  if (write_effective_uid() < 0)
+    return -1;
+  if (write_fs_uid() < 0)
+    return -1;
+  return 0;
 }
 
 static int set_faked_egid(gid_t egid) {
   read_effective_gid();
   faked_effective_gid = egid;
-  return write_effective_gid();
+  read_fs_gid();
+  faked_fs_gid = egid;
+  if (write_effective_gid() < 0)
+    return -1;
+  if (write_fs_gid() < 0)
+    return -1;
+  return 0;
 }
 
 static int set_faked_reuid(uid_t ruid, uid_t euid) {
@@ -337,6 +395,7 @@ static int set_faked_reuid(uid_t ruid, uid_t euid) {
     faked_real_uid = ruid;
   if (euid != (uid_t)-1)
     faked_effective_uid = euid;
+  faked_fs_uid = faked_effective_uid;
   return write_uids();
 }
 
@@ -348,6 +407,7 @@ static int set_faked_regid(gid_t rgid, gid_t egid) {
     faked_real_gid = rgid;
   if (egid != (gid_t)-1)
     faked_effective_gid = egid;
+  faked_fs_gid = faked_effective_gid;
   return write_gids();
 }
 
@@ -360,6 +420,7 @@ static int set_faked_resuid(uid_t ruid, uid_t euid, uid_t suid) {
     faked_effective_uid = euid;
   if (suid != (uid_t)-1)
     faked_saved_uid = suid;
+  faked_fs_uid = faked_effective_uid;
   return write_uids();
 }
 #endif
@@ -373,10 +434,27 @@ static int set_faked_resgid(gid_t rgid, gid_t egid, gid_t sgid) {
     faked_effective_gid = egid;
   if (sgid != (gid_t)-1)
     faked_saved_gid = sgid;
+  faked_fs_gid = faked_effective_gid;
   return write_gids();
 }
 #endif
 
+#ifdef HAVE_SETFSUID
+static uid_t set_faked_fsuid(uid_t fsuid) {
+  uid_t prev_fsuid = get_faked_fsuid();
+  faked_fs_uid = fsuid;
+  return prev_fsuid;
+}
+#endif
+
+#ifdef HAVE_SETFSGID
+static gid_t set_faked_fsgid(gid_t fsgid) {
+  gid_t prev_fsgid = get_faked_fsgid();
+  faked_fs_gid = fsgid;
+  return prev_fsgid;
+}
+#endif
+
 
 static int dont_try_chown(){
   static int inited=0;
@@ -846,6 +924,17 @@ uid_t geteuid(void){
   return get_faked_euid();
 }
 
+#ifdef HAVE_GETRESUID
+int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid){
+  if (fakeroot_disabled)
+    return next_getresuid(ruid, euid, suid);
+  *ruid = get_faked_uid();
+  *euid = get_faked_euid();
+  *suid = get_faked_suid();
+  return 0;
+}
+#endif /* HAVE_GETRESUID */
+
 uid_t getgid(void){
   if (fakeroot_disabled)
     return next_getgid();
@@ -858,6 +947,17 @@ uid_t getegid(void){
   return get_faked_egid();
 }
 
+#ifdef HAVE_GETRESGID
+int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid){
+  if (fakeroot_disabled)
+    return next_getresgid(rgid, egid, sgid);
+  *rgid = get_faked_gid();
+  *egid = get_faked_egid();
+  *sgid = get_faked_sgid();
+  return 0;
+}
+#endif /* HAVE_GETRESGID */
+
 int setuid(uid_t id){
   if (fakeroot_disabled)
     return next_setuid(id);
@@ -910,6 +1010,22 @@ int setresgid(gid_t rgid, gid_t egid, gid_t sgid){
 }
 #endif /* HAVE_SETRESGID */
 
+#ifdef HAVE_SETFSUID
+uid_t setfsuid(uid_t fsuid){
+  if (fakeroot_disabled)
+    return next_setfsuid(fsuid);
+  return set_faked_fsuid(fsuid);
+}
+#endif /* HAVE_SETFSUID */
+
+#ifdef HAVE_SETFSGID
+gid_t setfsgid(gid_t fsgid){
+  if (fakeroot_disabled)
+    return next_setfsgid(fsgid);
+  return set_faked_fsgid(fsgid);
+}
+#endif /* HAVE_SETFSGID */
+
 int initgroups(const char* user, INITGROUPS_SECOND_ARG group){
   if (fakeroot_disabled)
     return next_initgroups(user, group);
diff --git a/wrapfunc.inp b/wrapfunc.inp
index 1fada63..691ba66 100644
--- a/wrapfunc.inp
+++ b/wrapfunc.inp
@@ -67,11 +67,23 @@ seteuid;int;(uid_t id);(id)
 setegid;int;(gid_t id);(id)
 setreuid;int;(SETREUID_ARG ruid, SETREUID_ARG euid);(ruid, euid)
 setregid;int;(SETREGID_ARG rgid, SETREGID_ARG egid);(rgid, egid)
+#ifdef HAVE_GETRESUID
+getresuid;int;(uid_t *ruid, uid_t *euid, uid_t *suid);(ruid, euid, suid)
+#endif /* HAVE_GETRESUID */
+#ifdef HAVE_GETRESGID
+getresgid;int;(gid_t *rgid, gid_t *egid, gid_t *sgid);(rgid, egid, sgid)
+#endif /* HAVE_GETRESGID */
 #ifdef HAVE_SETRESUID
 setresuid;int;(uid_t ruid, uid_t euid, uid_t suid);(ruid, euid, suid)
 #endif /* HAVE_SETRESUID */
 #ifdef HAVE_SETRESGID
 setresgid;int;(gid_t rgid, gid_t egid, gid_t sgid);(rgid, egid, sgid)
 #endif /* HAVE_SETRESGID */
+#ifdef HAVE_SETFSUID
+setfsuid;uid_t;(uid_t fsuid);(fsuid)
+#endif /* HAVE_SETFSUID */
+#ifdef HAVE_SETFSGID
+setfsgid;gid_t;(gid_t fsgid);(fsgid)
+#endif /* HAVE_SETFSGID */
 initgroups;int;(const char *user, INITGROUPS_SECOND_ARG group);(user, group)
 setgroups;int;(SETGROUPS_SIZE_TYPE size, const gid_t *list);(size, list)

-- 
fakeroot



More information about the Fakeroot-commits mailing list