[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