aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/tools/python3/Modules/_sre/sre_lib.h
diff options
context:
space:
mode:
authorshadchin <shadchin@yandex-team.com>2024-12-23 19:39:02 +0300
committershadchin <shadchin@yandex-team.com>2024-12-23 19:54:20 +0300
commit65a5bf9d37a3b29eb394f560b9a09318196c40e8 (patch)
treee5cd68fb0682b2388e52d9806bb87adc348e21a8 /contrib/tools/python3/Modules/_sre/sre_lib.h
parenta1dd87a52878ab3e46e5fd2dba5ecbba6113d7e0 (diff)
downloadydb-65a5bf9d37a3b29eb394f560b9a09318196c40e8.tar.gz
Update Python 3 to 3.12.8
commit_hash:c20045b8a987d8720e1f3328270357491d5530f3
Diffstat (limited to 'contrib/tools/python3/Modules/_sre/sre_lib.h')
-rw-r--r--contrib/tools/python3/Modules/_sre/sre_lib.h44
1 files changed, 37 insertions, 7 deletions
diff --git a/contrib/tools/python3/Modules/_sre/sre_lib.h b/contrib/tools/python3/Modules/_sre/sre_lib.h
index 95c1ada908..9e9a0ec926 100644
--- a/contrib/tools/python3/Modules/_sre/sre_lib.h
+++ b/contrib/tools/python3/Modules/_sre/sre_lib.h
@@ -524,13 +524,28 @@ typedef struct {
Py_ssize_t last_ctx_pos;
} SRE(match_context);
-#define MAYBE_CHECK_SIGNALS \
+#define _MAYBE_CHECK_SIGNALS \
do { \
if ((0 == (++sigcount & 0xfff)) && PyErr_CheckSignals()) { \
RETURN_ERROR(SRE_ERROR_INTERRUPTED); \
} \
} while (0)
+#ifdef Py_DEBUG
+# define MAYBE_CHECK_SIGNALS \
+ do { \
+ _MAYBE_CHECK_SIGNALS; \
+ if (state->fail_after_count >= 0) { \
+ if (state->fail_after_count-- == 0) { \
+ PyErr_SetNone(state->fail_after_exc); \
+ RETURN_ERROR(SRE_ERROR_INTERRUPTED); \
+ } \
+ } \
+ } while (0)
+#else
+# define MAYBE_CHECK_SIGNALS _MAYBE_CHECK_SIGNALS
+#endif /* Py_DEBUG */
+
#ifdef HAVE_COMPUTED_GOTOS
#ifndef USE_COMPUTED_GOTOS
#define USE_COMPUTED_GOTOS 1
@@ -1083,12 +1098,9 @@ dispatch:
pattern[1], pattern[2]));
/* install new repeat context */
- /* TODO(https://github.com/python/cpython/issues/67877): Fix this
- * potential memory leak. */
- ctx->u.rep = (SRE_REPEAT*) PyObject_Malloc(sizeof(*ctx->u.rep));
+ ctx->u.rep = repeat_pool_malloc(state);
if (!ctx->u.rep) {
- PyErr_NoMemory();
- RETURN_FAILURE;
+ RETURN_ERROR(SRE_ERROR_MEMORY);
}
ctx->u.rep->count = -1;
ctx->u.rep->pattern = pattern;
@@ -1099,7 +1111,7 @@ dispatch:
state->ptr = ptr;
DO_JUMP(JUMP_REPEAT, jump_repeat, pattern+pattern[0]);
state->repeat = ctx->u.rep->prev;
- PyObject_Free(ctx->u.rep);
+ repeat_pool_free(state, ctx->u.rep);
if (ret) {
RETURN_ON_ERROR(ret);
@@ -1257,6 +1269,17 @@ dispatch:
pointer */
state->ptr = ptr;
+ /* Set state->repeat to non-NULL */
+ ctx->u.rep = repeat_pool_malloc(state);
+ if (!ctx->u.rep) {
+ RETURN_ERROR(SRE_ERROR_MEMORY);
+ }
+ ctx->u.rep->count = -1;
+ ctx->u.rep->pattern = NULL;
+ ctx->u.rep->prev = state->repeat;
+ ctx->u.rep->last_ptr = NULL;
+ state->repeat = ctx->u.rep;
+
/* Initialize Count to 0 */
ctx->count = 0;
@@ -1271,6 +1294,9 @@ dispatch:
}
else {
state->ptr = ptr;
+ /* Restore state->repeat */
+ state->repeat = ctx->u.rep->prev;
+ repeat_pool_free(state, ctx->u.rep);
RETURN_FAILURE;
}
}
@@ -1343,6 +1369,10 @@ dispatch:
}
}
+ /* Restore state->repeat */
+ state->repeat = ctx->u.rep->prev;
+ repeat_pool_free(state, ctx->u.rep);
+
/* Evaluate Tail */
/* Jump to end of pattern indicated by skip, and then skip
the SUCCESS op code that follows it. */