about summary refs log tree commit diff
path: root/converter
diff options
context:
space:
mode:
Diffstat (limited to 'converter')
-rw-r--r--converter/other/cameratopam/camera.c4
-rw-r--r--converter/other/cameratopam/stdio_nofail.c41
-rw-r--r--converter/other/cameratopam/stdio_nofail.h6
3 files changed, 42 insertions, 9 deletions
diff --git a/converter/other/cameratopam/camera.c b/converter/other/cameratopam/camera.c
index 3b29d1ac..4610462c 100644
--- a/converter/other/cameratopam/camera.c
+++ b/converter/other/cameratopam/camera.c
@@ -450,7 +450,7 @@ rollei_load_raw(Image const image) {
   unsigned iten=0, isix, i, buffer=0, row, col, todo[16];
 
   isix = raw_width * raw_height * 5 / 8;
-  while (fread_nofail (pixel, 1, 10, ifp) == 10) {
+  while (fread_or_eof_nofail (pixel, 1, 10, ifp) == 10) {
     for (i=0; i < 10; i+=2) {
       todo[i]   = iten++;
       todo[i+1] = pixel[i] << 8 | pixel[i+1];
@@ -784,7 +784,7 @@ fill_input_buffer (j_decompress_ptr cinfo)
   static char jpeg_buffer[4096];
   size_t nbytes;
 
-  nbytes = fread_nofail (jpeg_buffer, 1, 4096, ifp);
+  nbytes = fread_or_eof_nofail (jpeg_buffer, 1, 4096, ifp);
   swab (jpeg_buffer, jpeg_buffer, nbytes);
   cinfo->src->next_input_byte = jpeg_buffer;
   cinfo->src->bytes_in_buffer = nbytes;
diff --git a/converter/other/cameratopam/stdio_nofail.c b/converter/other/cameratopam/stdio_nofail.c
index 683d068a..97a8796d 100644
--- a/converter/other/cameratopam/stdio_nofail.c
+++ b/converter/other/cameratopam/stdio_nofail.c
@@ -9,6 +9,26 @@
 
 
 size_t
+fread_or_eof_nofail(void * const ptr,
+                    size_t const size,
+                    size_t const nmemb,
+                    FILE * const streamP) {
+
+    size_t rc;
+
+    rc = fread(ptr, size, nmemb, streamP);
+
+    if (rc < nmemb) {
+        if (!feof(streamP))
+            pm_error("File read failed.  Errno=%d (%s)",
+                     errno, strerror(errno));
+    }
+    return rc;
+}
+
+
+
+void
 fread_nofail(void * const ptr,
              size_t const size,
              size_t const nmemb,
@@ -18,10 +38,13 @@ fread_nofail(void * const ptr,
 
     rc = fread(ptr, size, nmemb, streamP);
 
-    if (rc < 0)
-        pm_error("File read failed.  Errno=%d (%s)", errno, strerror(errno));
-
-    return rc;
+    if (rc < nmemb) {
+        if (feof(streamP))
+            pm_error("File read failed.  Premature end of file");
+        else
+            pm_error("File read failed.  Errno=%d (%s)",
+                     errno, strerror(errno));
+    }
 }
 
 
@@ -33,9 +56,13 @@ fgetc_nofail(FILE * streamP) {
 
     rc = fgetc(streamP);
 
-    if (rc < 0)
-        pm_error("File read failed.  Errno=%d (%s)", errno, strerror(errno));
-
+    if (rc == EOF) {
+        if (feof(streamP))
+            pm_error("File read failed.  Premature end of file");
+        else
+            pm_error("File read failed.  Errno=%d (%s)",
+                     errno, strerror(errno));
+    }
     return rc;
 }
 
diff --git a/converter/other/cameratopam/stdio_nofail.h b/converter/other/cameratopam/stdio_nofail.h
index f220b4ac..8f45b537 100644
--- a/converter/other/cameratopam/stdio_nofail.h
+++ b/converter/other/cameratopam/stdio_nofail.h
@@ -1,6 +1,12 @@
 #include <stdio.h>
 
 size_t
+fread_or_eof_nofail(void * const ptr,
+                    size_t const size,
+                    size_t const nmemb,
+                    FILE * const streamP);
+
+void
 fread_nofail(void * const ptr,
              size_t const size,
              size_t const nmemb,