diff options
author | Roland C. Dowdeswell <roland.dowdeswell@twosigma.com> | 2018-05-09 00:39:11 -0400 |
---|---|---|
committer | Nico Williams <nico@cryptonector.com> | 2018-05-11 19:32:25 -0500 |
commit | 90bc29c1b544c0436ec44246e180fdbb6d6384df (patch) | |
tree | d8c53a6402e50e2e2f15087bac88935fb13f6e44 | |
parent | 7fd9e86ea694bcfc3cb8472d43c93626febd45cd (diff) |
jv_file.c: check to see if the file is a directory and fail
Not all stdio implementations disallow one to open a directory with
fopen(3) and so we specifically check for directories as it is also
in the standard search path.
-rw-r--r-- | src/jv_file.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/src/jv_file.c b/src/jv_file.c index 4c0060fc..b10bcc0b 100644 --- a/src/jv_file.c +++ b/src/jv_file.c @@ -1,16 +1,33 @@ +#include <sys/stat.h> #include <errno.h> +#include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <unistd.h> #include "jv.h" #include "jv_unicode.h" jv jv_load_file(const char* filename, int raw) { - FILE* file = fopen(filename, "r"); + struct stat sb; + int fd = open(filename, O_RDONLY); + if (fd == -1) { + return jv_invalid_with_msg(jv_string_fmt("Could not open %s: %s", + filename, + strerror(errno))); + } + if (fstat(fd, &sb) == -1 || S_ISDIR(sb.st_mode)) { + close(fd); + return jv_invalid_with_msg(jv_string_fmt("Could not open %s: %s", + filename, + "It's a directory")); + } + FILE* file = fdopen(fd, "r"); struct jv_parser* parser = NULL; jv data; if (!file) { + close(fd); return jv_invalid_with_msg(jv_string_fmt("Could not open %s: %s", filename, strerror(errno))); |