Be more careful with fread in various places. v2.13.88
authorCarl Hetherington <cth@carlh.net>
Wed, 19 Dec 2018 23:10:34 +0000 (23:10 +0000)
committerCarl Hetherington <cth@carlh.net>
Wed, 19 Dec 2018 23:10:34 +0000 (23:10 +0000)
src/lib/image_examiner.cc
src/lib/reel_writer.cc
src/lib/util.cc
src/lib/util.h

index 26beeb36399c3efd2b61c662ece72154838a67a5..775a69eebac4779b69226f7a8f408f9ad19d43c2 100644 (file)
@@ -53,7 +53,7 @@ ImageExaminer::ImageExaminer (shared_ptr<const Film> film, shared_ptr<const Imag
                        throw FileError ("Could not open file for reading", path);
                }
                uint8_t* buffer = new uint8_t[size];
-               fread (buffer, 1, size, f);
+               checked_fread (buffer, size, f, path);
                fclose (f);
                try {
                        _video_size = dcp::decompress_j2k (buffer, size, 0)->size ();
index 350120d9d1ceebe61576204b615224e8a59d8316..f645d6eb5106360de2b84bbcaa76babde5e4f439 100644 (file)
@@ -154,11 +154,11 @@ ReelWriter::read_frame_info (FILE* file, Frame frame, Eyes eyes) const
 {
        dcp::FrameInfo info;
        dcpomatic_fseek (file, frame_info_position (frame, eyes), SEEK_SET);
-       fread (&info.offset, sizeof (info.offset), 1, file);
-       fread (&info.size, sizeof (info.size), 1, file);
+       checked_fread (&info.offset, sizeof(info.offset), file, _film->info_file(_period));
+       checked_fread (&info.size, sizeof(info.size), file, _film->info_file(_period));
 
        char hash_buffer[33];
-       fread (hash_buffer, 1, 32, file);
+       checked_fread (hash_buffer, 32, file, _film->info_file(_period));
        hash_buffer[32] = '\0';
        info.hash = hash_buffer;
 
index 051a4bb25ec9e0b84fe6aa0d890ed4bf6f88f469..5eba8d73a0f214f07339998c9a6c4543f5f86e2f 100644 (file)
@@ -444,7 +444,7 @@ digest_head_tail (vector<boost::filesystem::path> files, boost::uintmax_t size)
                }
 
                boost::uintmax_t this_time = min (to_do, boost::filesystem::file_size (files[i]));
-               fread (p, 1, this_time, f);
+               checked_fread (p, this_time, f, files[i]);
                p += this_time;
                to_do -= this_time;
                fclose (f);
@@ -465,7 +465,7 @@ digest_head_tail (vector<boost::filesystem::path> files, boost::uintmax_t size)
 
                boost::uintmax_t this_time = min (to_do, boost::filesystem::file_size (files[i]));
                dcpomatic_fseek (f, -this_time, SEEK_END);
-               fread (p, 1, this_time, f);
+               checked_fread (p, this_time, f, files[i]);
                p += this_time;
                to_do -= this_time;
                fclose (f);
@@ -782,3 +782,16 @@ increment_eyes (Eyes e)
 
        return EYES_LEFT;
 }
+
+void
+checked_fread (void* ptr, size_t size, FILE* stream, boost::filesystem::path path)
+{
+       size_t N = fread (ptr, 1, size, stream);
+       if (N != size) {
+               if (ferror(stream)) {
+                       throw FileError (String::compose("fread error %1", errno), path);
+               } else {
+                       throw FileError ("Unexpected short read", path);
+               }
+       }
+}
index d6fddcddafb7eac2b79422a49d1769da96260539..f62b2c4925e89b2df9152b8afccaf4b0d268165c 100644 (file)
@@ -98,5 +98,6 @@ extern std::string careful_string_filter (std::string);
 extern std::pair<int, int> audio_channel_types (std::list<int> mapped, int channels);
 extern boost::shared_ptr<AudioBuffers> remap (boost::shared_ptr<const AudioBuffers> input, int output_channels, AudioMapping map);
 extern Eyes increment_eyes (Eyes e);
+extern void checked_fread (void* ptr, size_t size, FILE* stream, boost::filesystem::path path);
 
 #endif