diff --git a/runtime/internal/adi.d b/runtime/internal/adi.d index 42af8035..5a45b8df 100644 --- a/runtime/internal/adi.d +++ b/runtime/internal/adi.d @@ -63,6 +63,7 @@ private extern (C) char[] _adReverseChar(char[] a) { + bool hadErrors = false; if (a.length > 1) { char[6] tmp; @@ -86,24 +87,31 @@ extern (C) char[] _adReverseChar(char[] a) } 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 @@ extern (C) char[] _adReverseChar(char[] a) hi = hi - 1 + (stridehi - stridelo); } } + if (hadErrors) + throw new Exception("invalid UTF-8 sequence",__FILE__,__LINE__); return a; } @@ -161,6 +171,7 @@ unittest extern (C) wchar[] _adReverseWchar(wchar[] a) { + bool hadErrors = false; if (a.length > 1) { wchar[2] tmp; @@ -188,10 +199,13 @@ extern (C) wchar[] _adReverseWchar(wchar[] a) { 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 @@ extern (C) wchar[] _adReverseWchar(wchar[] a) hi = hi - 1 + (stridehi - stridelo); } } + if (hadErrors) + throw new Exception("invalid UTF-8 sequence",__FILE__,__LINE__); return a; }