Mercurial > projects > ldc
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; }