[libbluray-devel] file_posix: fixed integer overflows and problems with signed -> unsigned conversions.

hpi1 git at videolan.org
Mon Jan 21 13:02:35 CET 2013


libbluray | branch: master | hpi1 <hpi1 at anonymous.org> | Mon Jan 21 13:15:33 2013 +0200| [911b58082a5f9dbb16c1f3b246ec6ddf8ba0365c] | committer: hpi1

file_posix: fixed integer overflows and problems with signed -> unsigned conversions.
Be noisy when someone tries to read/write with invalid size.

> http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=911b58082a5f9dbb16c1f3b246ec6ddf8ba0365c
---

 src/file/file_posix.c |   17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/src/file/file_posix.c b/src/file/file_posix.c
index 1016b24..7697a72 100644
--- a/src/file/file_posix.c
+++ b/src/file/file_posix.c
@@ -33,6 +33,7 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <inttypes.h>
 
 #ifdef WIN32
 #include <windows.h>
@@ -74,14 +75,26 @@ static int file_eof_linux(BD_FILE_H *file)
     return feof((FILE *)file->internal);
 }
 
+#define BD_MAX_SSIZE ((int64_t)(((size_t)-1)>>1))
+
 static int64_t file_read_linux(BD_FILE_H *file, uint8_t *buf, int64_t size)
 {
-    return fread(buf, 1, size, (FILE *)file->internal);
+    if (size > 0 && size < BD_MAX_SSIZE) {
+        return (int64_t)fread(buf, 1, (size_t)size, (FILE *)file->internal);
+    }
+
+    BD_DEBUG(DBG_FILE | DBG_CRIT, "Ignoring invalid read of size %"PRId64" (%p)\n", size, file);
+    return 0;
 }
 
 static int64_t file_write_linux(BD_FILE_H *file, const uint8_t *buf, int64_t size)
 {
-    return fwrite(buf, 1, size, (FILE *)file->internal);
+    if (size > 0 && size < BD_MAX_SSIZE) {
+        return (int64_t)fwrite(buf, 1, (size_t)size, (FILE *)file->internal);
+    }
+
+    BD_DEBUG(DBG_FILE | DBG_CRIT, "Ignoring invalid write of size %"PRId64" (%p)\n", size, file);
+    return 0;
 }
 
 static BD_FILE_H *file_open_linux(const char* filename, const char *mode)



More information about the libbluray-devel mailing list