From 05d90a3edda9c1f5e7499f0ce7b6617fe46ac54d Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 19 Dec 2018 23:10:34 +0000 Subject: [PATCH] Be more careful with fread in various places. --- src/lib/image_examiner.cc | 2 +- src/lib/reel_writer.cc | 6 +++--- src/lib/util.cc | 17 +++++++++++++++-- src/lib/util.h | 1 + 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/lib/image_examiner.cc b/src/lib/image_examiner.cc index 26beeb363..775a69eeb 100644 --- a/src/lib/image_examiner.cc +++ b/src/lib/image_examiner.cc @@ -53,7 +53,7 @@ ImageExaminer::ImageExaminer (shared_ptr film, shared_ptrsize (); diff --git a/src/lib/reel_writer.cc b/src/lib/reel_writer.cc index 350120d9d..f645d6eb5 100644 --- a/src/lib/reel_writer.cc +++ b/src/lib/reel_writer.cc @@ -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; diff --git a/src/lib/util.cc b/src/lib/util.cc index 051a4bb25..5eba8d73a 100644 --- a/src/lib/util.cc +++ b/src/lib/util.cc @@ -444,7 +444,7 @@ digest_head_tail (vector 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 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); + } + } +} diff --git a/src/lib/util.h b/src/lib/util.h index d6fddcdda..f62b2c492 100644 --- a/src/lib/util.h +++ b/src/lib/util.h @@ -98,5 +98,6 @@ extern std::string careful_string_filter (std::string); extern std::pair audio_channel_types (std::list mapped, int channels); extern boost::shared_ptr remap (boost::shared_ptr 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 -- 2.30.2