+54
-2
@@ -345,11 +345,63 @@ ParallelScanner* parallel_scanner_create(char* root_directory, bool use_metadata
|
|||||||
char* cur_path = path_cat(root_directory, entry->d_name);
|
char* cur_path = path_cat(root_directory, entry->d_name);
|
||||||
if (!cur_path)
|
if (!cur_path)
|
||||||
continue;
|
continue;
|
||||||
struct stat st;
|
struct stat lstats;
|
||||||
if (stat(cur_path, &st) != 0) {
|
if (lstat(cur_path, &lstats) != 0) {
|
||||||
free(cur_path);
|
free(cur_path);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
bool is_symlink = S_ISLNK(lstats.st_mode);
|
||||||
|
|
||||||
|
// Skip symlinks unless the user explicitly enabled following/copying them.
|
||||||
|
if (is_symlink && !follow_symlinks && !copy_links && !safe_links &&
|
||||||
|
!copy_unsafe_links) {
|
||||||
|
free(cur_path);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --safe-links: reject symlinks pointing outside the source tree.
|
||||||
|
if (is_symlink && safe_links) {
|
||||||
|
char link_target[4096];
|
||||||
|
ssize_t len = readlink(cur_path, link_target, sizeof(link_target) - 1);
|
||||||
|
if (len < 0) {
|
||||||
|
free(cur_path);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
link_target[len] = ' | ||||||