Handle symbolic links separately
All checks were successful
Run Unit Tests / build-and-run-unit-tests (push) Successful in 4s
All checks were successful
Run Unit Tests / build-and-run-unit-tests (push) Successful in 4s
Previous implementation could loop forever following a symbolic link that goes backwards. This commit makes symbolic links an "unhandled file type" for now.
This commit is contained in:
parent
c9df661cd3
commit
6ee347da12
1 changed files with 13 additions and 7 deletions
20
src/parser.c
20
src/parser.c
|
@ -23,8 +23,10 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "platforms.h"
|
#include "platforms.h"
|
||||||
#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
|
#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX || \
|
||||||
|
SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
|
#include <fcntl.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -252,8 +254,10 @@ SDArchiverLinkedList *simple_archiver_parsed_to_filenames(
|
||||||
SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
|
SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
|
||||||
for (char **iter = parsed->working_files; iter && *iter; ++iter) {
|
for (char **iter = parsed->working_files; iter && *iter; ++iter) {
|
||||||
struct stat st;
|
struct stat st;
|
||||||
stat(*iter, &st);
|
fstatat(AT_FDCWD, *iter, &st, AT_SYMLINK_NOFOLLOW);
|
||||||
if ((st.st_mode & S_IFMT) == S_IFREG) {
|
if ((st.st_mode & S_IFMT) == S_IFLNK) {
|
||||||
|
// Is a symbolic link. TODO handle this.
|
||||||
|
} else if ((st.st_mode & S_IFMT) == S_IFREG) {
|
||||||
// Is a regular file.
|
// Is a regular file.
|
||||||
int len = strlen(*iter) + 1;
|
int len = strlen(*iter) + 1;
|
||||||
char *filename = malloc(len);
|
char *filename = malloc(len);
|
||||||
|
@ -291,8 +295,10 @@ SDArchiverLinkedList *simple_archiver_parsed_to_filenames(
|
||||||
char *combined_path = malloc(combined_size);
|
char *combined_path = malloc(combined_size);
|
||||||
snprintf(combined_path, combined_size, "%s/%s", next,
|
snprintf(combined_path, combined_size, "%s/%s", next,
|
||||||
dir_entry->d_name);
|
dir_entry->d_name);
|
||||||
stat(combined_path, &st);
|
fstatat(AT_FDCWD, combined_path, &st, AT_SYMLINK_NOFOLLOW);
|
||||||
if ((st.st_mode & S_IFMT) == S_IFREG) {
|
if ((st.st_mode & S_IFMT) == S_IFLNK) {
|
||||||
|
// Is a symbolic link. TODO handle this.
|
||||||
|
} else if ((st.st_mode & S_IFMT) == S_IFREG) {
|
||||||
// Is a file.
|
// Is a file.
|
||||||
if (simple_archiver_hash_map_get(hash_map, combined_path,
|
if (simple_archiver_hash_map_get(hash_map, combined_path,
|
||||||
combined_size - 1) == NULL) {
|
combined_size - 1) == NULL) {
|
||||||
|
@ -308,7 +314,7 @@ SDArchiverLinkedList *simple_archiver_parsed_to_filenames(
|
||||||
// Is a directory.
|
// Is a directory.
|
||||||
simple_archiver_list_add_front(dir_list, combined_path, NULL);
|
simple_archiver_list_add_front(dir_list, combined_path, NULL);
|
||||||
} else {
|
} else {
|
||||||
// Unhandled type.
|
// Unhandled type. TODO handle this.
|
||||||
free(combined_path);
|
free(combined_path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -320,7 +326,7 @@ SDArchiverLinkedList *simple_archiver_parsed_to_filenames(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Unhandled type.
|
// Unhandled type. TODO handle this.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue