This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
perl5.git
2 years agoPATCH: [perl #133988], Assertion failure
Karl Williamson [Fri, 5 Apr 2019 22:34:21 +0000 (16:34 -0600)]
PATCH: [perl #133988], Assertion failure

This was due to not checking that a \N{} expanded to a single code point
in contexts where only that is legal.  This never could have worked
properly, though the assertion failure is new.

The diagnostic needs to be reworded to accommodate this new case, but
its too late in the 5.29 cycle to do that, so I'm changing just the
description, and will reword in 5.31, [perl #133996]

2 years agoPATCH: [perl #133896] Assertion failure
Karl Williamson [Fri, 5 Apr 2019 22:21:51 +0000 (16:21 -0600)]
PATCH: [perl #133896] Assertion failure

This was due to UTF8_SAFE_SKIP(s, e) not allowing s to be as large as e,
and there are legitimate cases where it can be.  This commit hardens the
macro so that it never reads above e-1, returning 0 if it otherwise
would be required to.  The assertion is changed to 's <= e'.

2 years agoregcomp.c: Change name of variable
Karl Williamson [Fri, 5 Apr 2019 22:26:36 +0000 (16:26 -0600)]
regcomp.c: Change name of variable

This better reflects its use.

2 years agoregcomp.c: Consolidate code
Karl Williamson [Fri, 5 Apr 2019 22:25:29 +0000 (16:25 -0600)]
regcomp.c: Consolidate code

This uses gotos to handle an identical panic case, instead of
duplicating the code.

2 years agoporting/diag.t: Allow nested =item's
Karl Williamson [Fri, 5 Apr 2019 23:04:38 +0000 (17:04 -0600)]
porting/diag.t: Allow nested =item's

This enhances this test to allow perldiag to have the descriptions of
error messages to contain =item lists (previously only bullet item lists
were allowed).

2 years agofix typo
Karen Etheridge [Fri, 5 Apr 2019 20:54:19 +0000 (13:54 -0700)]
fix typo

2 years ago5.28.2 should arrive this month
Steve Hay [Fri, 5 Apr 2019 20:04:52 +0000 (21:04 +0100)]
5.28.2 should arrive this month

Also: 5.29.9 was released.

2 years agoAdd epigraph for 5.28.2-RC1
Steve Hay [Fri, 5 Apr 2019 20:01:29 +0000 (21:01 +0100)]
Add epigraph for 5.28.2-RC1

2 years ago5.28.2-RC1 today
Steve Hay [Fri, 5 Apr 2019 18:34:10 +0000 (19:34 +0100)]
5.28.2-RC1 today

2 years agofixup to 'change LABEL type from pval to opval'
David Mitchell [Fri, 5 Apr 2019 16:01:53 +0000 (17:01 +0100)]
fixup to 'change LABEL type from pval to opval'

Commit v5.29.9-68-g017192018b broke g++ builds. Spotted by Karl.

2 years agoparser: change LABEL type from pval to opval
David Mitchell [Fri, 5 Apr 2019 11:49:50 +0000 (12:49 +0100)]
parser: change LABEL type from pval to opval

The items pushed onto the parser stack can be one of several types:
ival, opval, pval etc. The only remaining use of pval is when a "label:"
is encountered.

When an error occurs during parsing, ops on the parse stack get
automatically reaped these days as part of the OP slab mechanism;
but bare strings (pvals) still leak.

Convert this one remaining pval into an opval, making the toker return
an OP_CONST with an SV holding the label.

Since newSTATEOP() still expects a raw string for the label, the parser
just grabs the value returned by the toker and makes a copy of the
string from it, then immediately frees the OP_CONST and its associated
SV.

The leak was showing up in ext/XS-APItest/t/stmtasexpr.t, which expects
to parse a statement where labels are banned.

2 years agoDefine $d_has_C_UTF8 in Windows config files
Karl Williamson [Thu, 4 Apr 2019 15:12:29 +0000 (09:12 -0600)]
Define $d_has_C_UTF8 in Windows config files

Otherwise it gets an uninitialized warning.

2 years agoPartial patch for [perl #133970] Roman::Unicode broken
Karl Williamson [Thu, 4 Apr 2019 19:44:22 +0000 (13:44 -0600)]
Partial patch for [perl #133970] Roman::Unicode broken

Wrap a call out to Perl code with PUSH/POP stacks.
This gets this module working again, and maybe head off some other smoke
failures, but there are other things needed, including tests, that I'm
working on.

2 years agoRevert part of commit b6125dfcd017e2dd18dacdce91a6e071499b7aed
Steve Hay [Thu, 28 Mar 2019 22:51:09 +0000 (22:51 +0000)]
Revert part of commit b6125dfcd017e2dd18dacdce91a6e071499b7aed

2 years agomktables: Turn off DEBUG
Karl Williamson [Thu, 4 Apr 2019 18:49:41 +0000 (12:49 -0600)]
mktables: Turn off DEBUG

This inadvertently was left on, slowing down the process a little

2 years agoSilence some compiler warnings
Karl Williamson [Thu, 4 Apr 2019 03:22:29 +0000 (21:22 -0600)]
Silence some compiler warnings

Most of these are from Win32.

2 years agofix leak in Perl_vload_module()
David Mitchell [Thu, 4 Apr 2019 13:38:50 +0000 (14:38 +0100)]
fix leak in Perl_vload_module()

This function allocates a few ops, then calls Perl_utilize().
If the latter function croaks early on, those ops will be leaked,
because they won't yet have been linked into the optree.

In particular, newUNOP(OP_REQUIRE, ...) can die if passed a non-valid
module name.

This can be fixed by moving the start_subparse() call to the start of
Perl_vload_module(), before any op allocations. start_subparse() creates
a new PL_compcv, and so any ops allocated afterwards will come from that
CV's slab rather than being directly malloc()ed. On death, the CV will
be freed and its op slab will be scanned and any ops found there freed.

The leak was showing up in ext/XS-APItest/t/load-module.t under ASan.

2 years agot/charset_tools.pl: Add comments
Karl Williamson [Wed, 3 Apr 2019 18:06:47 +0000 (12:06 -0600)]
t/charset_tools.pl: Add comments

2 years agonewlocale() has a problem in openbsd
Karl Williamson [Wed, 3 Apr 2019 20:27:00 +0000 (14:27 -0600)]
newlocale() has a problem in openbsd

And therefore we can't use it, until fixed.
https://marc.info/?l=openbsd-bugs&m=155364568608759&w=2

2 years agonumeric.c: Change formal parameter to be const
Karl Williamson [Wed, 3 Apr 2019 20:31:05 +0000 (14:31 -0600)]
numeric.c: Change formal parameter to be const

as embed.fnc says it should be

2 years agoPATCH: [perl #133978] BBC breaks Jcode
Karl Williamson [Wed, 3 Apr 2019 16:25:26 +0000 (10:25 -0600)]
PATCH: [perl #133978] BBC breaks Jcode

This turned out to be caused by taking another macro as a template
without understanding the subtleties.  In this case, the variable
'previous_occurrence_end' should be updated only if 'COND' is true.  (In
the template the COND was implicitly true)

2 years agoAvoid leaks in Perl_custom_op_get_field()
David Mitchell [Wed, 3 Apr 2019 15:11:54 +0000 (16:11 +0100)]
Avoid leaks in Perl_custom_op_get_field()

In 5.14.0 a new API was introduced to register details for custom ops.
Normally the caller supplies a pointer to a static xop struct with
details for the op, which gets gets added via a hidden
    newSViv(PTR2IV(xop))
to PL_custom_ops values.

However, Perl_custom_op_get_field() also supports the older interface,
where name and desc entries were registered in PL_custom_op_names and
PL_custom_op_descs.

If it doesn't find an entry in PL_custom_ops, but does in
PL_custom_op_names, it fakes up a new-API registration in PL_custom_ops.
In this case the xop struct, and the name and description attached to it,
were leaking.

This commit fixes the leak by attaching magic to such newSViv(PTR2IV(xop))
SVs which frees the struct and strings.

2 years agofix leak in Devel-PPPort
David Mitchell [Wed, 3 Apr 2019 13:14:13 +0000 (14:14 +0100)]
fix leak in Devel-PPPort

The leaky code is only used during test. It creates 3 ops, does various
operations related to linking OpSIBLINGs, then fails to free them.

2 years agoData::Dumper - avoid leak on croak
David Mitchell [Wed, 3 Apr 2019 12:23:24 +0000 (13:23 +0100)]
Data::Dumper - avoid leak on croak

v5.21.3-742-g19be3be696 added a facility to Dumper.xs to croak if the
recursion level became too deep (1000 by default).

The trouble with this is that various parts of DD_dump() allocate
temporary SVs and buffers, which will leak if DD_dump() unceremoniously
just croaks().

This currently manifests as dist/Data-Dumper/t/recurse.t failing under
Address Sanitiser.

This commit makes the depth checking code just set a sticky 'too deep'
boolean flag, and
a) on entry, DD_dump() just returns immediately if the flag is set;
b) the flag is checked by the top-level called of DD_dump() and croaks
if set.

So the net effect is to defer croaking until the dump is complete,
and avoid any further recursion once the flag is set.

This is a bit of a quick fix. More long-term solutions would be to
convert DD_dump() to be iterative rather than recursive, and/or make
sure all temporary SVs and buffers are suitably anchored somewhere so
that they get cleaned up on croak.

2 years agoFix recent double free in S_parse_gv_stash_name()
David Mitchell [Wed, 3 Apr 2019 10:06:22 +0000 (11:06 +0100)]
Fix recent double free in S_parse_gv_stash_name()

RT #133977

My recent commit v5.29.9-29-g657ed7c1c1 moved all buffer freeing to
the end of the function, but missed removing one of the existing frees.

The problem was spotted by James E Keenan and diagnosed by Tony Cook; I just
added a test.

A simple reproducer is

my $def = defined *{"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'x"};

2 years agoCorrections to Unicode 12.0
Unicode Consortium [Tue, 2 Apr 2019 15:27:08 +0000 (09:27 -0600)]
Corrections to Unicode 12.0

Somehow I missed updating some files with the result that a few official
12.0 final corrections did not make it into
906f46d96ca4ba2d1039d576954bc5a47868348c.

These are mostly tests and break property changes for a few characters

2 years agofix locale.c under -DPERL_GLOBAL_STRUCT_PRIVATE
David Mitchell [Tue, 2 Apr 2019 09:05:37 +0000 (10:05 +0100)]
fix locale.c under -DPERL_GLOBAL_STRUCT_PRIVATE

2 years agohandy.h: Parenthesize formal parameters in macro defn
Karl Williamson [Sun, 31 Mar 2019 19:50:09 +0000 (13:50 -0600)]
handy.h: Parenthesize formal parameters in macro defn

These should be parenthesized to prevent issues when called with an
expression.

2 years agoUpdate EU::CBuilder to 0.280231
Alberto Simões [Sun, 31 Mar 2019 09:49:54 +0000 (10:49 +0100)]
Update EU::CBuilder to 0.280231

Committer: additional email address for contributor

2 years agoperldelta for 4f13e4588f9a08564a56a0d6db821f2803aed09f
James E Keenan [Sat, 30 Mar 2019 20:26:07 +0000 (16:26 -0400)]
perldelta for 4f13e4588f9a08564a56a0d6db821f2803aed09f

2 years agoquotemeta the stuff intended literally in RE
Ed J [Sat, 30 Mar 2019 19:51:53 +0000 (15:51 -0400)]
quotemeta the stuff intended literally in RE

For: RT 133966

Committer: Bump $VERSION in dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Base.pm

2 years agoregcharclass.h: Change to use new inRANGE macro
Karl Williamson [Thu, 21 Mar 2019 22:09:41 +0000 (16:09 -0600)]
regcharclass.h: Change to use new inRANGE macro

This was done by changing regen/regcharclass.pl.  This results in half
the conditionals being needed, and in some cases better error checking.

2 years agoregexec.c: Use first byte info in ANYOFH
Karl Williamson [Fri, 29 Mar 2019 18:57:40 +0000 (12:57 -0600)]
regexec.c: Use first byte info in ANYOFH

Commit 765e6ecf32a570694dcff91c1c72f98306a9390e changed ANYOFH regnodes
to note if the first byte of all code points matched is the same.  When
that is the case we can potentially speed up matching by only trying to
match at points in the input where that byte occurs.  Since ANYOFH nodes
match only UTF-8 encoded strings, that first byte is going to be a UTF-8
start byte.  If that is uncommon in the target string, this is a real
winner.

2 years agoRemove zero length valgrind files at end.
Karl Williamson [Sun, 24 Mar 2019 03:29:51 +0000 (21:29 -0600)]
Remove zero length valgrind files at end.

This resolves [perl #131135]

2 years agoregcomp.c: Use new inRANGE macro
Karl Williamson [Thu, 28 Mar 2019 03:20:58 +0000 (21:20 -0600)]
regcomp.c: Use new inRANGE macro

2 years agonumeric.c: use new inRANGE macro
Karl Williamson [Thu, 28 Mar 2019 03:19:04 +0000 (21:19 -0600)]
numeric.c: use new inRANGE macro

This commit halves the number of conditionals needed in this hot code.

2 years agohandy.h: Convert some macros to use inRANGE
Karl Williamson [Thu, 28 Mar 2019 03:12:53 +0000 (21:12 -0600)]
handy.h: Convert some macros to use inRANGE

the latter is faster, having only one conditional.

2 years agohandy.h: Comments, remove extraneous parens
Karl Williamson [Thu, 28 Mar 2019 03:09:14 +0000 (21:09 -0600)]
handy.h: Comments, remove extraneous parens

2 years agofix leak in Perl__force_out_malformed_utf8_message()
David Mitchell [Tue, 26 Mar 2019 14:58:04 +0000 (14:58 +0000)]
fix leak in Perl__force_out_malformed_utf8_message()

This function temporarily sets PL_curcop->cop_warnings to pWARN_ALL in
order to enforce mandatory warnings about malformed utf8, but it
didn't restore cop_warnings, so the old value leaked.

Can be reproduced with, e.g.

    no warnings 'utf8';
    CORE::evalbytes qq{ use utf8; "\\N{abc\x{c0}}"};

which is already exercised in t/uni/parser.t.

2 years agoPATCH: [perl #133347] Tk broken
Karl Williamson [Fri, 29 Mar 2019 00:22:11 +0000 (18:22 -0600)]
PATCH: [perl #133347] Tk broken

This was caused by utf8_to_uvchr() failing to set the returned ptr
in some circumstances, leading to reading uninitialized memory.

A test failure remains, and I'll wait for Slaven's feedback before
looking further into that.  It is in t/photo.t

 couldn't recognize image data at blib/lib/Tk/Image.pm line 21.
 # Looks like your test exited with 255 just after 100

And it's trying at that point to look at 'Xcamel.gif'

2 years agoperldiag: Rmv obsolete message
Karl Williamson [Thu, 28 Mar 2019 03:28:32 +0000 (21:28 -0600)]
perldiag: Rmv obsolete message

This restriction no longer exists, and is for an experimental feature

2 years agoPATCH: [perl #133942] BBC: BKB/Lingua-JA-Moji
Karl Williamson [Thu, 28 Mar 2019 18:26:43 +0000 (12:26 -0600)]
PATCH: [perl #133942] BBC: BKB/Lingua-JA-Moji

This ticket was originally fixed by a PR being issued on the
distribution, which was merged and a new version placed on CPAN.

But before Slaven had a chance to test it, commit
765e6ecf32a570694dcff91c1c72f98306a9390e came along, and happened to
break it again from a totally independent cause.

So we have two separate bugs on the same ticket, only one of which was
perl's fault.  And this commit fixes that.  The problematic commit was
still looking in the regnode FLAGS field in one function, whereas that
field has been repurposed for ANYOFH nodes, so should be ignored for
them.

2 years agoperlapi: Add weasel word to make stmt accurate
Karl Williamson [Sun, 24 Mar 2019 03:28:21 +0000 (21:28 -0600)]
perlapi: Add weasel word to make stmt accurate

It is possible to have a single-threaded build use the thread-safe
locale setting operations.  Add a word to indicate it's not 100% the
other way.

2 years agoPATCH: [perl #133959] Free BSD broken tests
Karl Williamson [Wed, 27 Mar 2019 16:28:21 +0000 (10:28 -0600)]
PATCH: [perl #133959] Free BSD broken tests

Commit 70bd6bc82ba64c1d197d3ec823f43c4a454b2920 fixed a leak (likely due
to a bug in glibc) by not duplicating the C locale object.  However,
that meant that there's only one copy running around.  And freeing that
will cause havoc, as its supposed to be there until destruction.  What
appears to be happening is that the current locale object is freed upon
thread destruction, and that could be this global one.  But I don't
understand why it's only happening on Free BSD and only on this version.
But this commit fixes the problem there, and makes sense.  Simply don't
free this global object upon thread destruction.

This commit also changes it so it doesn't get destroyed at destruction
time, leaving it to the final PERL_SYS_TERM to free.  I'm not sure, but
I think this fixes any issues with embedded perls.

2 years ago[perl #133892] coredump in Perl_re_intuit_start
Hugo van der Sanden [Mon, 25 Mar 2019 11:27:12 +0000 (11:27 +0000)]
[perl #133892] coredump in Perl_re_intuit_start

Make sure we have a valid non-utf8 'other' check substring before we
try to use it.

2 years agoperl5299delta: Fixes from errata
Karl Williamson [Tue, 26 Mar 2019 17:51:13 +0000 (11:51 -0600)]
perl5299delta: Fixes from errata

This makes the changes to this perldelta as listed in
07fbfc1d8cc566004b43d10c5bec8682b01400e8

This will make it easier to combine into the final 5.30 perldelta.

2 years agoperl5299delta: Clarify variable-length lookbehind entry
Tom Wyant [Tue, 26 Mar 2019 17:49:16 +0000 (11:49 -0600)]
perl5299delta: Clarify variable-length lookbehind entry

2 years agofix CvFILE() leak in Perl_newMYSUB()
David Mitchell [Tue, 26 Mar 2019 12:33:46 +0000 (12:33 +0000)]
fix CvFILE() leak in Perl_newMYSUB()

This is basically the same as my recent fix for Perl_newATTRSUB_x(),
v5.29.8-46-gb37d10f658.

When overwriting cv with the contents of PL_compcv, it was checking the
CvDYNFILE(cv) flag (to see if CvFILE(cv) needed freeing) *after*
overwriting cv's flags with PL_compcv's flag.

2 years agoavoid leak with local $h{foo}, $a[n]
David Mitchell [Tue, 26 Mar 2019 11:04:07 +0000 (11:04 +0000)]
avoid leak with local $h{foo}, $a[n]

When SAVEt_DELETE / SAVEt_ADELETE deletes a hash/array entry on scope
exit, they also decrement the refcount of the hash/array, and for the
hash, also free the saved key.

However, if the call to hv_delete() or av_delete() dies (e.g. when
calling a tied DELETE method) then the hash/array and key will leak
because leave_scope() calls av/hv_delete(), *then* does the
SvREFCNT_dec() etc.

The fix is to push new FREEPV/FREESV actions just before calling
av/hv_delete().

2 years agofix leak in package name lookup
David Mitchell [Tue, 26 Mar 2019 08:56:55 +0000 (08:56 +0000)]
fix leak in package name lookup

S_parse_gv_stash_name() mallocs a temporary buffer when scanning package
names longer than 64 bytes. Depending on how it exits the function, it
doesn't always free the buffer afterwards. Change the function so that
there are only two exit points (which free the buffer) and make other bits
of code goto those two points.

Can be reproduced with e.g.

&{"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'x"}

Similar code is already present in t/op/stash_parse_gv.t

2 years agofix a leak with indented heredocs
David Mitchell [Mon, 25 Mar 2019 20:13:30 +0000 (20:13 +0000)]
fix a leak with indented heredocs

With something like

   |print <<~EOF;
   | some data
   |   EOF

it croaks (as it should) with "Indentation ... doesn't match delimiter",
but in that case it leaks the recently malloc()d 'indent' buffer.

The fix is simple.  I've also fixed by code inspection where the code
does 'goto interminable', although I didn't try to reproduce the conditions
where the goto might occur.

2 years agoreformat S_scan_heredoc()
David Mitchell [Mon, 25 Mar 2019 19:44:57 +0000 (19:44 +0000)]
reformat S_scan_heredoc()

The indentation was inconsistent and confusing.

Reindent, add blank lines where appropriate, and change this code
comment: "(Closing '}' here to balance"  to '<<}', since vim is far too
clever for its own good these days in terms of using '%' to bounce
between brace pairs.

Should be no functional changes.

2 years agoS_scan_heredoc(): add cosmetic braces
David Mitchell [Mon, 25 Mar 2019 19:14:43 +0000 (19:14 +0000)]
S_scan_heredoc(): add cosmetic braces

add braces round a single-statement 'if' clause which contains a while
loop and spans several lines.

Should be functionally equivalent, but less visually confusing.

2 years agofix leak with local ${^WARNING_BITS} = ...
David Mitchell [Mon, 25 Mar 2019 17:18:58 +0000 (17:18 +0000)]
fix leak with local ${^WARNING_BITS} = ...

When restoring the old value, need to free the current value first.
Can be reproduced with

    {
        local ${^WARNING_BITS} = 'swit';
    }

when run under ASan or similar.
An equivalent test already exists in t/op/leaky-magic.t.

2 years agoIt's an error if any component of \p{user-defined} fails
Karl Williamson [Sun, 24 Mar 2019 20:36:50 +0000 (14:36 -0600)]
It's an error if any component of \p{user-defined} fails

A user-defined property can expand to more than one component that are
combined into a single result.  Prior to this commit, since the move of
this into core C, it was possible that if any component was valid, the
whole thing was considered valid, though in many instances an assertion
failed on DEBUGGING builds.

2 years agoregcomp.c: Fix comment
Karl Williamson [Sun, 24 Mar 2019 20:27:38 +0000 (14:27 -0600)]
regcomp.c: Fix comment

It wasn't quite accurate

2 years agoavoid leak assigning regexp to non-COW string
David Mitchell [Fri, 22 Mar 2019 17:38:48 +0000 (17:38 +0000)]
avoid leak assigning regexp to non-COW string

In something like

    $s = substr(.....); # $s now a non-COW SvPOK() SV
    $r = qr/..../;
    $s = $$r;

$s's previous string buffer would leak when an SVt_REGEXP type SV is
assigned to it.

Worse, if $s was an SVt_PVPV, it would fail an assert on debugging
builds.

The fix is to make sure any remaining stringy stuff is cleaned up
before copying the REGEXP.

2 years agofix leak in BEGIN { threads->new(...) }
David Mitchell [Fri, 22 Mar 2019 15:43:56 +0000 (15:43 +0000)]
fix leak in BEGIN { threads->new(...) }

Normally by the time we reach perl_destruct(), PL_parser should be null
due to having its original (null) value restored by SAVEt_PARSER during
leaving scope (usually before run-time starts in fact).  But if a thread
is created within a BEGIN block, the parser is duped, but the
SAVEt_PARSER savestack entry isn't. So PL_parser never gets cleaned up.
Clean it up in perl_destruct() instead. This is a bit of a hack.

2 years agofix leak in cloned regexes.
David Mitchell [Fri, 22 Mar 2019 12:31:57 +0000 (12:31 +0000)]
fix leak in cloned regexes.

When a regex is cloned for a new thread, the string buffer (which holds
the text of the original pattern) wasn't being freed because SvLEN was
being set to 0.

For example:

    use threads;
    my $r = qr/abc/;
    threads->new( sub { 1; })->join;

In the new thread, $r is cloned  but when the thread exits, the string
buffer holding "(?^:abc)" was leaking.

This was broken by v5.27.2-30-gdf6b4bd565.

The problem was that in the cloned SV, the buffer was copied, but the
SvLEN(sv) was left set at zero, which along with the SVf_FAKE, mader it
look like the buffer was alien and so not freed.

SvLEN was 0 in the parent thread's $r, since $r and its compile-time
prototype share the same string buffer (so only the original SV has
SvLEN > 0 - all the copies - within the same thread - have mother_re
pointing to the original).

When REs are cloned into another thread, mother_re isn't preserved,
so each RE has its own copy of the buffer.

2 years agoFix POSIX::mblen mbstate_t initialization on threaded perls with glibc
Niko Tyni [Sun, 10 Mar 2019 17:40:42 +0000 (19:40 +0200)]
Fix POSIX::mblen mbstate_t initialization on threaded perls with glibc

As reported in https://bugs.launchpad.net/bugs/1818953 POSIX::mblen()
is broken on threaded perls with glibc.

  % perl -MPOSIX=mblen -e 'mblen("a", 1)'
  perl: mbrtowc.c:105: __mbrtowc: Assertion `__mbsinit (data.__statep)' failed.
  zsh: abort (core dumped)  perl -MPOSIX=mblen -e 'mblen("a", 1)'

This broke in v5.27.8-134-g6c9ff7e96e which made the function
use mbrlen(3) under the hood on threaded perls.

The problem is initialization of the shift state with

  mbrlen(NULL, 0, &ps));

The glibc documentation for mbrlen(3) at

  https://www.gnu.org/software/libc/manual/html_node/Converting-a-Character.html#Converting-a-Character

does not mention initialization by passing in a null pointer for the
string, only a pointer to a NUL wide character.

   If the next multibyte character corresponds to the NUL wide character,
   the return value is 0. If the next n bytes form a valid multibyte
   character, the number of bytes belonging to this multibyte character
   byte sequence is returned.

Use memset(3) instead for mbstate_t initialization, as suggested in

  https://www.gnu.org/software/libc/manual/html_node/Keeping-the-state.html

with the hope that this is more portable.

While at it, add a few basic test cases. These are in a new file because
they need fresh_perl_is() from test.pl while the existing ones use
Test::More (and conversion of at least posix.t looks way too involved.)

Bug-Ubuntu: https://bugs.launchpad.net/bugs/1818953

2 years agoPATCH: [perl #132928] Save some bytes
Karl Williamson [Sat, 23 Mar 2019 17:01:58 +0000 (11:01 -0600)]
PATCH: [perl #132928] Save some bytes

This takes Zefram's approach to avoid duplicated string constants on
some compilers

2 years agoperldelta: Add errata for 5.29.9 perldelta
Karl Williamson [Sat, 23 Mar 2019 16:36:59 +0000 (10:36 -0600)]
perldelta: Add errata for 5.29.9 perldelta

2 years agoreg_mesg.t: Add missing '#' comment indicator
Karl Williamson [Sat, 23 Mar 2019 16:25:32 +0000 (10:25 -0600)]
reg_mesg.t: Add missing '#' comment indicator

For d9a91485293e1414746fd028b3782f699519105e.

2 years agoPATCH: [perl #132851] Empty /(?)/
Karl Williamson [Sat, 23 Mar 2019 16:16:16 +0000 (10:16 -0600)]
PATCH: [perl #132851] Empty /(?)/

This changes perlre to note that zero modifiers are allowed in the
(?...) construct, but changes the code to warn about this no-op, but
only under "use re 'strict'".

2 years agoPATCH: [perl #133984] Failure in lookbehind
Karl Williamson [Fri, 22 Mar 2019 20:54:33 +0000 (14:54 -0600)]
PATCH: [perl #133984] Failure in lookbehind

I thought that lookbehind assertions weren't supposed to look beyond the
current position; but this CPAN module demonstrates that they can look
ahead as well.

I built some infrastructure to prevent them from looking ahead.  In
part, this is because Unicode recommends that pattern matching have the
ability to restrict the area of the target being matched.  That
infrastructure is not needed at this time.  But I think we should leave
it in for now anyway, as we see what other bugs the variable length
lookbehind changes may have caused.

So this patch just takes the easy way out, and at the place where it
would restrict the area searched, it uses the full width.  It's a one
line change.

2 years agoPATCH: [perl #133889] Assertion failure
Karl Williamson [Fri, 22 Mar 2019 17:32:32 +0000 (11:32 -0600)]
PATCH: [perl #133889] Assertion failure

I did not bisect this, but this is a regression.

This code is using a user-defined property that isn't defined.  It
should catch that and, since this is within regex sets,  quit, but
instead continues and ends up using an undefined value.

2 years agohandy.h: Change some macros to use new inRANGE
Karl Williamson [Thu, 21 Mar 2019 16:14:37 +0000 (10:14 -0600)]
handy.h: Change some macros to use new inRANGE

It turns out that on ASCII platforms, several of the character classes
are expressible as a single range, and using the new inRANGE macro saves
some instructions each time versus the array lookup still done for these
on EBCDIC platforms.  Here is a sample benchmark

Key:
    Ir   Instruction read
    Dr   Data read
    Dw   Data write
    COND conditional branches
    IND  indirect branches

The numbers represent raw counts per loop iteration.

isDIGIT_A('5')

       blead  hack Ratio %
       ----- ----- -------
    Ir 358.0 355.0   100.8
    Dr 123.0 121.0   101.7
    Dw  57.0  57.0   100.0
  COND  51.0  50.0   102.0
   IND   7.0   7.0   100.0

The differences are small, but these macros are executed ubiquitously

2 years agoGeneralize macro and move to handy.h
Karl Williamson [Wed, 20 Mar 2019 21:31:03 +0000 (15:31 -0600)]
Generalize macro and move to handy.h

The macro verified that its input was in the range '1' to '9' by using a
subtraction and a single conditional.  This commit generalizes this
non-obvious method of avoiding a conditional, and moves it to handy.h so
it can be used in other places.

2 years agoPATCH: [perl #133880] assertion failure
Karl Williamson [Thu, 21 Mar 2019 15:35:49 +0000 (09:35 -0600)]
PATCH: [perl #133880] assertion failure

This was caused by attempting to continue parsing after an error is
found, and later assuming that what came before was valid.  The fix is
to put in something valid that's usable until the parse eventually dies
from what caused this, or some other error.

2 years agolocale.c: White-space, comment only
Karl Williamson [Thu, 21 Mar 2019 15:02:24 +0000 (09:02 -0600)]
locale.c: White-space, comment only

Indent a block newly formed in the previous commit.
Wrap some too-long lines

2 years agolocale.c: Don't try to recreate the LC_ALL C locale
Karl Williamson [Thu, 21 Mar 2019 04:59:39 +0000 (22:59 -0600)]
locale.c: Don't try to recreate the LC_ALL C locale

On threaded perls, we create a locale object for LC_ALL "C" early in the
startup phase.  When the user asks for that locale, we can just switch
to it instead of trying to create a new one.

Doing the creation worked, but ended up with a memory leak.  My guess,
and its only a guess, is that it's a bug in glibc newlocale.c, in which
it does an early return, not doing proper cleanup, when it discovers it
can re-use an existing locale without needing to create a new one.

The reason I think its a glibc bug is that the sample one-liner sent
to me

PERL_DESTRUCT_LEVEL=2 valgrind --leak-check=full ./perl -DLv -Ilib -e'require POSIX;POSIX::setlocale(&POSIX::LC_ALL, "C");' 2>&1 | more

produced a stack output of where the leaked memory had been allocated.
I put a print immediately after that line, and prints at the points
where things get freed.  Every allocation was matched by an attempt to
free it.  But clearly at least one failed.  freelocale() returns void,
so can't be checked for failing.

Anyway, it's better to try not to create a new locale when we already
have an existing one, and doing so, as this commit does, causes the leak
to go away.

No tests are added, as there are plenty of similar tests already in the
suite, and they all should have been leaking.

2 years agoAdd, improve some debugging stmts for -DL (locales)
Karl Williamson [Thu, 21 Mar 2019 04:58:38 +0000 (22:58 -0600)]
Add, improve some debugging stmts for -DL (locales)

2 years agoperldelta: Rmv extraneous =back
Karl Williamson [Thu, 21 Mar 2019 16:46:33 +0000 (10:46 -0600)]
perldelta: Rmv extraneous =back

2 years agoUpdate Module::CoreList for 5.29.10
Zak B. Elep [Thu, 21 Mar 2019 16:18:23 +0000 (00:18 +0800)]
Update Module::CoreList for 5.29.10

Also fix the 5.29.9 `changed` key a bit to reflect commit
c15407c8b80c36d88f9038e7519e468ffd132da5.

2 years agoBump the perl version in various places for 5.29.10
Zak B. Elep [Thu, 21 Mar 2019 15:08:29 +0000 (23:08 +0800)]
Bump the perl version in various places for 5.29.10

2 years agoNew perldelta for 5.29.10
Zak B. Elep [Thu, 21 Mar 2019 12:54:06 +0000 (20:54 +0800)]
New perldelta for 5.29.10

2 years agoTick off 5.29.9!
Zak B. Elep [Thu, 21 Mar 2019 12:35:44 +0000 (20:35 +0800)]
Tick off 5.29.9!

2 years agoEpigraph for 5.29.9
Zak B. Elep [Thu, 21 Mar 2019 12:34:38 +0000 (20:34 +0800)]
Epigraph for 5.29.9

2 years agoEnsure autogenerated files for Devel::PPPort are up to date v5.29.9
Zak B. Elep [Wed, 20 Mar 2019 20:19:08 +0000 (04:19 +0800)]
Ensure autogenerated files for Devel::PPPort are up to date

`make regen` in dist/Devel-PPPort, thanks ether and Pali for guidance!

2 years agoAdd myself to AUTHORS
Zak B. Elep [Wed, 20 Mar 2019 18:02:55 +0000 (02:02 +0800)]
Add myself to AUTHORS

2 years agoAdd 5.29.9 release to pod/perlhist
Zak B. Elep [Wed, 20 Mar 2019 17:52:08 +0000 (01:52 +0800)]
Add 5.29.9 release to pod/perlhist

2 years agoUpdate perldelta for 5.29.9 release
Zak B. Elep [Wed, 20 Mar 2019 17:39:33 +0000 (01:39 +0800)]
Update perldelta for 5.29.9 release

2 years agoUpdate Module::CoreList for 5.29.9
Zak B. Elep [Wed, 20 Mar 2019 16:57:33 +0000 (00:57 +0800)]
Update Module::CoreList for 5.29.9

2 years agoFix $JSON::PP::Boolean::VERSION
Zak B. Elep [Wed, 20 Mar 2019 16:14:52 +0000 (00:14 +0800)]
Fix $JSON::PP::Boolean::VERSION

Match to the correct version of JSON::PP already installed in commit
929e53be972b0c811eca54a3c7017db116f62e4a.

2 years agoPorting/Maintainers.pl: vutil.c is CUSTOMIZED once more
Zak B. Elep [Wed, 20 Mar 2019 15:52:00 +0000 (23:52 +0800)]
Porting/Maintainers.pl: vutil.c is CUSTOMIZED once more

Commit 8633b5394e9f1be292f2b13d5f642a205ae31509 updated vutil.c from the
'version' CPAN distribution but seems to have missed updating the
corresponding Maintainers.pl key; this change also needs pushing to
upstream as well.

2 years agoAdd common UTF-8 first byte to ANYOFH regnodes
Karl Williamson [Wed, 20 Mar 2019 17:47:15 +0000 (11:47 -0600)]
Add common UTF-8 first byte to ANYOFH regnodes

An ANYOFH regnode is generated instead of a plain ANYOF one when
nothing it can match is in the bitmap used in ANYOF nodes.  It is
therefore smaller as the 4 word (or more) bitmap is omitted.

This means that for it to match a target string, that string must be
UTF-8 (since the bitmap is for at least the lowest 256 code points).
And only in rare circumstances are there any flags associated with it in
the regnode flags field.

This commit changes things so that the flags field in an ANYOFH node is
repurposed to be the first UTF-8 encoded byte of every code point
matched by the class if there is a common byte for all of them; or 0 if
some have different first bytes.

(That means that those rare cases where the flags field isn't otherwise
empty can no longer be ANYOFH nodes.)

The purpose of this is so that a future commit can take advantage of
this, and more quickly scan the target string for places that this node
can match.  A problem with ANYOF nodes is that they are code point
oriented (U32 or U64), and the target string is UTF-8, so conversion has
to be done.  By having the partial conversion compiled in, we can look
for that at runtime instead of having to look at every character in the
scan.

2 years agoBump Devel::PPPort to keep in sync with CPAN
Nicolas R [Tue, 19 Mar 2019 20:57:51 +0000 (14:57 -0600)]
Bump Devel::PPPort to keep in sync with CPAN

During Perl 5.29.8 release, Devel-PPPort was uploaded
to CPAN but the distro was incomplete as unit tests
were not part of the submitted tarball.

To fix this, a new 3.45 version was published to CPAN.
This commit, keep blead in sync with this change.

2 years agoPATCH: [perl #133937] Assertion failure
Karl Williamson [Tue, 19 Mar 2019 18:37:04 +0000 (12:37 -0600)]
PATCH: [perl #133937] Assertion failure

This recently added assertion actually caught an error, which is a
potential read beyond end of buffer.  This doesn't actually happen in
this case because this is a regular expression pattern, and the toker
makes sure there is a trailing NUL (that isn't counted).

The solution is to check the bounds before reading.

2 years agodquote.c: Prevent possible out-of-bounds read
Karl Williamson [Tue, 19 Mar 2019 18:21:49 +0000 (12:21 -0600)]
dquote.c: Prevent possible out-of-bounds read

This code read a byte that was potentially out-of-bounds.  I don't know
how it could get this far, but maybe some fuzzing code could get it.

2 years agoChange error wording for empty \x{}
Karl Williamson [Tue, 19 Mar 2019 18:14:26 +0000 (12:14 -0600)]
Change error wording for empty \x{}

An empty \x{} is unfortunately legal (returning a NUL) except in the
scope of "use re 'strict'".  Since this is an experimental feature,
things like wording changes are allowed.  It is unlikely anyone is
relying on the precise wording of this fatal error under 'strict', and
now all the messages for similar errors are similarly worded.

2 years agoChange error wording for \o{}
Karl Williamson [Tue, 19 Mar 2019 18:08:06 +0000 (12:08 -0600)]
Change error wording for \o{}

An empty \o{} no longer says "Number with no digits" in favor of "Empty
\o{}" which is more consistent with errors raised for things like \b{},
\P{}.

There is a small risk of breakage with this change, as with any
diagnostic wording change.  However, this construct is relatively new
and rarely used, and this is a fatal error, not a warning you might want
to trap on.  There are no empty \o{} instances in CPAN.

2 years agoMerge branch 'safer' into blead
Karl Williamson [Tue, 19 Mar 2019 16:25:06 +0000 (10:25 -0600)]
Merge branch 'safer' into blead

I undertook an audit to see where there might be places where malformed
UTF-8 input could cause us to exceed the boundaries of buffers.  I
looked for where hopping to other characters in the string and skipping
to the next character based on the current start byte.

This branch is the result of that.  Wherever I didn't see how exceeding
the bounds wasn't a problem, I changed to use the safer versions of the
hop and skip operations that we already have.  As an example of where it
isn't a problem is when doing the operation is at the end of a loop
iteration, and the loop tests if we've exceeded it, with the result that
the loop just stops executing.

I may have missed things, and  may have changed to unnecessarily use the
safer operations in places

2 years agoregexec.c: Use safe UTF8SKIP
Karl Williamson [Mon, 18 Mar 2019 17:02:23 +0000 (11:02 -0600)]
regexec.c: Use safe UTF8SKIP

2 years agoregexec.c: Use safer utf8_hop
Karl Williamson [Mon, 18 Mar 2019 17:09:22 +0000 (11:09 -0600)]
regexec.c: Use safer utf8_hop

2 years agoregcomp.c: Use safer utf8_hop
Karl Williamson [Mon, 18 Mar 2019 16:38:56 +0000 (10:38 -0600)]
regcomp.c: Use safer utf8_hop

2 years agoregcomp.c: Use safe UTF8SKIP
Karl Williamson [Tue, 19 Mar 2019 02:16:39 +0000 (20:16 -0600)]
regcomp.c: Use safe UTF8SKIP

2 years agopp_ctl.c: Use safe UTF8SKIP
Karl Williamson [Tue, 19 Mar 2019 01:48:48 +0000 (19:48 -0600)]
pp_ctl.c: Use safe UTF8SKIP

2 years agopp_pack.c: Use safe UTF8SKIP
Karl Williamson [Tue, 19 Mar 2019 01:27:57 +0000 (19:27 -0600)]
pp_pack.c: Use safe UTF8SKIP

2 years agopp.c: Use safer utf8_hop
Karl Williamson [Mon, 18 Mar 2019 16:29:46 +0000 (10:29 -0600)]
pp.c: Use safer utf8_hop

2 years agoregexec.c: Add comments
Karl Williamson [Tue, 19 Mar 2019 03:43:34 +0000 (21:43 -0600)]
regexec.c: Add comments