summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embed.fnc2
-rw-r--r--proto.h2
-rw-r--r--sv.c11
3 files changed, 11 insertions, 4 deletions
diff --git a/embed.fnc b/embed.fnc
index 1ba90415ff..4b04803a09 100644
--- a/embed.fnc
+++ b/embed.fnc
@@ -1885,7 +1885,7 @@ sR |I32 |expect_number |NN char **const pattern
sn |STRLEN |sv_pos_u2b_forwards|NN const U8 *const start \
|NN const U8 *const send|STRLEN uoffset
sn |STRLEN |sv_pos_u2b_midway|NN const U8 *const start \
- |NN const U8 *send|const STRLEN uoffset|const STRLEN uend
+ |NN const U8 *send|STRLEN uoffset|const STRLEN uend
s |STRLEN |sv_pos_u2b_cached|NN SV *const sv|NN MAGIC **const mgp \
|NN const U8 *const start|NN const U8 *const send \
|const STRLEN uoffset|STRLEN uoffset0|STRLEN boffset0
diff --git a/proto.h b/proto.h
index f25b40cf84..86658c17e1 100644
--- a/proto.h
+++ b/proto.h
@@ -5815,7 +5815,7 @@ STATIC STRLEN S_sv_pos_u2b_forwards(const U8 *const start, const U8 *const send,
#define PERL_ARGS_ASSERT_SV_POS_U2B_FORWARDS \
assert(start); assert(send)
-STATIC STRLEN S_sv_pos_u2b_midway(const U8 *const start, const U8 *send, const STRLEN uoffset, const STRLEN uend)
+STATIC STRLEN S_sv_pos_u2b_midway(const U8 *const start, const U8 *send, STRLEN uoffset, const STRLEN uend)
__attribute__nonnull__(1)
__attribute__nonnull__(2);
#define PERL_ARGS_ASSERT_SV_POS_U2B_MIDWAY \
diff --git a/sv.c b/sv.c
index c38a318f74..45a98946ef 100644
--- a/sv.c
+++ b/sv.c
@@ -6110,7 +6110,7 @@ S_sv_pos_u2b_forwards(const U8 *const start, const U8 *const send,
the passed in UTF-8 offset. */
static STRLEN
S_sv_pos_u2b_midway(const U8 *const start, const U8 *send,
- const STRLEN uoffset, const STRLEN uend)
+ STRLEN uoffset, const STRLEN uend)
{
STRLEN backw = uend - uoffset;
@@ -6120,7 +6120,14 @@ S_sv_pos_u2b_midway(const U8 *const start, const U8 *send,
/* The assumption is that going forwards is twice the speed of going
forward (that's where the 2 * backw comes from).
(The real figure of course depends on the UTF-8 data.) */
- return sv_pos_u2b_forwards(start, send, uoffset);
+ const U8 *s = start;
+
+ while (s < send && uoffset--)
+ s += UTF8SKIP(s);
+ assert (s <= send);
+ if (s > send)
+ s = send;
+ return s - start;
}
while (backw--) {