diff options
author | Lauri Aarnio <Lauri.Aarnio@iki.fi> | 2009-04-20 16:24:59 +0300 |
---|---|---|
committer | Lauri Leukkunen <lle@rahina.org> | 2009-06-08 23:31:13 +0300 |
commit | 69d8c32164d12dcee9aaa35ac041c0f0b6e36716 (patch) | |
tree | 4f28249be18c482697c608a601183a45fefa6948 | |
parent | 223760211a23736d77b878bdf31605d23228e61f (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.master | 4 | ||||
-rw-r--r-- | preload/libsb2.c | 40 |
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); } |