From: mathieu.desnoyers@efficios.com (Mathieu Desnoyers)
Subject: [lttng-dev] [lttng-tools PATCH 3/4] Correct the behavior of the utils_expand_path function
Date: Thu, 14 Nov 2013 02:44:19 +0000 (UTC) [thread overview]
Message-ID: <647704866.66921.1384397059144.JavaMail.zimbra@efficios.com> (raw)
In-Reply-To: <1384320878-28808-4-git-send-email-raphael.beamonte@gmail.com>
----- Original Message -----
> From: "Rapha?l Beamonte" <raphael.beamonte@gmail.com>
> To: dgoulet at efficios.com
> Cc: "Rapha?l Beamonte" <raphael.beamonte at gmail.com>, lttng-dev at lists.lttng.org
> Sent: Wednesday, November 13, 2013 12:34:37 AM
> Subject: [lttng-dev] [lttng-tools PATCH 3/4] Correct the behavior of the utils_expand_path function
>
> Even if the utils_expand_path function was intended to allow to
> use unexistent directory paths, it was in fact only working for
> some kind of arguments. Paths like "foo", "bar/" or "bar/foo"
> when the "bar" directory does not exist wasn't working. This
> patch introduce a new way to expand paths in this function that
> also works properly for these kind of arguments.
I might be missing something, but how about, instead:
1) if path start with /, directly pass it to realpath()
2) if path does not start with /, prepend getcwd() to it, and then call realpath() on the result.
If we can do the same result as this patch without reimplementing tricky string handling, we should really aim for re-using existing libraries.
Thoughts ?
Thanks,
Mathieu
>
> Signed-off-by: Rapha?l Beamonte <raphael.beamonte at gmail.com>
> ---
> src/common/utils.c | 86
> ++++++++++++++++++++++++++++++++++++++--------------
> 1 file changed, 64 insertions(+), 22 deletions(-)
>
> diff --git a/src/common/utils.c b/src/common/utils.c
> index 4ccf36a..6938a5a 100644
> --- a/src/common/utils.c
> +++ b/src/common/utils.c
> @@ -112,7 +112,7 @@ error:
> LTTNG_HIDDEN
> char *utils_expand_path(const char *path)
> {
> - const char *end_path = path;
> + const char *end_path = NULL;
> char *next, *cut_path = NULL, *expanded_path = NULL;
>
> /* Safety net */
> @@ -120,38 +120,80 @@ char *utils_expand_path(const char *path)
> goto error;
> }
>
> - /* Find last token delimited by '/' */
> - while ((next = strpbrk(end_path + 1, "/"))) {
> - end_path = next;
> - }
> -
> - /* Cut last token from original path */
> - cut_path = strndup(path, end_path - path);
> -
> + /* Allocate memory for the expanded path */
> expanded_path = zmalloc(PATH_MAX);
> if (expanded_path == NULL) {
> PERROR("zmalloc expand path");
> goto error;
> }
>
> - expanded_path = realpath((char *)cut_path, expanded_path);
> - if (expanded_path == NULL) {
> - switch (errno) {
> - case ENOENT:
> - ERR("%s: No such file or directory", cut_path);
> - break;
> - default:
> - PERROR("realpath utils expand path");
> - break;
> + /* If given path is already absolute */
> + if (*path == '/') {
> + strncpy(expanded_path, path, PATH_MAX);
> + /* Else, we have some work to do */
> + } else {
> + /* Pointer to the last char of the path */
> + const char *last_char = path + strlen(path) - 1;
> +
> + end_path = path;
> +
> + /* Split part that will be resolved by realpath (relative path from
> + * current directory using ./ or ../ only) and part that could not
> + * (directory names)
> + */
> + while ((next = strpbrk(end_path, "/")) && (next != last_char)) {
> + end_path = next + 1;
> + if (strncmp(end_path, "./", 2) != 0 &&
> + strncmp(end_path, "../", 3) != 0) {
> + break;
> + }
> + }
> +
> + /* If this is the end of the string, and we still can resolve it */
> + if (strncmp(end_path, "..\0", 3) == 0 ||
> + strncmp(end_path, ".\0", 2) == 0) {
> + end_path += strlen(end_path);
> + }
> +
> + /* If the end part is the whole path, we are in the current dir */
> + if (end_path == path) {
> + cut_path = strdup(".");
> + /* Else, cut the resolvable part from original path */
> + } else {
> + cut_path = strndup(path, end_path - path);
> + }
> +
> + /* Resolve the canonical path of the first part of the path */
> + expanded_path = realpath((char *)cut_path, expanded_path);
> + if (expanded_path == NULL) {
> + switch (errno) {
> + case ENOENT:
> + ERR("%s: No such file or directory", cut_path);
> + break;
> + default:
> + PERROR("realpath utils expand path");
> + break;
> + }
> + goto error;
> + }
> +
> + /* Add end part to expanded path if not empty */
> + if (*end_path != 0) {
> + strncat(expanded_path, "/", PATH_MAX - strlen(expanded_path) - 1);
> + strncat(expanded_path, end_path,
> + PATH_MAX - strlen(expanded_path) - 1);
> }
> - goto error;
> }
>
> - /* Add end part to expanded path */
> - strncat(expanded_path, end_path, PATH_MAX - strlen(expanded_path) - 1);
> + /* Resolve the internal './' and '../' strings */
> + next = utils_resolve_relative(expanded_path);
> + if (next == NULL) {
> + goto error;
> + }
>
> + free(expanded_path);
> free(cut_path);
> - return expanded_path;
> + return next;
>
> error:
> free(expanded_path);
> --
> 1.7.10.4
>
>
> _______________________________________________
> lttng-dev mailing list
> lttng-dev at lists.lttng.org
> http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
>
--
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com
next prev parent reply other threads:[~2013-11-14 2:44 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-08 4:32 [lttng-dev] [lttng-tools PATCH 0/2] utils_expand_path as realpath(3) for non-existing directories Raphaël Beamonte
2013-11-08 4:32 ` [lttng-dev] [lttng-tools PATCH 1/2] Introduce a new utils_resolve_relative function Raphaël Beamonte
2013-11-12 19:51 ` David Goulet
2013-11-13 5:34 ` [lttng-dev] [lttng-tools PATCH 0/4] Update to utils_expand_path as realpath(3) for non-existing directories Raphaël Beamonte
2013-11-13 5:34 ` [lttng-dev] [lttng-tools PATCH 1/4] Introduce a new utils_resolve_relative function Raphaël Beamonte
2013-11-14 14:19 ` Mathieu Desnoyers
2013-11-14 17:07 ` Raphaël Beamonte
2013-11-13 5:34 ` [lttng-dev] [lttng-tools PATCH 2/4] Tests: Add test_utils_resolve_relative to unit tests Raphaël Beamonte
2013-11-13 5:34 ` [lttng-dev] [lttng-tools PATCH 3/4] Correct the behavior of the utils_expand_path function Raphaël Beamonte
2013-11-14 2:44 ` Mathieu Desnoyers [this message]
2013-11-14 3:27 ` Raphaël Beamonte
2013-11-14 13:46 ` Mathieu Desnoyers
2013-11-14 14:10 ` Mathieu Desnoyers
2013-11-14 16:00 ` Raphaël Beamonte
2013-11-14 16:14 ` Mathieu Desnoyers
2013-11-15 0:58 ` [lttng-dev] [lttng-tools PATCH 0/5] Follow up to the realpath(3) for unexistent paths Raphaël Beamonte
2013-11-15 0:58 ` [lttng-dev] [lttng-tools PATCH 1/5] Tests: add a check in test_utils_expand_path to avoid segfault if result is NULL Raphaël Beamonte
2013-11-15 0:58 ` [lttng-dev] [lttng-tools PATCH 2/5] Tests: move invalid tests in test_utils_expand_path that should be valid Raphaël Beamonte
2013-11-15 0:58 ` [lttng-dev] [lttng-tools PATCH 3/5] Introduce a new utils_partial_realpath function Raphaël Beamonte
2013-11-15 0:58 ` [lttng-dev] [lttng-tools PATCH 4/5] Change the utils_expand_path function to use utils_partial_realpath Raphaël Beamonte
2013-11-15 0:58 ` [lttng-dev] [lttng-tools PATCH 5/5] Remove the utils_resolve_relative function that is not useful anymore Raphaël Beamonte
2013-11-15 15:45 ` [lttng-dev] [lttng-tools PATCH 0/5] Follow up to the realpath(3) for unexistent paths David Goulet
2013-11-23 22:32 ` [lttng-dev] [lttng-tools PATCH 0/5] utils_expand_path fix Raphaël Beamonte
2013-11-23 22:32 ` [lttng-dev] [lttng-tools PATCH 1/5] Add missing copyright to utils.c Raphaël Beamonte
2013-11-23 22:32 ` [lttng-dev] [lttng-tools PATCH 2/5] Fix: comment indentation Raphaël Beamonte
2013-11-23 22:32 ` [lttng-dev] [lttng-tools PATCH 3/5] Fix: utils_expand_path now works for paths that ends with '/.' or '/..' Raphaël Beamonte
2013-11-23 22:32 ` [lttng-dev] [lttng-tools PATCH 4/5] Tests: add symlink tests for test_utils_expand_path Raphaël Beamonte
2013-11-23 22:32 ` [lttng-dev] [lttng-tools PATCH 5/5] Tests: add valid test cases to test_utils_expand_path Raphaël Beamonte
2013-11-25 15:51 ` [lttng-dev] [lttng-tools PATCH 0/5] utils_expand_path fix David Goulet
2013-11-13 5:34 ` [lttng-dev] [lttng-tools PATCH 4/4] Tests: Add test_utils_expand_path to unit tests Raphaël Beamonte
2013-11-13 21:28 ` [lttng-dev] [lttng-tools PATCH 0/4] Update to utils_expand_path as realpath(3) for non-existing directories David Goulet
2013-11-08 4:32 ` [lttng-dev] [lttng-tools PATCH 2/2] Correct the behavior of the utils_expand_path function Raphaël Beamonte
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=647704866.66921.1384397059144.JavaMail.zimbra@efficios.com \
--to=mathieu.desnoyers@efficios.com \
/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