Index: kjs/function.cpp =================================================================== --- kjs/function.cpp (revision 495921) +++ kjs/function.cpp (working copy) @@ -77,7 +77,8 @@ UString encodeURI(ExecState *exec, UStri } else if (C.uc >= 0xD800 && C.uc <= 0xDBFF) { - if (k == string.size()) { + // we need two chars + if (k + 1 >= string.size()) { Object err = Error::create(exec,URIError); exec->setException(err); free(encbuf); @@ -197,6 +198,10 @@ UString decodeURI(ExecState *exec, UStri } k += 2; + + if (decbufLen+2 >= decbufAlloc) + decbuf = (UChar*)realloc(decbuf,(decbufAlloc *= 2)*sizeof(UChar)); + if ((B & 0x80) == 0) { // Single-byte character C = B; @@ -257,6 +262,12 @@ UString decodeURI(ExecState *exec, UStri assert(n == 4); unsigned long uuuuu = ((octets[0] & 0x07) << 2) | ((octets[1] >> 4) & 0x03); unsigned long vvvv = uuuuu-1; + if (vvvv > 0x0F) { + Object err = Error::create(exec,URIError); + exec->setException(err); + free(decbuf); + return UString(); + } unsigned long wwww = octets[1] & 0x0F; unsigned long xx = (octets[2] >> 4) & 0x03; unsigned long yyyy = octets[2] & 0x0F; @@ -270,9 +281,7 @@ UString decodeURI(ExecState *exec, UStri } if (reservedSet.find(C) < 0) { - if (decbufLen+1 >= decbufAlloc) - decbuf = (UChar*)realloc(decbuf,(decbufAlloc *= 2)*sizeof(UChar)); - decbuf[decbufLen++] = C; + decbuf[decbufLen++] = C; } else { while (decbufLen+k-start >= decbufAlloc)