Paul J. Lucas has proposed merging lp:~paul-lucas/zorba/bug-855715 into lp:zorba.
Requested reviews: Paul J. Lucas (paul-lucas) Matthias Brantner (matthias-brantner) For more details, see: https://code.launchpad.net/~paul-lucas/zorba/bug-855715/+merge/79768 Now checking for invalid regex escape sequences. -- https://code.launchpad.net/~paul-lucas/zorba/bug-855715/+merge/79768 Your team Zorba Coders is subscribed to branch lp:zorba.
=== modified file 'ChangeLog' --- ChangeLog 2011-10-12 21:30:46 +0000 +++ ChangeLog 2011-10-19 05:12:24 +0000 @@ -52,6 +52,7 @@ * Added undo for node revalidation * Fixed bug #872796 (validate-in-place can interfere with other update primitives) * Fixed bug #872799 (validate-in-place can set incorrect types) + * Fixed bug #855715 (Invalid escaped characters in regex not caught) version 2.0.1 === modified file 'modules/com/zorba-xquery/www/modules/xqdoc2xhtml/index.xq' --- modules/com/zorba-xquery/www/modules/xqdoc2xhtml/index.xq 2011-10-07 08:28:43 +0000 +++ modules/com/zorba-xquery/www/modules/xqdoc2xhtml/index.xq 2011-10-19 05:12:24 +0000 @@ -1364,7 +1364,7 @@ fn:concat(fn:substring-before($description,"."),".") else "" order by $name, $param-number return - let $type := replace(normalize-space(substring-after(substring-before($signature, "function"), "declare")),"\%",""), + let $type := replace(normalize-space(substring-after(substring-before($signature, "function"), "declare")),"%",""), $isExternal := ends-with($signature, "external"), $paramsAndReturn := substring-after($signature,concat(':',$name)), $external := if(ends-with($signature,"external")) then "external" else "" === modified file 'modules/org/expath/ns/file.xq' --- modules/org/expath/ns/file.xq 2011-10-17 11:49:38 +0000 +++ modules/org/expath/ns/file.xq 2011-10-19 05:12:24 +0000 @@ -624,7 +624,7 @@ declare function file:glob-to-regex( $pattern as xs:string ) { - let $pattern := fn:replace($pattern, '(\.|\[|\]|\\|\/|\||\-|\^|\$|\?|\*|\+|\{|\}|\(|\))','\\$1') + let $pattern := fn:replace($pattern, '(\.|\[|\]|\\|/|\||\-|\^|\$|\?|\*|\+|\{|\}|\(|\))','\\$1') let $pattern := fn:replace($pattern, '\\\?', '.') let $pattern := fn:replace($pattern, '\\\*', '.*') return === modified file 'src/diagnostics/diagnostic_en.xml' --- src/diagnostics/diagnostic_en.xml 2011-10-05 18:52:55 +0000 +++ src/diagnostics/diagnostic_en.xml 2011-10-19 05:12:24 +0000 @@ -2393,6 +2393,10 @@ <value>invalid library module</value> </entry> + <entry key="BadRegexEscape_3"> + <value>"$3": illegal escape character</value> + </entry> + <entry key="BadPath"> <value>invalid path</value> </entry> === modified file 'src/diagnostics/pregenerated/dict_en.cpp' --- src/diagnostics/pregenerated/dict_en.cpp 2011-10-05 17:49:48 +0000 +++ src/diagnostics/pregenerated/dict_en.cpp 2011-10-19 05:12:24 +0000 @@ -424,6 +424,7 @@ { "~BadIterator", "invalid iterator" }, { "~BadLibraryModule", "invalid library module" }, { "~BadPath", "invalid path" }, + { "~BadRegexEscape_3", "\"$3\": illegal escape character" }, { "~BadStreamState", "bad I/O stream state" }, { "~BadTokenInBraces_3", "\"$3\": illegal token within { }" }, { "~BadTraceStream", "trace stream not retrievable using SerializationCallback" }, === modified file 'src/util/regex.cpp' --- src/util/regex.cpp 2011-07-18 14:25:21 +0000 +++ src/util/regex.cpp 2011-10-19 05:12:24 +0000 @@ -128,33 +128,69 @@ case 'c': // NameChar *icu_re += "[" bs_c "]"; continue; - case 'C': // ^\c + case 'C': // [^\c] *icu_re += "[^" bs_c "]"; continue; case 'i': // initial NameChar *icu_re += "[" bs_i "]"; continue; - case 'I': // ^\i + case 'I': // [^\i] *icu_re += "[^" bs_i "]"; continue; - default: - if ( ascii::is_digit( *xq_c ) ) { - backref_no = *xq_c - '0'; - if ( !backref_no ) // \0 is illegal - throw INVALID_RE_EXCEPTION( xq_re, ZED( BackRef0Illegal ) ); - if ( in_char_class ) { - // - // XQuery 3.0 F&O 5.6.1: Within a character class expression, - // \ followed by a digit is invalid. - // - throw INVALID_RE_EXCEPTION( - xq_re, ZED( BackRefIllegalInCharClass ) - ); - } - in_backref = true; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + backref_no = *xq_c - '0'; + if ( !backref_no ) // \0 is illegal + throw INVALID_RE_EXCEPTION( xq_re, ZED( BackRef0Illegal ) ); + if ( in_char_class ) { + // + // XQuery 3.0 F&O 5.6.1: Within a character class expression, + // \ followed by a digit is invalid. + // + throw INVALID_RE_EXCEPTION( + xq_re, ZED( BackRefIllegalInCharClass ) + ); } + in_backref = true; + // no break; + case '$': + case '(': + case ')': + case '*': + case '+': + case '-': + case '.': + case '?': + case 'd': // [0-9] + case 'D': // [^\d] + case 'n': // newline + case 'p': // category escape + case 'P': // [^\p] + case 'r': // carriage return + case 's': // whitespace + case 'S': // [^\s] + case 't': // tab + case 'w': // word char + case 'W': // [^\w] + case '[': + case '\\': + case ']': + case '^': + case '{': + case '|': + case '}': *icu_re += '\\'; break; + default: + throw INVALID_RE_EXCEPTION( xq_re, ZED( BadRegexEscape_3 ), *xq_c ); } } else { if ( in_backref ) { === modified file 'test/rbkt/Queries/zorba/file/files_pattern_rec1.xq' --- test/rbkt/Queries/zorba/file/files_pattern_rec1.xq 2011-04-29 22:29:04 +0000 +++ test/rbkt/Queries/zorba/file/files_pattern_rec1.xq 2011-10-19 05:12:24 +0000 @@ -2,9 +2,15 @@ declare variable $path as xs:string external; +let $sep := file:directory-separator() +let $escaped_sep := + if ($sep eq "\") then + fn:concat("\", $sep) + else + $sep let $files := file:list($path, fn:true(), "*dir*") for $file in $files where fn:not(fn:matches($file, "\.svn")) -let $f := fn:replace($file, fn:concat("\", file:directory-separator()), "/") +let $f := fn:replace($file, $escaped_sep, "/") order by $f return <result>{$f}</result> === modified file 'test/rbkt/Queries/zorba/file/files_pattern_rec2.xq' --- test/rbkt/Queries/zorba/file/files_pattern_rec2.xq 2011-04-29 22:29:04 +0000 +++ test/rbkt/Queries/zorba/file/files_pattern_rec2.xq 2011-10-19 05:12:24 +0000 @@ -2,9 +2,15 @@ declare variable $path as xs:string external; +let $sep := file:directory-separator() +let $escaped_sep := + if ($sep eq "\") then + fn:concat("\", $sep) + else + $sep let $files := file:list($path, fn:true(), "*.txt") for $file in $files where fn:not(fn:matches($file, "\.svn")) -let $f := fn:replace($file, fn:concat("\", file:directory-separator()), "/") +let $f := fn:replace($file, $escaped_sep, "/") order by $f return <result>{$f}</result>
-- Mailing list: https://launchpad.net/~zorba-coders Post to : zorba-coders@lists.launchpad.net Unsubscribe : https://launchpad.net/~zorba-coders More help : https://help.launchpad.net/ListHelp