[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: branches/KDE/3.5/kdelibs/kjs
From: Harri Porten <porten () kde ! org>
Date: 2007-02-24 17:12:55
Message-ID: 1172337175.128042.29571.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 636908 by porten:
avoid syntax error on incomplete \u escapes in regexps.
M +7 -0 ChangeLog
M +26 -13 regexp.cpp
--- branches/KDE/3.5/kdelibs/kjs/ChangeLog #636907:636908
@@ -1,3 +1,10 @@
+2007-02-24 Harri Porten <porten@kde.org>
+
+ * regexp.cpp: gracefully handle incomplete \u sequences in regular
+ expressions the IE way. Fixes the syntax error reported in bug
+ #141731 although the page might be relying on the equally
+ undefined FF way.
+
2007-02-23 Harri Porten <porten@kde.org>
* number_object.cpp: applied patch by Justin that fixes
--- branches/KDE/3.5/kdelibs/kjs/regexp.cpp #636907:636908
@@ -60,19 +60,33 @@
UChar c = p[i];
if (escape) {
escape = false;
- // we only care about \uxxxx
- if (c == 'u' && i + 4 < p.size()) {
- int c0 = p[i+1].unicode();
- int c1 = p[i+2].unicode();
- int c2 = p[i+3].unicode();
- int c3 = p[i+4].unicode();
- if (Lexer::isHexDigit(c0) && Lexer::isHexDigit(c1) &&
- Lexer::isHexDigit(c2) && Lexer::isHexDigit(c3)) {
- c = Lexer::convertUnicode(c0, c1, c2, c3);
- switch (c.unicode()) {
+ // we only care about \u
+ if (c == 'u') {
+ // standard unicode escape sequence looks like \uxxxx but
+ // other browsers also accept less then 4 hex digits
+ unsigned short u = 0;
+ int j = 0;
+ for (j = 0; j < 4; ++j) {
+ if (i + 1 < p.size() && Lexer::isHexDigit(p[i + 1].unicode())) {
+ u = (u << 4) + Lexer::convertHex(p[i + 1].unicode());
+ ++i;
+ } else {
+ // sequence incomplete. restore index.
+ // TODO: cleaner way to propagate warning
+ fprintf(stderr, "KJS: saw %d digit \\u sequence.\n", j);
+ i -= j;
+ break;
+ }
+ }
+ if (j < 4) {
+ // sequence was incomplete. treat \u as u which IE always
+ // and FF sometimes does.
+ intern.append(UString('u'));
+ } else {
+ c = UChar(u);
+ switch (u) {
case 0:
// Make sure to encode 0, to avoid terminating the string
- fprintf(stderr, "NULL escape\n");
intern += UString(nil);
break;
case '^':
@@ -93,9 +107,8 @@
intern += UString(&c, 1);
break;
}
- i += 4;
- continue;
}
+ continue;
}
intern += UString('\\');
intern += UString(&c, 1);
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic