From 5de083f4c3851c851906c68d92426dbc9c27cbb2 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Rapha=C3=ABl=20Beamonte?= Date: Sat, 23 Nov 2013 17:32:26 -0500 Subject: [PATCH] Fix: utils_expand_path now works for paths that ends with '/.' or '/..' MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Cases where the path given ended with '/.' or '/..' were not handled properly using the utils_expand_path function and the resulting path was still showing this end part. This fix aims to treat that last part and 'expand' it as expected. Signed-off-by: Raphaël Beamonte --- src/common/utils.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/common/utils.c b/src/common/utils.c index 330c04e82..ce25f232d 100644 --- a/src/common/utils.c +++ b/src/common/utils.c @@ -178,6 +178,8 @@ LTTNG_HIDDEN char *utils_expand_path(const char *path) { char *next, *previous, *slash, *start_path, *absolute_path = NULL; + char *last_token; + int is_dot, is_dotdot; /* Safety net */ if (path == NULL) { @@ -241,6 +243,31 @@ char *utils_expand_path(const char *path) absolute_path, PATH_MAX); } + /* Identify the last token */ + last_token = strrchr(absolute_path, '/'); + + /* Verify that this token is not a relative path */ + is_dotdot = (strcmp(last_token, "/..") == 0); + is_dot = (strcmp(last_token, "/.") == 0); + + /* If it is, take action */ + if (is_dot || is_dotdot) { + /* For both, remove this token */ + *last_token = '\0'; + + /* If it was a reference to parent directory, go back one more time */ + if (is_dotdot) { + last_token = strrchr(absolute_path, '/'); + + /* If there was only one level left, we keep the first '/' */ + if (last_token == absolute_path) { + last_token++; + } + + *last_token = '\0'; + } + } + return absolute_path; error: -- 2.34.1