From 6cad09ec9c801e90d41f53ebcd673ef89050cc86 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Fri, 11 Feb 2022 17:41:33 +0100 Subject: Check if file to read is really a file --- src/std/file.c | 28 +++++++++++++++------------- src/std/hash_map.c | 3 +++ 2 files changed, 18 insertions(+), 13 deletions(-) (limited to 'src/std') diff --git a/src/std/file.c b/src/std/file.c index 4542aba..d486843 100644 --- a/src/std/file.c +++ b/src/std/file.c @@ -28,10 +28,8 @@ static int scan_dir_recursive_internal(char *dir_path, int path_length, scan_dir path_length_start = path_length; if((dir = opendir(dir_path)) == NULL) { - int error; - error = errno; amal_log_perror("scan_dir_recursive"); - return error; + return -1; } while((entry = readdir(dir)) != NULL) { @@ -178,9 +176,16 @@ int read_whole_file(const char *filepath, Buffer *data_result) { file = fopen(filepath, "rb"); if(!file) { - int error = errno; - amal_log_error("read_whole_file: %s failed, error: %s", filepath, strerror(error)); - return error; + amal_log_error("read_whole_file: %s failed, error: %s", filepath, strerror(errno)); + return -1; + } + + int fd = fileno(file); + struct stat s; + if(fstat(fd, &s) == -1 || !S_ISREG(s.st_mode)) { + amal_log_error("read_whole_file: %s failed, error: attempted to read a non-file", filepath); + fclose(file); + return -1; } result = fseek(file, 0, SEEK_END); @@ -191,9 +196,8 @@ int read_whole_file(const char *filepath, Buffer *data_result) { size = ftell(file); if(size == -1) { - int error = errno; - result = error; - amal_log_error("read_whole_file: %s failed, error: %s", filepath, strerror(error)); + result = -1; + amal_log_error("read_whole_file: %s failed, error: %s", filepath, strerror(errno)); goto cleanup; } @@ -223,10 +227,8 @@ int read_whole_file(const char *filepath, Buffer *data_result) { int file_get_canonical_path(const char *filepath, char **result_path, usize *result_path_size) { char result_path_tmp[PATH_MAX]; if(!realpath(filepath, result_path_tmp)) { - int ret; - ret = errno; - amal_log_error("file_get_canonical_path: realpath failed for path %s, error: %s", filepath, strerror(ret)); - return ret; + amal_log_error("file_get_canonical_path: realpath failed for path %s, error: %s", filepath, strerror(errno)); + return -1; } *result_path_size = strnlen(result_path_tmp, PATH_MAX); return_if_error(am_malloc(*result_path_size + 1, (void**)result_path)); diff --git a/src/std/hash_map.c b/src/std/hash_map.c index b4bd4c1..4bf55c6 100644 --- a/src/std/hash_map.c +++ b/src/std/hash_map.c @@ -224,6 +224,9 @@ bool hash_map_get_ref(HashMap *self, BufferView key, void **value) { HashMapBucketNode *bucket_node; bucket_size = buffer_get_size(&self->buckets, HashMapBucket); + if(bucket_size == 0) + return bool_false; + hash = self->hash_func((const u8*)key.data, key.size); bucket_index = hash % bucket_size; -- cgit v1.2.3