| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
|
| |
Its a bit confusing having both S_delimcpy() and Perl_delimcpy()
functions.
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
[perl #129064] heap-buffer-overflow S_scan_heredoc
[perl #129176] Conditional jump depends on uninitialized values in
S_scan_heredoc
Perl_delimcpy() is supposed to copy a delimited string to another buffer;
it handles \-<delimiter> escapes, but if the backslash is the last
character in the src buffer, it could overrun the end of the buffer
slightly.
Also document a bit better what this function is supposed to do.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
$ cat > foo
#!/usr/bin/perl
print "What?!\n"
^D
$ chmod +x foo
$ ./perl -Ilib -Te '$ENV{PATH}="."; exec "foo"'
Insecure directory in $ENV{PATH} while running with -T switch at -e line 1.
That is what I expect to see. But:
$ ./perl -Ilib -Te '$ENV{PATH}="/\\:."; exec "foo"'
What?!
Perl is allowing the \ to escape the :, but the \ is not treated as an
escape by the system, allowing a relative path in PATH to be consid-
ered safe.
|
| |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
in the usequadmath branch, gcc is too clever for its own good:
PERL_UNUSED_ARG(ap);
gives:
util.c:5299:18: warning: ‘sizeof’ on array function parameter ‘ap’ will
return size of ‘__va_list_tag *’ [-Wsizeof-array-argument]
Stick in a void* cast to shut it up.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
fea1d2dd5d210564d4 turned instr into a macro. It also left the
actual function in util.c while commenting out the prototype
in proto.h (via the m flag in embed.fnc).
A function compiled without a prototype under C++ does not get
declared with extern "C" and thus gets mangled, which breaks the
build with a strict linker (VMS, possibly AIX) because the
expected symbol name is no longer produced. Without a strict
linker, it just breaks the binary compatibility that was presumably
the nominal reason for leaving the function around in the first
place.
So move the function into mathoms.c and put its prototype in the
extern "C"-guarded section at the top of the same file.
We also have to fake the PERL_ARGS_ASSERT_INSTR macro since its
original declaration in proto.h is commented out but the porting
test t/porting/args_assert.t will take revenge if it doesn't
find the macro being used somewhere.
|
|
|
|
|
|
|
|
| |
It had rotted a bit Well, more than one probably.
Move the declarations of the functions Perl_mem_log_alloc etc from handy.h
into embed.fnc where whey belong, and where Malloc_t will have already
been defined.
|
| |
|
| |
|
|
|
|
| |
Fix a thinko in 22ff3130.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This commit:
1. Renames the various dtrace probe macros into a consistent and
self-documenting pattern, e.g.
ENTRY_PROBE => PERL_DTRACE_PROBE_ENTRY
RETURN_PROBE => PERL_DTRACE_PROBE_RETURN
Since they're supposed to be defined only under PERL_CORE, this shouldn't
break anything that's not being naughty.
2. Implement the main body of these macros using a real function.
They were formerly defined along the lines of
if (PERL_SUB_ENTRY_ENABLED())
PERL_SUB_ENTRY(...);
The PERL_SUB_ENTRY() part is a macro generated by the dtrace system, which
for example on linux expands to a large bunch of assembly directives.
Replace the direct macro with a function wrapper, e.g.
if (PERL_SUB_ENTRY_ENABLED())
Perl_dtrace_probe_call(aTHX_ cv, TRUE);
This reduces to once the number of times the macro is expanded.
The new functions also take simpler args and then process the values they
need using intermediate temporary vars to avoid huge macro expansions.
For example
ENTRY_PROBE(CvNAMED(cv)
? HEK_KEY(CvNAME_HEK(cv))
: GvENAME(CvGV(cv)),
CopFILE((const COP *)CvSTART(cv)),
CopLINE((const COP *)CvSTART(cv)),
CopSTASHPV((const COP *)CvSTART(cv)));
is now
PERL_DTRACE_PROBE_ENTRY(cv);
This reduces the executable size by 1K on -O2 -Dusedtrace builds,
and by 45K on -DDEBUGGING -Dusedtrace builds.
|
|
|
|
|
|
|
| |
popen(): handle better the case where the popened external
might exit before the child process manages to start.
pclose(): protect with a semaphore.
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
|
|
|
|
|
|
|
| |
My change in e396210 was incomplete, that change was intended to
force use of setenv()/unsetenv() on Darwin, but ended up using putenv()
instead, which is a leaky mechanism.
Added darwin to the list of many others that work better with setenv()/
unsetenv().
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
util.c:2729:1: warning: mutex 'PL_perlio_mutex' is still held at the end of function [-Wthread-safety-analysis]
}
util.c:2729:1: warning: mutex 'PL_op_mutex' is still held at the end of function [-Wthread-safety-analysis]
}
util.c:2739:5: warning: releasing mutex 'PL_perlio_mutex' that was not held [-Wthread-safety-analysis]
MUTEX_UNLOCK(&PL_perlio_mutex);
util.c:2744:5: warning: releasing mutex 'PL_op_mutex' that was not held [-Wthread-safety-analysis]
OP_REFCNT_UNLOCK;
|
|
|
|
|
|
|
|
|
|
|
|
| |
http://clang.llvm.org/docs/ThreadSafetyAnalysis.html
Static (compile-time) annotations for declaring the multithreaded
behavior of functions, variables, and capabilities (like mutexes).
Available since about clang 3.5.
./Configure -des -Dusedevel -Dusethreads -Dcc=clang -Accflags='-Wthread-safety'
clang -Wthread-safety then checks the validity of the annotations.
|
|
|
|
|
|
|
|
| |
In 97466d2cbf895b I added a declaration at function scope, but in
some paths that was overridden at an inner scope, leaving the
function-level one declared but not used. So lets go back to the
original intent of 45a23732c73c8 and have a separate declaration
in each block that needs it.
|
|
|
|
|
|
|
| |
This reverts commit 97466d2cbf895b35ac41b8bf7c31db955b52d48e.
Adding a declaration at function scope causes unused variable
warnings when there are paths that redeclare it at an inner scope.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
TL;DR: on platforms with a libc memchr() implementation which makes good
use of underlying hardware support, patterns which include fixed
substrings will now often be much faster; for example with glibc on on a
recent x86_64 CPU, this:
$s = "a" x 1000 . "wxyz";
$s =~ /wxyz/ for 1..30000
is now about 7 times faster. On systems with slow memchr(), e.g. 32-bit
ARM Raspberry Pi, there will be a small or little speedup. Conversely,
some pathological cases, such as "ab" x 1000 =~ /aa/ will be slower now;
up to 3 times slower on the rPi, 1.5x slower on x86_64.
In detail:
The perl core includes a Boyer-Moore substring matcher, Perl_fbm_instr(),
which is used to quickly find a fixed substring within a longer string,
where a table of lookups is pre-computed from the substring. As well as
being used in index() when the substring is a constant, its main use
is in patterns. When the regex engine compiles a pattern, it typically
takes note of the two longest fixed substrings within the pattern; for
example in
/[01]abc\w+de\d+fghij+/
the two longest are "abc" and "fghij". The engine uses Perl_fbm_instr() to
scan for these two strings before running the full NFA. This often allows
the string to be quickly rejected, or to find a suitable minimum starting
point to run the NFA.
However, Perl_fbm_instr() was written about 16 years ago and has been
virtually untouched since, so it could do with some love.
It currently special-cases strings of length 1 and 2, using roll-your-own
loops along the lines of
while (s < end) { if (*s++ = c1) ... }
while strings of length 3+ use the Boyer-Moore algorithm. The big
advantage of BM is that in a best-case, where none of the characters from
the substring are found in this region of the string, it only has to test
every N'th char, where N is length of the substring. For example when
searching for wxyz in abcdefghikl..., it just reads and tests d,h,l,..
However these days some platforms have decent memchr() implementations.
For example, glibc has assembly-level implementations for i386, x86_64,
sparc32/64, powerpc32/64, s390-32/64, arm, m68k and ia64 by the looks of
it. These can often be substantially faster than a C-level implementation.
This commit makes Perl_fbm_instr() use memchr() where possible.
For the length == 1 special case, it just calls memchr() directly rather
than using a loop as previously.
For the length == 2 special case, it continues to distinguish the cases
where the two chars of the substring are the same or differ. For the
former it calls memchr() after an initial direct failure, i.e.
if (*s != c) { s++; s = memchr(....); ... }
For the latter case it does a similar direct test first (to avoid the
costly overhead of a call to memchr() when the next char is the one we
seek anyway), but in addition, on each failure to find the second char
following a found first char, it swaps which char it's searching for.
This means that in something like "aaaaaaa..." =~ /ab/, it wont keep
hopping 1 char position with memchar(s,'a'); after the first hop it
will do memchr(s,'b') and skip lots of chars in one go. This helps reduce
the number of pathological cases.
For the length >= 3 cases (normal BM), it keeps using BM, but after each
iteration where the pointer has been incremented by the skip determined by
the BM algorithm, it now does an additional
if (*s != c) { s++; s = memchr(....); ... }
step before running the next iteration of BM.
|
|
|
|
|
| |
Expand the commentary at the start of this function; add more blank lines
to separate chunks of code, and document what SVpbm_TAIL is for.
|
|
|
|
|
| |
The VMS-specific corner of the ifdef jungle ended up using
statbuf without declaring it, so add a declaration.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Perl_nextargv has to have access to the Stat_t that is written to inside
S_openn_cleanup or else run/switches.t, io/argv.t, io/inplace.t, and
io/iprefix.t will fail. Removing the uses of PL_statbuf that are using
PL_statbuf due to historical reason, and not using PL_statbuf to pass data
between different funcs/different callstacks. This patch makes it easier to
remove PL_statbuf in the future since the number uses of it has been
reduced.
-in Perl_apply move SETERRNO before tot--; so the branch can be combined
with other "tot--;" branches by CC optmizer
-combine 2 Perl_croak(aTHX_ "Illegal suidscript"); statements in
S_validate_suid to make code look simpler, drop my_perl arg for space
efficiency on threads of rarely executed code
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
|
|
| |
Removes 'the' in front of parameter names in some instances.
|
|
|
|
|
|
|
|
| |
This may break places which have the FD_CLOEXEC functionality
but do not have the FD_CLOEXEC define.
In any case, using a boolean for the F_SETFD flag is icky.
Using an explicit 1 is also dubious.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
1st problem, *{"_<$filename"} globs aren't created for PP code unless
PERLDB_LINE || PERLDB_SAVESRC are on (see Perl_yylex ). Creating XSUBs
unconditionally created the *{"_<$filename"} globs for XSUB, even if PP
subs were not getting the debugging globs created. This is probably an
oversight, from commit b195d4879f which tried to deprecate using
the *{"_<$filename"} GVs for storing the originating filename of the CV
which was partially reverted 2 months later in commit 57843af05b with
CvFILE becoming a char * instead of GV *. To speed up XSUB registration
time, and decrease memory when not in Perl lang debugging mode dont create
the debugging globs for XSUBs unless in Perl lang debugging mode.
see also
http://www.nntp.perl.org/group/perl.perl5.porters/2000/06/msg13832.html
2nd problem, since the perl debugger can't step into C code, nor set
breakpoints in it, there is no reason to create *{"_<$filename"} globs
for .c files. Since someone maybe one day might try to implement that
feature, comment out the code instead of deleting it. This will slightly
reduce the size of perl binary, and speed up XSUB registration time, and
decrease memory usage when using the Perl debugger.
see also (no responses)
http://www.nntp.perl.org/group/perl.perl5.porters/2015/06/msg229014.html
perl has a number of core perma-XSUBs
(UNIVERSAL/PerlIO/DynaLoader/Internals/mro/misc const subs/etc). Each of
these previously got a "_<foo.c" glob. I counted 7 .c debugging globs on
my perl. This commit, before on WinXP, running threaded perl with
-e"system 'pause'" as a sample script, "Private Bytes" (all process
unique memory, IE not shared, not mmaped) was 488 KB, after this commit
it was 484 KB, which means that enough malloc memory was saved plus a
little bit of chance, to cross one 4 KB page of memory. IDK the exact
amount of saved memory is over or under 4KB.
|
| |
|
|
|
|
| |
Builds on top of 16d89be8.
|
|
|
|
|
| |
VMS has had gettimeofday() since v7.0, released in 1999, so there's
no reason now to be special casing native workarounds.
|
|
|
|
|
|
|
| |
Commit 22ff313068 for [perl #123814] inadvertently changed the logic when
parsing a numeric parameter to the -C option, such that the successfully
parsed number was not saved as the option value if it parsed to the end
of the argument.
|
| |
|
|
|
|
|
|
| |
This reverts commit d28a9254e445aee7212523d9a7ff62ae0a743fec.
Turns out we need save_re_context() after all
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
An empty cpan/.dir-locals.el stops Emacs using the core defaults for
code imported from CPAN.
Committer's work:
To keep t/porting/cmp_version.t and t/porting/utils.t happy, $VERSION needed
to be incremented in many files, including throughout dist/PathTools.
perldelta entry for module updates.
Add two Emacs control files to MANIFEST; re-sort MANIFEST.
For: RT #124119.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
For lots of core functions:
if a function parameter has been declared NN in embed.fnc, don't test for
nullness at the start of the function, i.e. eliminate code like
if (!foo) ...
On debugging builds the test is redundant, as the PERL_ARGS_ASSERT_FOO
at the start of the function will already have croaked.
On optimised builds, it will skip the check (and so be slightly faster),
but if actually passed a null arg, will now crash with a null-deref SEGV
rather than doing whatever the check used to do (e.g. croak, or silently
return and let the caller's code logic to go awry). But hopefully this
should never happen as such instances will already have been detected on
debugging builds.
It also has the advantage of shutting up recent clangs which spew forth
lots of stuff like:
sv.c:6308:10: warning: nonnull parameter 'bigstr' will evaluate to
'true' on first encounter [-Wpointer-bool-conversion]
if (!bigstr)
The only exception was in dump.c, where rather than skipping the null
test, I instead changed the function def in embed.fnc to allow a null arg,
on the basis that dump functions are often used for debugging (where
pointers may unexpectedly become NULL) and it's better there to display
that this item is null than to SEGV.
See the p5p thread starting at 20150224112829.GG28599@iabyn.com.
|
|
|
|
|
|
|
|
|
|
|
|
| |
Some questions and loose ends:
XXX gv.c:S_gv_magicalize - why are we using SSize_t for paren?
XXX mg.c:Perl_magic_set - need appopriate error handling for $)
XXX regcomp.c:S_reg - need to check if we do the right thing if parno
was not grokked
Perl_get_debug_opts should probably return something unsigned; not sure
if that's something we can change.
|
|
|
|
|
|
| |
Both needed: the macro is for compilers, the comment for static checkers.
(This doesn't address whether each spot is correct and necessary.)
|