X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Futils.c;h=52fb25dbe7202a3af44d1548ea1b021b2ad7ee65;hp=2f4ec903a2f9b849f1d0c32121400dfda5368844;hb=77e7fddf47ca285c4d4d161745ddaf2bca6b46b2;hpb=9482daac152865fcc4c2609ce89a2de473abc138 diff --git a/src/common/utils.c b/src/common/utils.c index 2f4ec903a..52fb25dbe 100644 --- a/src/common/utils.c +++ b/src/common/utils.c @@ -24,7 +24,6 @@ #include #include #include -#include #include #include #include @@ -37,6 +36,7 @@ #include #include #include +#include #include "utils.h" #include "defaults.h" @@ -92,9 +92,9 @@ char *utils_partial_realpath(const char *path, char *resolved_path, size_t size) } /* Cut the part we will be trying to resolve */ - cut_path = strndup(path, next - path); + cut_path = lttng_strndup(path, next - path); if (cut_path == NULL) { - PERROR("strndup"); + PERROR("lttng_strndup"); goto error; } @@ -124,7 +124,8 @@ char *utils_partial_realpath(const char *path, char *resolved_path, size_t size) /* Free the allocated memory */ free(cut_path); - }; + cut_path = NULL; + } /* Allocate memory for the resolved path if necessary */ if (resolved_path == NULL) { @@ -161,6 +162,8 @@ char *utils_partial_realpath(const char *path, char *resolved_path, size_t size) /* Free the allocated memory */ free(cut_path); free(try_path_prev); + cut_path = NULL; + try_path_prev = NULL; /* * Else, we just copy the path in our resolved_path to * return it as is @@ -227,9 +230,9 @@ char *utils_expand_path(const char *path) while ((next = strstr(absolute_path, "/./"))) { /* We prepare the start_path not containing it */ - start_path = strndup(absolute_path, next - absolute_path); + start_path = lttng_strndup(absolute_path, next - absolute_path); if (!start_path) { - PERROR("strndup"); + PERROR("lttng_strndup"); goto error; } /* And we concatenate it with the part after this string */ @@ -247,9 +250,9 @@ char *utils_expand_path(const char *path) } /* Then we prepare the start_path not containing it */ - start_path = strndup(absolute_path, previous - absolute_path); + start_path = lttng_strndup(absolute_path, previous - absolute_path); if (!start_path) { - PERROR("strndup"); + PERROR("lttng_strndup"); goto error; } @@ -501,11 +504,13 @@ int utils_create_lock_file(const char *filepath) { int ret; int fd; + struct flock lock; assert(filepath); - fd = open(filepath, O_CREAT, - O_WRONLY | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP); + memset(&lock, 0, sizeof(lock)); + fd = open(filepath, O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR | + S_IRGRP | S_IWGRP); if (fd < 0) { PERROR("open lock file %s", filepath); ret = -1; @@ -517,8 +522,12 @@ int utils_create_lock_file(const char *filepath) * already a process using the same lock file running * and we should exit. */ - ret = flock(fd, LOCK_EX | LOCK_NB); - if (ret) { + lock.l_whence = SEEK_SET; + lock.l_type = F_WRLCK; + + ret = fcntl(fd, F_SETLK, &lock); + if (ret == -1) { + PERROR("fcntl lock file"); ERR("Could not get lock file %s, another instance is running.", filepath); if (close(fd)) { @@ -1194,6 +1203,7 @@ LTTNG_HIDDEN int utils_recursive_rmdir(const char *path) { DIR *dir; + size_t path_len; int dir_fd, ret = 0, closeret, is_empty = 1; struct dirent *entry; @@ -1209,13 +1219,34 @@ int utils_recursive_rmdir(const char *path) return -1; } + path_len = strlen(path); while ((entry = readdir(dir))) { if (!strcmp(entry->d_name, ".") || !strcmp(entry->d_name, "..")) continue; - switch (entry->d_type) { - case DT_DIR: - { + + struct stat st; + size_t name_len; + char filename[PATH_MAX]; + + name_len = strlen(entry->d_name); + if (path_len + name_len + 2 > sizeof(filename)) { + ERR("Failed to remove file: path name too long (%s/%s)", + path, entry->d_name); + continue; + } + if (snprintf(filename, sizeof(filename), "%s/%s", + path, entry->d_name) < 0) { + ERR("Failed to format path."); + continue; + } + + if (stat(filename, &st)) { + PERROR("stat"); + continue; + } + + if (S_ISDIR(st.st_mode)) { char subpath[PATH_MAX]; strncpy(subpath, path, PATH_MAX); @@ -1227,12 +1258,9 @@ int utils_recursive_rmdir(const char *path) if (utils_recursive_rmdir(subpath)) { is_empty = 0; } - break; - } - case DT_REG: + } else if (S_ISREG(st.st_mode)) { is_empty = 0; - break; - default: + } else { ret = -EINVAL; goto end; }