summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoland C. Dowdeswell <roland.dowdeswell@twosigma.com>2018-05-09 00:39:11 -0400
committerNico Williams <nico@cryptonector.com>2018-05-11 19:32:25 -0500
commit90bc29c1b544c0436ec44246e180fdbb6d6384df (patch)
treed8c53a6402e50e2e2f15087bac88935fb13f6e44
parent7fd9e86ea694bcfc3cb8472d43c93626febd45cd (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.c19
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)));