diff runtime/internal/adi.d @ 855:e78e1d559a76

Apply fix for #151.
author Christian Kamm <kamm incasoftware de>
date Mon, 15 Dec 2008 21:09:33 +0100
parents a26b0c5d5942
children
line wrap: on
line diff
--- a/runtime/internal/adi.d	Sun Dec 14 17:53:20 2008 +0100
+++ b/runtime/internal/adi.d	Mon Dec 15 21:09:33 2008 +0100
@@ -63,6 +63,7 @@
 
 extern (C) char[] _adReverseChar(char[] a)
 {
+    bool hadErrors = false;
     if (a.length > 1)
     {
         char[6] tmp;
@@ -86,24 +87,31 @@
             }
 
             uint stridelo = UTF8stride[clo];
-            // don't barf on invalid strides, just ignore it
-            if (stridelo == 0xFF)
-                stridelo = 1;
+            if (stridelo > 6) { // invalid UTF-8 0xFF 
+                stridelo = 1; 
+                hadErrors=true;
+            }
 
             uint stridehi = 1;
-            while ((chi & 0xC0) == 0x80)
+            while ((chi & 0xC0) == 0x80 && hi >= lo)
             {
                 chi = *--hi;
                 stridehi++;
-                assert(hi >= lo);
             }
-            if (lo == hi)
+            if (lo >= hi) {
+                if (lo > hi) {
+                    hadErrors = true;
+                }
                 break;
+            }
+            if (stridehi > 6) {
+                hadErrors = true;
+                stridehi = 6;
+            }
 
 	    debug(adi) printf("\tstridelo = %d, stridehi = %d\n", stridelo, stridehi);
             if (stridelo == stridehi)
             {
-
                 memcpy(tmp.ptr, lo, stridelo);
                 memcpy(lo, hi, stridelo);
                 memcpy(hi, tmp.ptr, stridelo);
@@ -124,6 +132,8 @@
             hi = hi - 1 + (stridehi - stridelo);
         }
     }
+    if (hadErrors)
+        throw new Exception("invalid UTF-8 sequence",__FILE__,__LINE__);
     return a;
 }
 
@@ -161,6 +171,7 @@
 
 extern (C) wchar[] _adReverseWchar(wchar[] a)
 {
+    bool hadErrors = false;
     if (a.length > 1)
     {
         wchar[2] tmp;
@@ -188,10 +199,13 @@
             {
                 chi = *--hi;
                 stridehi++;
-                assert(hi >= lo);
             }
-            if (lo == hi)
+            if (lo >= hi) {
+                if (lo > hi) {
+                    hadErrors = true;
+                }
                 break;
+            }
 
             if (stridelo == stridehi)
             {   int stmp;
@@ -217,6 +231,8 @@
             hi = hi - 1 + (stridehi - stridelo);
         }
     }
+    if (hadErrors)
+        throw new Exception("invalid UTF-8 sequence",__FILE__,__LINE__);
     return a;
 }