summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2018-12-19 23:10:34 +0000
committerCarl Hetherington <cth@carlh.net>2018-12-19 23:10:34 +0000
commit05d90a3edda9c1f5e7499f0ce7b6617fe46ac54d (patch)
tree40c6b693a9d89a2b4e7647f1bd2647cf2442b3e5
parentd60fd90a6e13c727a05b629c8c4b93d4bf3b717b (diff)
Be more careful with fread in various places.v2.13.88
-rw-r--r--src/lib/image_examiner.cc2
-rw-r--r--src/lib/reel_writer.cc6
-rw-r--r--src/lib/util.cc17
-rw-r--r--src/lib/util.h1
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<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 ();
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<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);
+ }
+ }
+}
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<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