summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLauri Aarnio <Lauri.Aarnio@iki.fi>2009-04-20 16:24:59 +0300
committerLauri Leukkunen <lle@rahina.org>2009-06-08 23:31:13 +0300
commit69d8c32164d12dcee9aaa35ac041c0f0b6e36716 (patch)
tree4f28249be18c482697c608a601183a45fefa6948
parent223760211a23736d77b878bdf31605d23228e61f (diff)
Added a GATE for __realpath_chk(): Needed with newer versions of glibc
- In some newer glibc versions, realpath() has been replaced by an inline function which which calls __realpath_chk() instead of realpath(). This commit adds a GATE function for that => realpath() works again.
-rw-r--r--preload/interface.master4
-rw-r--r--preload/libsb2.c40
2 files changed, 43 insertions, 1 deletions
diff --git a/preload/interface.master b/preload/interface.master
index 55a9481..a8c145a 100644
--- a/preload/interface.master
+++ b/preload/interface.master
@@ -65,6 +65,10 @@ GATE: char * getwd (char *buf) : returns_string
GATE: char *realpath(const char *name, char *resolved) : \
map(name) returns_string
+GATE: char *__realpath_chk(__const char *__restrict __name, \
+ char *__restrict __resolved, size_t __resolvedlen) : \
+ map(__name) returns_string
+
GATE: int uname(struct utsname *buf)
#ifdef HAVE_FTS_H
diff --git a/preload/libsb2.c b/preload/libsb2.c
index 16d47c8..f5b6239 100644
--- a/preload/libsb2.c
+++ b/preload/libsb2.c
@@ -583,7 +583,45 @@ char *realpath_gate(
}
} /* else not reversed, just return rp */
}
-SB_LOG(SB_LOGLEVEL_DEBUG, "REALPATH: returns '%s'", rp);
+ SB_LOG(SB_LOGLEVEL_NOISE, "REALPATH: returns '%s'", rp);
+ return(rp);
+}
+
+/* gate for
+ * char *__realpath_chk (__const char *__restrict __name,
+ * char *__restrict __resolved, size_t __resolvedlen)
+ * (__realpath_chk is yet another ugly trick from the creators of glibc)
+*/
+char *__realpath_chk_gate(
+ char *(*real__realpath_chk_ptr)(__const char *__restrict __name,
+ char *__restrict __resolved, size_t __resolvedlen),
+ const char *realfnname,
+ __const char *__restrict name, /* name, already mapped */
+ char *__restrict __resolved,
+ size_t __resolvedlen)
+{
+ char *sbox_path = NULL;
+ char *rp;
+
+ if ((rp = (*real__realpath_chk_ptr)(name,__resolved,__resolvedlen)) == NULL) {
+ return NULL;
+ }
+ if (*rp != '\0') {
+ sbox_path = scratchbox_reverse_path(realfnname, rp);
+ if (sbox_path) {
+ if (__resolved) {
+ strncpy(__resolved, sbox_path, __resolvedlen);
+ rp = __resolved;
+ free(sbox_path);
+ } else {
+ /* resolved was null - assume that glibc
+ * allocated memory */
+ free(rp);
+ rp = sbox_path;
+ }
+ } /* else not reversed, just return rp */
+ }
+ SB_LOG(SB_LOGLEVEL_NOISE, "REALPATH: returns '%s'", rp);
return(rp);
}