From: Paul Bolle <pebolle@tiscali.nl>
To: qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH] linux-user: use realpath for emulation dir paths
Date: Fri, 02 Oct 2009 14:25:36 +0200 [thread overview]
Message-ID: <1254486336.1738.30.camel@localhost.localdomain> (raw)
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 <pebolle@tiscali.nl>
---
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
next reply other threads:[~2009-10-02 12:25 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-10-02 12:25 Paul Bolle [this message]
2009-12-04 9:29 ` [Qemu-devel] [PATCH] linux-user: use realpath for emulation dir paths Riku Voipio
2009-12-04 10:00 ` Arnaud Patard
2009-12-04 10:37 ` Paul Bolle
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1254486336.1738.30.camel@localhost.localdomain \
--to=pebolle@tiscali.nl \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).