| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
|
| |
In the given test case, Perl_atof2() would run off the end of the PV,
producing an error from ASAN.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
- for the originally reported case, if the start/cur pointer is in the
top 75% of the address space the add (cur) + glen addition would
overflow, resulting in the condition failing incorrectly.
- the addition of the existing space used to the space needed could
overflow, resulting in too small an allocation and a buffer overflow.
- the scaling for UTF8 could overflow.
- the multiply to calculate the space needed for many items could
overflow.
For the first case, do a space calculation without making new pointers.
For the other cases, detect the overflow and croak if there's an
overflow.
Originally this used Size_t_MAX as the maximum size of a memory
allocation, but for -DDEBUGGING builds realloc() throws a panic for
allocations over half the address space in size, changing the error
reported for the allocation.
For non-DEBUGGING builds the Size_t_MAX limit has the small chance
of finding a system that has 3GB of contiguous space available, and
allocating that space, which could be a denial of servce in some cases.
Unfortunately changing the limit to half the address space means that
the exact case with the original issue can no longer occur, so the
test is no longer testing against the address + length issue that
caused the original problem, since the allocation is failing earlier.
One option would be to change the test so the size request by pack is
just under 2GB, but this has a higher (but still low) probability that
the system has the address space available, and will actually try to
allocate the memory, so let's not do that.
|
|
|
|
|
|
| |
In grepping the source, I noticed that several arrays that are for
holding UTF-8 characters did not allow space for a trailing NUL. This
commit adds that.
|
|
|
|
|
|
| |
Most size-type variables in pp_pack.c were of type I32, with a
smattering of other types. Use SSize_t in place of I32, and generally
use size_t-width variables as appropriate. Fixes [perl #119367].
|
|
|
|
|
|
| |
The latter is generally faster when the length is already known.
This commit also changes a few hard-coded numbers to use sizeof().
|
|
|
|
|
| |
The latter is much clearer as to what's going on, and the programmer and
program reader don't have to count characters.
|
| |
|
| |
|
|
|
|
|
|
|
| |
This function only sets *retlen to 0 if the input length is 0. In all
but one case, the function was not called with with that input. In that
one case, I changed to avoid calling the function with that input.
Hence we can remove checking *retlen for 0.
|
|
|
|
|
|
|
|
|
|
| |
This code effectively reduced to
if (foo) 0 else 0
because a #define was changed to 0 some releases ago. Just replace by
0
|
| |
|
|
|
|
|
|
|
| |
The previous commit added this feature; now this commit uses it in core.
toke.c is deferred to the next commit to aid in possible future
bisecting, because some of the changes there seem somewhat more likely
to expose bugs.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
C++11 requires space between the end of a string literal and a macro, so
that a feature can unambiguously be added to the language. Starting in
g++ 6.2, the compiler emits a warning when there isn't a space
(presumably so that future versions can support C++11). Unfortunately
there are many such instances in the perl core. This commit fixes
those, including those in ext/, but individual commits will be used for
the other modules, those in dist/ and cpan/.
This commit also inserts space at the end of a macro before a string
literal, even though that is not deprecated, and removes useless ""
literals following a macro (instead of inserting a blank). The result
is easier to read, making the macro stand out, and be clearer as to the
intention.
Code and modules included with the Perl core need to be compilable using
C++. This is so that perl can be embedded in C++ programs. (Actually,
only the hdr files need to be so compilable, but it would be hard to
test that just the hdrs are compilable.) So we need to accommodate
changes to the C++ language.
|
| |
|
|
|
|
|
| |
A value may legitimately be marked SvTEMP even when it is not about
to be freed.
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Mainly to avoid Inf and NaN, which VAX does does not have.
There is something like Inf called "excess" but that is
a deadly exception, seems to manifest itself in vax-netbsd
either as a SIGFPE or SIGSEGV (pretty much untrappable at
least from Perl level).
The range of VAX floats is different from IEEE.
There is positive zero, but no negative zero.
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The value of gimme stored in the context stack is U8.
Make all other uses in the main core consistent with this.
My primary motivation on this was that the new function cx_pushblock(),
which I gave a 'U8 gimme' parameter, was generating warnings where callers
were passing I32 gimme vars to it. Rather than play whack-a-mole, it
seemed simpler to just uniformly use U8 everywhere.
Porting/bench.pl shows a consistent reduction of about 2 instructions on
the loop and sub benchmarks, so this change isn't harming performance.
|
|
|
|
|
| |
With a utf8 target but a non-utf8 source, pack Hh would read past the
end of the source when given a length, due to an incorrect condition.
|
|
|
|
| |
Removes 'the' in front of parameter names in some instances.
|
|
|
|
| |
unpack '%65...' failures, to be more exact.
|
| |
|
| |
|
|
|
|
|
|
|
| |
VC6 was returning either packed float +inf or packed float -inf
(I dont remember) instead of packed float NAN in t/op/infnan.t .
This fixes #125203
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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.
|
|
|
|
|
|
|
|
|
|
|
| |
This was introduced by 9df874cdaa2f196cc11fbd7b82a85690c243eb9f
in changing the name of some static functions. I didn't realize at the
time that the function was defined in embed.fnc, as none of the others
are, and it was always called with the S_ prefix form. Nor did I notice
the compiler warnings.
It turns out that the base name of this function is the same as a public
function, so I've renamed it to have prefix 'S_my_'.
|
|
|
|
|
| |
NEXTFROM() modified the item count while testing it, so the next use
saw the count (of -1) as non-zero and ended up trying to write ~1 bytes.
|
|
|
|
|
| |
This outdents some code whose enclosing block was removed in the
previous commit
|
|
|
|
|
|
|
|
| |
As noted in the thread starting at
http://nntp.perl.org/group/perl.perl5.porters/223366
and in the comments added in this commit, strings packed in 'u' format
don't need any UTF-8ness special handling, so the code that did that can
be removed.
|
|
|
|
|
| |
This commit causes the same code to be executed whether on an ASCII or
EBCDIC platform.
|
|
|
|
|
| |
Early code tends to conflate the terms Unicode and UTF-8. I find that
confusing.
|
|
|
|
|
|
|
|
|
|
| |
Treat the string as U8* rather than char* when doing all the
bit shifts for uuencode. That stops these warnings under ASan:
pp_pack.c:1890:34: runtime error: left shift of negative value -127
pp_pack.c:1891:34: runtime error: left shift of negative value -126
pp_pack.c:1899:34: runtime error: left shift of negative value -1
pp_pack.c:1900:30: runtime error: left shift of negative value -31
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The C standard says that the value of the expression (float)double_var is
undefined if 'the value being converted is outside the range of values
that can be represented'.
So to shut up -fsanitize=undefined:
my $p = pack 'f', 1.36514538e67;
giving
runtime error: value 1.36515e+67 is outside the range of representable values of type 'float'
explicitly handle the out of range values.
Something similar is already done under defined(VMS) && !defined(_IEEE_FP),
except that there it floors to +/- FLT_MAX rather than +/- (float)NV_INF.
I don't know which branch is best, and whether they should be merged.
This fix was suggested by Aaron Crane.
|
|
|
|
| |
See <20141130160250.GC31019@pjcj.net>. Commit 354b74ae6f broke this.
|
|
|
|
| |
The 'U' pack/unpack format must be in terms of Unicode code points.
|
| |
|
| |
|
| |
|
|
|
|
| |
At Jarkko Hietaniemi’s suggestion.
|
| |
|
|
|
|
|
|
|
| |
sprintf, pack and chr were treating 0+"Inf" and "Inf" differently,
even though they have the same string and numeric values.
pack was also croaking for 0+"Inf" passed to a string format.
|
|
|
|
| |
Also make the type I32, not char.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
In pack: No point in trying to return all-bit-off/all-bits-one
because inf/-inf/nan really don't map sensibly into integers.
In printf-%c/chr: while U+FFFD would be an option, better to die
on such weird input.
pack-as-fp still works, sprintf-numeric still works.
Make t/op/infnan.t to be less fragile about the number of expected tests.
|
|
|
|
| |
(For inf, the existing code already did this, slowly.)
|
| |
|
| |
|
|
|
|
|
|
|
| |
Made them return the 0xFF byte (and warn). Not necessarily the best
choice, but there's not that much room in just 256 bytes for all of
the inf/-inf/nan. This same choice will need to be made with wider
integer packs.
|
|
|
|
|
|
|
|
| |
You need to configure with g++ *and* -Accflags=-DPERL_GLOBAL_STRUCT
or -Accflags=-DPERL_GLOBAL_STRUCT_PRIVATE to see any difference.
(g++ does not do the "post-annotation" form of "unused".)
The version code has some of these issues, reported upstream.
|