@@ -23,27 +23,80 @@ json read_json(const std::string& filename) {
2323#ifdef _WIN32
2424 HANDLE file = CreateFileA (filename.c_str (), GENERIC_READ , FILE_SHARE_READ ,
2525 NULL , OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL );
26+ if (file == INVALID_HANDLE_VALUE ) {
27+ throw std::runtime_error (" Cannot open file: " + filename);
28+ }
29+
30+ DWORD size = GetFileSize (file, NULL );
31+ if (size == 0 ) {
32+ CloseHandle (file);
33+ throw std::runtime_error (" File is empty: " + filename);
34+ }
35+
2636 HANDLE mapping = CreateFileMapping (file, NULL , PAGE_READONLY , 0 , 0 , NULL );
37+ if (mapping == NULL ) {
38+ CloseHandle (file);
39+ throw std::runtime_error (" Cannot create file mapping: " + filename);
40+ }
41+
2742 char * data = (char *)MapViewOfFile (mapping, FILE_MAP_READ , 0 , 0 , 0 );
28- size_t size = GetFileSize (file, NULL );
43+ if (data == NULL ) {
44+ CloseHandle (mapping);
45+ CloseHandle (file);
46+ throw std::runtime_error (" Cannot map view of file: " + filename);
47+ }
2948
30- json result = json::parse (data, data + size);
49+ json result;
50+ try {
51+ result = json::parse (data, data + size);
52+ } catch (...) {
53+ UnmapViewOfFile (data);
54+ CloseHandle (mapping);
55+ CloseHandle (file);
56+ throw ;
57+ }
3158
3259 UnmapViewOfFile (data);
3360 CloseHandle (mapping);
3461 CloseHandle (file);
62+ return result;
63+
3564#else
3665 int fd = open (filename.c_str (), O_RDONLY );
66+ if (fd == -1 ) {
67+ throw std::runtime_error (" Cannot open file: " + filename);
68+ }
69+
3770 struct stat sb;
38- fstat (fd, &sb);
71+ if (fstat (fd, &sb) == -1 ) {
72+ close (fd);
73+ throw std::runtime_error (" Cannot stat file: " + filename);
74+ }
75+
76+ if (sb.st_size == 0 ) {
77+ close (fd);
78+ throw std::runtime_error (" File is empty: " + filename);
79+ }
80+
3981 char * data = (char *)mmap (NULL , sb.st_size , PROT_READ , MAP_PRIVATE , fd, 0 );
82+ if (data == MAP_FAILED ) {
83+ close (fd);
84+ throw std::runtime_error (" Cannot mmap file: " + filename);
85+ }
4086
41- json result = json::parse (data, data + sb.st_size );
87+ json result;
88+ try {
89+ result = json::parse (data, data + sb.st_size );
90+ } catch (...) {
91+ munmap (data, sb.st_size );
92+ close (fd);
93+ throw ;
94+ }
4295
4396 munmap (data, sb.st_size );
4497 close (fd);
45- #endif
4698 return result;
99+ #endif
47100}
48101
49102void extract_values_from_json (const json& j, std::vector<float >& values) {
0 commit comments