|
|
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)
|