qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH] linux-user: use realpath for emulation dir paths


From: Paul Bolle
Subject: [Qemu-devel] [PATCH] linux-user: use realpath for emulation dir paths
Date: Fri, 02 Oct 2009 14:25:36 +0200

The paths to files inside the emulation dir as returned by path() are
not neat canonicalized absolute pathnames but can (and will) contain
"/./", "/../" and "//" parts. As far as I know these ugly paths will
only be seen when one is (printf) debugging. I assume, however, that
these paths have to be canonicalized every time they are used to open
files so that might as well be done when they are created.

Some minor cleanups etc. added too.

Signed-off-by: Paul Bolle <address@hidden>
---
I only noticed this because I "#if 1"'d a printf() in
linux-user/elfload.c (see a trivial patch I just send to the list).

Note that I have some reservations about the current init_paths() and
path() code:
- their names seem to confusing. Maybe those should be init_base() and
base() or something similar;
- why does init_paths() copy all filenames in the emulation dir (at
least, that what it seems to do)? Try something silly like
"-L /home/../" to see what I mean ...
- and why does path() return the original filename if that file isn't
found in the emulation dir? That looks like a nice source for confusing
behavior or crashes, as that means an identical named file (but using
the regular root) will then be used.

Maybe I'll elaborate in a separate mail.

 path.c |   21 +++++++++++++--------
 1 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/path.c b/path.c
index cc9e007..875cb03 100644
--- a/path.c
+++ b/path.c
@@ -122,25 +122,30 @@ follow_path(const struct pathelem *cursor, const char 
*name)
 void init_paths(const char *prefix)
 {
     char pref_buf[PATH_MAX];
+    char real_buf[PATH_MAX];
 
-    if (prefix[0] == '\0' ||
-        !strcmp(prefix, "/"))
+    if (prefix[0] == '\0')
         return;
 
     if (prefix[0] != '/') {
         char *cwd = getcwd(NULL, 0);
-        size_t pref_buf_len = sizeof(pref_buf);
 
         if (!cwd)
             abort();
-        pstrcpy(pref_buf, sizeof(pref_buf), cwd);
-        pstrcat(pref_buf, pref_buf_len, "/");
-        pstrcat(pref_buf, pref_buf_len, prefix);
+        pstrcpy(pref_buf, PATH_MAX, cwd);
+        pstrcat(pref_buf, PATH_MAX, "/");
+        pstrcat(pref_buf, PATH_MAX, prefix);
         free(cwd);
     } else
-        pstrcpy(pref_buf, sizeof(pref_buf), prefix + 1);
+        pstrcpy(pref_buf, PATH_MAX, prefix);
 
-    base = new_entry("", NULL, pref_buf);
+    if (realpath(pref_buf, real_buf))
+         pstrcpy(pref_buf, PATH_MAX, real_buf);
+
+    if (!strcmp(pref_buf, "/"))
+        return;
+
+    base = new_entry("", NULL, pref_buf + 1);
     base = add_dir_maybe(base);
     if (base->num_entries == 0) {
         free (base);
-- 
1.6.5.rc2





reply via email to

[Prev in Thread] Current Thread [Next in Thread]