X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Futils.c;h=ce25f232d5209b7c08b644ce21a7fa526d70a244;hb=5de083f4c3851c851906c68d92426dbc9c27cbb2;hp=2f93cbe7323518bc78a763342215af39857aa3e6;hpb=635eb1df606e714f3d5cdded93b9c663b0e8e4c3;p=lttng-tools.git diff --git a/src/common/utils.c b/src/common/utils.c index 2f93cbe73..ce25f232d 100644 --- a/src/common/utils.c +++ b/src/common/utils.c @@ -1,5 +1,6 @@ /* * Copyright (C) 2012 - David Goulet + * Copyright (C) 2013 - Raphaël Beamonte * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License, version 2 only, as @@ -177,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) { @@ -197,7 +200,7 @@ char *utils_expand_path(const char *path) if (*path != '/' && strncmp(path, "./", 2) != 0 && strncmp(path, "../", 3) != 0) { snprintf(absolute_path, PATH_MAX, "./%s", path); - /* Else, we just copy the path */ + /* Else, we just copy the path */ } else { strncpy(absolute_path, path, PATH_MAX); } @@ -240,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: