Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
b94f61b6
Commit
b94f61b6
authored
Aug 03, 2013
by
Serhiy Storchaka
Browse files
Options
Browse Files
Download
Plain Diff
Issue #17998: Fix an internal error in regular expression engine.
parents
fb0ffa12
1f35ae0a
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
19 additions
and
7 deletions
+19
-7
Lib/test/test_re.py
Lib/test/test_re.py
+10
-0
Misc/NEWS
Misc/NEWS
+2
-0
Modules/_sre.c
Modules/_sre.c
+6
-6
Modules/sre.h
Modules/sre.h
+1
-1
No files found.
Lib/test/test_re.py
View file @
b94f61b6
...
...
@@ -1040,6 +1040,16 @@ class ReTests(unittest.TestCase):
with self.assertRaisesRegex(sre_constants.error, '
\
?
f
oo'):
re.compile('(?P<?foo>)')
def test_issue17998(self):
for reps in '*', '+', '?', '{1}':
for mod in '', '?':
pattern = '.' + reps + mod + 'yz'
self.assertEqual(re.compile(pattern, re.S).findall('xyz'),
['xyz'], msg=pattern)
pattern = pattern.encode()
self.assertEqual(re.compile(pattern, re.S).findall(b'xyz'),
[b'xyz'], msg=pattern)
def run_re_tests():
from test.re_tests import tests, SUCCEED, FAIL, SYNTAX_ERROR
...
...
Misc/NEWS
View file @
b94f61b6
...
...
@@ -181,6 +181,8 @@ Core and Builtins
Library
-------
-
Issue
#
17998
:
Fix
an
internal
error
in
regular
expression
engine
.
-
Issue
#
17557
:
Fix
os
.
getgroups
()
to
work
with
the
modified
behavior
of
getgroups
(
2
)
on
OS
X
10.8
.
Original
patch
by
Mateusz
Lenik
.
...
...
Modules/_sre.c
View file @
b94f61b6
...
...
@@ -997,7 +997,7 @@ entrance:
TRACE
((
"|%p|%p|REPEAT_ONE %d %d
\n
"
,
ctx
->
pattern
,
ctx
->
ptr
,
ctx
->
pattern
[
1
],
ctx
->
pattern
[
2
]));
if
(
ctx
->
pattern
[
1
]
>
(
end
-
ctx
->
ptr
)
/
state
->
charsize
)
if
(
(
Py_ssize_t
)
ctx
->
pattern
[
1
]
>
(
end
-
ctx
->
ptr
)
/
state
->
charsize
)
RETURN_FAILURE
;
/* cannot match */
state
->
ptr
=
ctx
->
ptr
;
...
...
@@ -1081,7 +1081,7 @@ entrance:
TRACE
((
"|%p|%p|MIN_REPEAT_ONE %d %d
\n
"
,
ctx
->
pattern
,
ctx
->
ptr
,
ctx
->
pattern
[
1
],
ctx
->
pattern
[
2
]));
if
(
ctx
->
pattern
[
1
]
>
(
end
-
ctx
->
ptr
)
/
state
->
charsize
)
if
(
(
Py_ssize_t
)
ctx
->
pattern
[
1
]
>
(
end
-
ctx
->
ptr
)
/
state
->
charsize
)
RETURN_FAILURE
;
/* cannot match */
state
->
ptr
=
ctx
->
ptr
;
...
...
@@ -1180,7 +1180,7 @@ entrance:
TRACE
((
"|%p|%p|MAX_UNTIL %d
\n
"
,
ctx
->
pattern
,
ctx
->
ptr
,
ctx
->
count
));
if
(
ctx
->
count
<
ctx
->
u
.
rep
->
pattern
[
1
])
{
if
(
ctx
->
count
<
(
Py_ssize_t
)
ctx
->
u
.
rep
->
pattern
[
1
])
{
/* not enough matches */
ctx
->
u
.
rep
->
count
=
ctx
->
count
;
DO_JUMP
(
JUMP_MAX_UNTIL_1
,
jump_max_until_1
,
...
...
@@ -1194,7 +1194,7 @@ entrance:
RETURN_FAILURE
;
}
if
((
ctx
->
count
<
ctx
->
u
.
rep
->
pattern
[
2
]
||
if
((
ctx
->
count
<
(
Py_ssize_t
)
ctx
->
u
.
rep
->
pattern
[
2
]
||
ctx
->
u
.
rep
->
pattern
[
2
]
==
SRE_MAXREPEAT
)
&&
state
->
ptr
!=
ctx
->
u
.
rep
->
last_ptr
)
{
/* we may have enough matches, but if we can
...
...
@@ -1243,7 +1243,7 @@ entrance:
TRACE
((
"|%p|%p|MIN_UNTIL %d %p
\n
"
,
ctx
->
pattern
,
ctx
->
ptr
,
ctx
->
count
,
ctx
->
u
.
rep
->
pattern
));
if
(
ctx
->
count
<
ctx
->
u
.
rep
->
pattern
[
1
])
{
if
(
ctx
->
count
<
(
Py_ssize_t
)
ctx
->
u
.
rep
->
pattern
[
1
])
{
/* not enough matches */
ctx
->
u
.
rep
->
count
=
ctx
->
count
;
DO_JUMP
(
JUMP_MIN_UNTIL_1
,
jump_min_until_1
,
...
...
@@ -1272,7 +1272,7 @@ entrance:
LASTMARK_RESTORE
();
if
((
ctx
->
count
>=
ctx
->
u
.
rep
->
pattern
[
2
]
if
((
ctx
->
count
>=
(
Py_ssize_t
)
ctx
->
u
.
rep
->
pattern
[
2
]
&&
ctx
->
u
.
rep
->
pattern
[
2
]
!=
SRE_MAXREPEAT
)
||
state
->
ptr
==
ctx
->
u
.
rep
->
last_ptr
)
RETURN_FAILURE
;
...
...
Modules/sre.h
View file @
b94f61b6
...
...
@@ -19,7 +19,7 @@
#if SIZEOF_SIZE_T > 4
# define SRE_MAXREPEAT (~(SRE_CODE)0)
#else
# define SRE_MAXREPEAT ((SRE_CODE)PY_SSIZE_T_MAX
+ 1u
)
# define SRE_MAXREPEAT ((SRE_CODE)PY_SSIZE_T_MAX)
#endif
typedef
struct
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment