Report an error if the file is too large. (#315275, Kjartan Maraas)
authorMatthias Clasen <mclasen@redhat.com>
Mon, 5 Sep 2005 18:20:24 +0000 (18:20 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Mon, 5 Sep 2005 18:20:24 +0000 (18:20 +0000)
2005-09-05  Matthias Clasen  <mclasen@redhat.com>

* glib/gmappedfile.c (g_mapped_file_new): Report an error
if the file is too large.  (#315275, Kjartan Maraas)

ChangeLog
ChangeLog.pre-2-10
ChangeLog.pre-2-12
glib/gmappedfile.c

index 9d3cc77..e1bc06b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2005-09-05  Matthias Clasen  <mclasen@redhat.com>
 
+       * glib/gmappedfile.c (g_mapped_file_new): Report an error
+       if the file is too large.  (#315275, Kjartan Maraas)
+
        * glib/gkeyfile.c (g_key_file_load_from_fd): The return value
        of read() is signed.  (#315273, Kjartan Maraas)
        
index 9d3cc77..e1bc06b 100644 (file)
@@ -1,5 +1,8 @@
 2005-09-05  Matthias Clasen  <mclasen@redhat.com>
 
+       * glib/gmappedfile.c (g_mapped_file_new): Report an error
+       if the file is too large.  (#315275, Kjartan Maraas)
+
        * glib/gkeyfile.c (g_key_file_load_from_fd): The return value
        of read() is signed.  (#315273, Kjartan Maraas)
        
index 9d3cc77..e1bc06b 100644 (file)
@@ -1,5 +1,8 @@
 2005-09-05  Matthias Clasen  <mclasen@redhat.com>
 
+       * glib/gmappedfile.c (g_mapped_file_new): Report an error
+       if the file is too large.  (#315275, Kjartan Maraas)
+
        * glib/gkeyfile.c (g_key_file_load_from_fd): The return value
        of read() is signed.  (#315273, Kjartan Maraas)
        
index 2321ee6..9935356 100644 (file)
@@ -140,10 +140,17 @@ g_mapped_file_new (const gchar  *filename,
   file->contents = MAP_FAILED;
 
 #ifdef HAVE_MMAP
-  file->length = st.st_size;
-  file->contents = (gchar *) mmap (NULL, st.st_size,
-                                  writable ? PROT_READ|PROT_WRITE : PROT_READ,
-                                  MAP_PRIVATE, fd, 0);
+  if (st.st_size > G_MAXSIZE)
+    {
+      errno = EINVAL;
+    }
+  else
+    {      
+      file->length = (gsize) st.st_size;
+      file->contents = (gchar *) mmap (NULL,  file->length,
+                                      writable ? PROT_READ|PROT_WRITE : PROT_READ,
+                                      MAP_PRIVATE, fd, 0);
+    }
 #endif
 #ifdef G_OS_WIN32
   file->length = st.st_size;