Changeset: 3994b577f3c4 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3994b577f3c4
Modified Files:
        MonetDB/src/gdk/gdk_storage.mx
Branch: Jun2010
Log Message:

detect address underrun to prevent segfaults in access_heap()


diffs (50 lines):

diff -r fcc6c41c10b6 -r 3994b577f3c4 MonetDB/src/gdk/gdk_storage.mx
--- a/MonetDB/src/gdk/gdk_storage.mx    Wed Aug 11 01:11:57 2010 +0200
+++ b/MonetDB/src/gdk/gdk_storage.mx    Wed Aug 11 01:27:21 2010 +0200
@@ -761,25 +761,31 @@
                   view and heap.base of views are not necessarily
                   aligned */
                size_t *lo = (size_t *) (((size_t) base + sizeof(size_t) - 1) & 
(~(sizeof(size_t) - 1)));
-               size_t *hi = (size_t *) (base + touch);
+               size_t *hi = (size_t *) (base + touch), *hi8 = NULL, hi1 = NULL;
                /* page size: [bytes] -> [sizeof(size_t)]
                 * to make sure we touch each page,
                 * not only 1 in sizeof(size_t) pages */
                page /= sizeof(size_t);
-               for (hi -= 8 * page; lo <= hi; lo += 8 * page) {
-                       /* try to trigger loading of multiple pages
-                          without blocking */
-                       v0 += lo[0 * page];
-                       v1 += lo[1 * page];
-                       v2 += lo[2 * page];
-                       v3 += lo[3 * page];
-                       v4 += lo[4 * page];
-                       v5 += lo[5 * page];
-                       v6 += lo[6 * page];
-                       v7 += lo[7 * page];
-               }
-               for (hi += 7 * page; lo <= hi; lo += page)
-                       v0 += *lo;
+               hi8 = hi - 8 * page;
+               hi1 = hi - page;
+               /* detect address underrun */
+               if (hi8 < hi)
+                       for (; lo <= hi8; lo += 8 * page) {
+                               /* try to trigger loading of multiple pages
+                                  without blocking */
+                               v0 += lo[0 * page];
+                               v1 += lo[1 * page];
+                               v2 += lo[2 * page];
+                               v3 += lo[3 * page];
+                               v4 += lo[4 * page];
+                               v5 += lo[5 * page];
+                               v6 += lo[6 * page];
+                               v7 += lo[7 * page];
+                       }
+               /* detect address underrun */
+               if (hi1 < hi)
+                       for (; lo <= hi1; lo += page)
+                               v0 += *lo;
        }
        IODEBUG THRprintf(GDKout,
                          "#BATpreload(%s->%s,preload=%d,sz=%dMB,touch=%dMB,%s) 
= %dms \n",
_______________________________________________
Checkin-list mailing list
Checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to