summaryrefslogtreecommitdiff
path: root/gv.c
diff options
context:
space:
mode:
authorMax Maischein <corion@corion.net>2011-05-22 21:36:57 -0700
committerFather Chrysostomos <sprout@cpan.org>2011-05-22 21:50:50 -0700
commit0e21945565eb4664d843bb819fb032cedee4d5a6 (patch)
treeb5b5ab6ecccabc65812e44ac0a5baefa3f5e5000 /gv.c
parent369fb445f856204b1f9717b96bde7cd9bb9da369 (diff)
downloadperl-0e21945565eb4664d843bb819fb032cedee4d5a6.tar.gz
Turn $$ into a magical readonly variable that always fetches getpid() instead of caching it
The intent is that by not caching $$, we eliminate one opportunity for bugs: If one embeds Perl or uses XS and calls fork(3) from C, Perls notion of $$ may go out of sync with what getpid() returns. By always fetching the value of $$ via getpid(), this bug opportunity is eliminated. The overhead of always fetching $$ should be small and is likely only used for tempfile creation, which should be dwarfed by file system accesses.
Diffstat (limited to 'gv.c')
-rw-r--r--gv.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/gv.c b/gv.c
index 72cc9f6c45..a003adb67e 100644
--- a/gv.c
+++ b/gv.c
@@ -1469,6 +1469,9 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags,
#endif
goto magicalize;
+ case '$': /* $$ */
+ SvREADONLY_on(GvSVn(gv));
+ goto magicalize;
case '!': /* $! */
GvMULTI_on(gv);
/* If %! has been used, automatically load Errno.pm. */