summaryrefslogtreecommitdiff
path: root/mg.h
diff options
context:
space:
mode:
authorFather Chrysostomos <sprout@cpan.org>2013-07-21 00:38:28 -0700
committerFather Chrysostomos <sprout@cpan.org>2013-07-23 14:53:23 -0700
commit6174b39a88cd48740c024cfb6035edb6ffed9f2d (patch)
tree07f2c3b7d17fa361cd5fa1252b14b4a739fb2c60 /mg.h
parentef54055c17bc9effcdf6a8135d2b375b7c35dd62 (diff)
downloadperl-6174b39a88cd48740c024cfb6035edb6ffed9f2d.tar.gz
[perl #72766] Allow huge pos() settings
This is part of #116907, too. It also fixes #72924 as a side effect; the next commit will explain. The value of pos($foo) was being stored as an I32, not allowing values above I32_MAX. Change it to SSize_t (the signed equivalent of size_t, representing the maximum string length the OS/compiler supports). This is accomplished by changing the size of the entry in the magic struct, which is the simplest fix. Other parts of the code base can benefit from this, too. We actually cast the pos value to STRLEN (size_t) when reading it, to allow *very* long strings. Only the value -1 is special, meaning there is no pos. So the maximum supported offset is 2**sizeof(size_t)-2. The regexp engine itself still cannot handle large strings, so being able to set pos to large values is useless right now. This is but one piece in a larger puzzle. Changing the size of mg->mg_len also requires that Perl_hv_placeholders_p change its type. This function should in fact not be in the API, since it exists solely to implement the HvPLACEHOLDERS macro. See <https://rt.perl.org/rt3/Ticket/Display.html?id=116907#txn-1237043>.
Diffstat (limited to 'mg.h')
-rw-r--r--mg.h2
1 files changed, 1 insertions, 1 deletions
diff --git a/mg.h b/mg.h
index 4114941526..de673d4243 100644
--- a/mg.h
+++ b/mg.h
@@ -26,7 +26,7 @@ struct magic {
U16 mg_private;
char mg_type;
U8 mg_flags;
- I32 mg_len;
+ SSize_t mg_len;
SV* mg_obj;
char* mg_ptr;
};