Imported Upstream version 5.22.2 27/136027/1
authorDongHun Kwak <dh0128.kwak@samsung.com>
Wed, 28 Jun 2017 01:41:39 +0000 (10:41 +0900)
committerDongHun Kwak <dh0128.kwak@samsung.com>
Wed, 28 Jun 2017 01:41:44 +0000 (10:41 +0900)
Change-Id: Ice69e63886eb044b5c2baa0817401e725c610370
Signed-off-by: DongHun Kwak <dh0128.kwak@samsung.com>
106 files changed:
Configure
Cross/config.sh-arm-linux
Cross/config.sh-arm-linux-n770
INSTALL
MANIFEST
META.json
META.yml
Makefile.SH
NetWare/Makefile
NetWare/config_H.wc
Porting/Glossary
Porting/checkAUTHORS.pl
Porting/config.sh
Porting/config_H
Porting/epigraphs.pod
Porting/perldelta_template.pod
Porting/release_managers_guide.pod
Porting/todo.pod
README.cygwin
README.haiku
README.macosx
README.os2
README.vms
config_h.SH
cop.h
dist/Module-CoreList/Changes
dist/Module-CoreList/lib/Module/CoreList.pm
dist/Module-CoreList/lib/Module/CoreList.pod
dist/Module-CoreList/lib/Module/CoreList/TieHashDelta.pm
dist/Module-CoreList/lib/Module/CoreList/Utils.pm
dist/PathTools/Cwd.pm
dist/PathTools/Cwd.xs
dist/PathTools/lib/File/Spec.pm
dist/PathTools/lib/File/Spec/Cygwin.pm
dist/PathTools/lib/File/Spec/Epoc.pm
dist/PathTools/lib/File/Spec/Functions.pm
dist/PathTools/lib/File/Spec/Mac.pm
dist/PathTools/lib/File/Spec/OS2.pm
dist/PathTools/lib/File/Spec/Unix.pm
dist/PathTools/lib/File/Spec/VMS.pm
dist/PathTools/lib/File/Spec/Win32.pm
dist/PathTools/t/taint.t
embed.fnc
embed.h
ext/XS-APItest/APItest.pm
ext/XS-APItest/APItest.xs
ext/XS-APItest/t/win32.t [new file with mode: 0644]
ext/XS-APItest/typemap
handy.h
hints/catamount.sh
hints/darwin.sh
intrpvar.h
lib/B/Op_private.pm
op.c
patchlevel.h
perl.c
perlio.c
plan9/config.plan9
plan9/config_sh.sample
pod/.gitignore
pod/perl5221delta.pod [new file with mode: 0644]
pod/perldelta.pod
pod/perldiag.pod
pod/perlfunc.pod
pod/perlhacktips.pod
pod/perlhist.pod
pod/perlport.pod
pod/perlref.pod
pp.c
pp_hot.c
pp_pack.c
pp_sys.c
proto.h
regcomp.c
sv.h
t/io/semctl.t
t/lib/croak/pp_sys [new file with mode: 0644]
t/lib/croak/toke
t/lib/strict/subs
t/lib/warnings/regcomp
t/op/attrs.t
t/op/eval.t
t/op/heredoc.t
t/op/hexfp.t
t/op/lc.t
t/op/list.t
t/op/method.t
t/op/pack.t
t/op/sprintf2.t
t/op/sub.t
t/op/tie_fetch_count.t
t/re/re_tests
t/re/subst.t
t/win32/crypt.t [new file with mode: 0644]
toke.c
uconfig.h
util.c
vms/descrip_mms.template
vms/vms.c
win32/Makefile
win32/config_H.gc
win32/config_H.vc
win32/fcrypt.c
win32/makefile.mk
win32/pod.mak
win32/vdir.h

index 0a405d3..5f5f279 100755 (executable)
--- a/Configure
+++ b/Configure
@@ -1299,6 +1299,7 @@ use64bitall=''
 use64bitint=''
 usecbacktrace=''
 dtrace=''
+dtraceobject=''
 usedtrace=''
 usefaststdio=''
 usekernprocpathname=''
@@ -1454,7 +1455,7 @@ libswanted_uselargefiles=''
 : set usesocks on the Configure command line to enable socks.
 : List of libraries we want.
 : If anyone needs extra -lxxx, put those in a hint file.
-libswanted="cl pthread socket bind inet nsl nm ndbm gdbm dbm db malloc dl ld"
+libswanted="cl pthread socket bind inet nsl ndbm gdbm dbm db malloc dl ld"
 libswanted="$libswanted sun m crypt sec util c cposix posix ucb bsd BSD"
 : We probably want to search /usr/shlib before most other libraries.
 : This is only used by the lib/ExtUtils/MakeMaker.pm routine extliblist.
@@ -6925,16 +6926,17 @@ int main() {
   }
 #endif
 /* For alignment 32-bit platforms have the 80 bits in 12 bytes,
- * while 64-bits platforms have it in 16 bytes. */
+ * while 64-bits platforms have it in 16 bytes.  The trailing bytes
+ * cannot be trusted. */
 #if LDBL_MANT_DIG == 64 && (LONGDBLSIZE == 16 || LONGDBLSIZE == 12)
-  if (b[0] == 0xCD && b[9] == 0xBF && b[10] == 0x00) {
+  if (b[0] == 0xCD && b[9] == 0xBF) {
     /* x86 80-bit little-endian, sizeof 12 (ILP32, Solaris x86)
      * or 16 (LP64, Linux and OS X), 4 or 6 bytes of padding.
      * Also known as "extended precision". */
     printf("3\n");
     exit(0);
   }
-  if (b[0] == 0xBF && b[9] == 0xCD && b[10] == 0x00) {
+  if (b[0] == 0xBF && b[9] == 0xCD) {
     /* is there ever big-endian 80-bit, really? */
     printf("4\n");
     exit(0);
@@ -6944,17 +6946,35 @@ int main() {
   /* software "double double", the 106 is 53+53.
    * but irix thinks it is 107. */
   if (b[0] == 0x9A && b[7] == 0x3C && b[8] == 0x9A && b[15] == 0xBF) {
-    /* double double 128-bit little-endian,
+    /* double double 128-bit fully little-endian,
+     * little-endian doubles in little-endian order,
      * 9a 99 99 99 99 99 59 3c 9a 99 99 99 99 99 b9 bf */
     printf("5\n");
     exit(0);
   }
   if (b[0] == 0xBF && b[7] == 0x9A && b[8] == 0x3C && b[15] == 0x9A) {
-    /* double double 128-bit big-endian, e.g. PPC/Power and MIPS:
+    /* double double 128-bit fully big-endian,
+     * big-endian doubles in big-endian order,
+     * e.g. PPC/Power and MIPS:
      * bf b9 99 99 99 99 99 9a 3c 59 99 99 99 99 99 9a */
     printf("6\n");
     exit(0);
   }
+  if (b[0] == 0x9A && b[7] == 0xBF && b[8] == 0x9A && b[15] == 0x3C) {
+    /* double double 128-bit mixed endian.
+     * little-endian doubles in big-endian order,
+     * e.g. ppc64el,
+     * 9a 99 99 99 99 99 b9 bf 9a 99 99 99 99 99 59 3c */
+    printf("7\n");
+    exit(0);
+  }
+  if (b[0] == 0x3C && b[7] == 0x9A && b[8] == 0xBF && b[15] == 0x9A) {
+    /* double double 128-bit mixed endian,
+     * big-endian doubles in little-endian order,
+     * 3c 59 99 99 99 99 99 9a bf b9 99 99 99 99 99 9a */
+    printf("8\n");
+    exit(0);
+  }
 #endif
   printf("-1\n"); /* unknown */
   exit(0);
@@ -6975,8 +6995,10 @@ case "$longdblkind" in
 2) echo "You have IEEE 754 128-bit big endian long doubles." >&4 ;;
 3) echo "You have x86 80-bit little endian long doubles." >& 4 ;;
 4) echo "You have x86 80-bit big endian long doubles." >& 4 ;;
-5) echo "You have 128-bit little-endian double-double long doubles." >& 4 ;;
-6) echo "You have 128-bit big-endian double-double long doubles." >& 4 ;;
+5) echo "You have 128-bit fully little-endian double-double long doubles (64-bit LEs in LE)." >& 4 ;;
+6) echo "You have 128-bit fully big-endian double-double long doubles (64-bit BEs in BE)." >& 4 ;;
+7) echo "You have 128-bit mixed double-double long doubles (64-bit LEs in BE)." >& 4 ;;
+8) echo "You have 128-bit mixed double-double long doubles (64-bit BEs in LE)." >& 4 ;;
 *) echo "Cannot figure out your long double." >&4 ;;
 esac
 $rm_try
@@ -8103,6 +8125,33 @@ EOM
        esac
 done
 
+case "$usedtrace" in
+$define)
+       case "$dtraceobject" in
+       $define|true|[yY]*)
+               dtraceobject=$define
+               ;;
+       ' '|'')
+               $dtrace -h -s ../perldtrace.d -o perldtrace.h
+               $cat >try.c <<EOM
+#include "perldtrace.h"
+int main(void) {
+    PERL_LOADED_FILE("dummy");
+    return 0;
+}
+EOM
+               dtraceobject=$undef
+               if $cc -c -o try.o $optimize $ccflags try.c \
+                    && $dtrace -G -s ../perldtrace.d try.o ; then
+                       dtraceobject=$define
+                       echo "Your dtrace builds an object file"
+               fi
+               $rm -f try.c try.o perldtrace.o
+               ;;
+       *) dtraceobject=$undef ;;
+       esac
+esac
+
 : See if we want extra modules installed
 echo " "
 case "$extras" in
@@ -22961,7 +23010,7 @@ fi
 
 : add -D_FORTIFY_SOURCE if feasible and not already there
 case "$gccversion" in
-4.*)   case "$optimize$ccflags" in
+[45].*)        case "$optimize$ccflags" in
        *-O*)   case "$ccflags$cppsymbols" in
                *_FORTIFY_SOURCE=*) # Don't add it again.
                        echo "You seem to have -D_FORTIFY_SOURCE already, not adding it." >&4
@@ -22971,11 +23020,11 @@ case "$gccversion" in
                        ;;
                esac
                ;;
-       *)      echo "You have gcc 4.* but not optimizing, not adding -D_FORTIFY_SOURCE." >&4
+       *)      echo "You have gcc 4.* or later but not optimizing, not adding -D_FORTIFY_SOURCE." >&4
                ;;
        esac
        ;;
-*)     echo "You seem not to have gcc 4.*, not adding -D_FORTIFY_SOURCE." >&4
+*)     echo "You seem not to have gcc 4.* or later, not adding -D_FORTIFY_SOURCE." >&4
        ;;
 esac
 
@@ -24291,6 +24340,7 @@ doublesize='$doublesize'
 drand01='$drand01'
 drand48_r_proto='$drand48_r_proto'
 dtrace='$dtrace'
+dtraceobject='$dtraceobject'
 dynamic_ext='$dynamic_ext'
 eagain='$eagain'
 ebcdic='$ebcdic'
index ebcf740..32ab3b2 100644 (file)
@@ -36,8 +36,8 @@ api_subversion='0'
 api_version='22'
 api_versionstring='5.22.0'
 ar='ar'
-archlib='/usr/lib/perl5/5.22.1/armv4l-linux'
-archlibexp='/usr/lib/perl5/5.22.1/armv4l-linux'
+archlib='/usr/lib/perl5/5.22.2/armv4l-linux'
+archlibexp='/usr/lib/perl5/5.22.2/armv4l-linux'
 archname64=''
 archname='armv4l-linux'
 archobjs=''
@@ -56,7 +56,7 @@ castflags='0'
 cat='cat'
 cc='cc'
 cccdlflags='-fpic'
-ccdlflags='-rdynamic -Wl,-rpath,/usr/lib/perl5/5.22.1/armv4l-linux/CORE'
+ccdlflags='-rdynamic -Wl,-rpath,/usr/lib/perl5/5.22.2/armv4l-linux/CORE'
 ccflags='-fno-strict-aliasing -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64'
 ccflags_uselargefiles='-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64'
 ccname='arm-linux-gcc'
@@ -793,7 +793,7 @@ inc_version_list=' '
 inc_version_list_init='0'
 incpath=''
 inews=''
-installarchlib='./install_me_here/usr/lib/perl5/5.22.1/armv4l-linux'
+installarchlib='./install_me_here/usr/lib/perl5/5.22.2/armv4l-linux'
 installbin='./install_me_here/usr/bin'
 installhtml1dir=''
 installhtml3dir=''
@@ -801,13 +801,13 @@ installman1dir='./install_me_here/usr/share/man/man1'
 installman3dir='./install_me_here/usr/share/man/man3'
 installprefix='./install_me_here/usr'
 installprefixexp='./install_me_here/usr'
-installprivlib='./install_me_here/usr/lib/perl5/5.22.1'
+installprivlib='./install_me_here/usr/lib/perl5/5.22.2'
 installscript='./install_me_here/usr/bin'
-installsitearch='./install_me_here/usr/lib/perl5/site_perl/5.22.1/armv4l-linux'
+installsitearch='./install_me_here/usr/lib/perl5/site_perl/5.22.2/armv4l-linux'
 installsitebin='./install_me_here/usr/bin'
 installsitehtml1dir=''
 installsitehtml3dir=''
-installsitelib='./install_me_here/usr/lib/perl5/site_perl/5.22.1'
+installsitelib='./install_me_here/usr/lib/perl5/site_perl/5.22.2'
 installsiteman1dir='./install_me_here/usr/share/man/man1'
 installsiteman3dir='./install_me_here/usr/share/man/man3'
 installsitescript='./install_me_here/usr/bin'
@@ -937,8 +937,8 @@ pmake=''
 pr=''
 prefix='/usr'
 prefixexp='/usr'
-privlib='/usr/lib/perl5/5.22.1'
-privlibexp='/usr/lib/perl5/5.22.1'
+privlib='/usr/lib/perl5/5.22.2'
+privlibexp='/usr/lib/perl5/5.22.2'
 procselfexe='"/proc/self/exe"'
 prototype='define'
 ptrsize='4'
@@ -1003,17 +1003,17 @@ sig_num='0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
 sig_num_init='0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 6, 17, 29, 31, 0'
 sig_size='68'
 signal_t='void'
-sitearch='/usr/lib/perl5/site_perl/5.22.1/armv4l-linux'
-sitearchexp='/usr/lib/perl5/site_perl/5.22.1/armv4l-linux'
+sitearch='/usr/lib/perl5/site_perl/5.22.2/armv4l-linux'
+sitearchexp='/usr/lib/perl5/site_perl/5.22.2/armv4l-linux'
 sitebin='/usr/bin'
 sitebinexp='/usr/bin'
 sitehtml1dir=''
 sitehtml1direxp=''
 sitehtml3dir=''
 sitehtml3direxp=''
-sitelib='/usr/lib/perl5/site_perl/5.22.1'
+sitelib='/usr/lib/perl5/site_perl/5.22.2'
 sitelib_stem='/usr/lib/perl5/site_perl'
-sitelibexp='/usr/lib/perl5/site_perl/5.22.1'
+sitelibexp='/usr/lib/perl5/site_perl/5.22.2'
 siteman1dir='/usr/share/man/man1'
 siteman1direxp='/usr/share/man/man1'
 siteman3dir='/usr/share/man/man3'
@@ -1052,7 +1052,7 @@ stdio_stream_array=''
 strerror_r_proto='0'
 strings='/usr/include/string.h'
 submit=''
-subversion='1'
+subversion='2'
 sysman='/usr/share/man/man1'
 tail=''
 tar=''
@@ -1144,8 +1144,8 @@ vendorprefix=''
 vendorprefixexp=''
 vendorscript=''
 vendorscriptexp=''
-version='5.22.1'
-version_patchlevel_string='version 22 subversion 1'
+version='5.22.2'
+version_patchlevel_string='version 22 subversion 2'
 versiononly='undef'
 vi=''
 xlibpth='/usr/lib/386 /lib/386'
@@ -1159,7 +1159,7 @@ config_args=''
 config_argc=0
 PERL_REVISION=5
 PERL_VERSION=22
-PERL_SUBVERSION=1
+PERL_SUBVERSION=2
 PERL_API_REVISION=5
 PERL_API_VERSION=22
 PERL_API_SUBVERSION=0
index 247ec31..f8945a4 100644 (file)
@@ -36,8 +36,8 @@ api_subversion='0'
 api_version='22'
 api_versionstring='5.22.0'
 ar='ar'
-archlib='/usr/lib/perl5/5.22.1/armv4l-linux'
-archlibexp='/usr/lib/perl5/5.22.1/armv4l-linux'
+archlib='/usr/lib/perl5/5.22.2/armv4l-linux'
+archlibexp='/usr/lib/perl5/5.22.2/armv4l-linux'
 archname64=''
 archname='armv4l-linux'
 archobjs=''
@@ -55,7 +55,7 @@ castflags='0'
 cat='cat'
 cc='arm-none-linux-gnueabi-gcc'
 cccdlflags='-fpic'
-ccdlflags='-rdynamic -Wl,-rpath,/usr/lib/perl5/5.22.1/armv4l-linux/CORE'
+ccdlflags='-rdynamic -Wl,-rpath,/usr/lib/perl5/5.22.2/armv4l-linux/CORE'
 ccflags='-fno-strict-aliasing -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64'
 ccflags_uselargefiles='-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64'
 ccname='arm-linux-gcc'
@@ -699,7 +699,7 @@ inc_version_list=' '
 inc_version_list_init='0'
 incpath=''
 inews=''
-installarchlib='./install_me_here/usr/lib/perl5/5.22.1/armv4l-linux'
+installarchlib='./install_me_here/usr/lib/perl5/5.22.2/armv4l-linux'
 installbin='./install_me_here/usr/bin'
 installhtml1dir=''
 installhtml3dir=''
@@ -707,13 +707,13 @@ installman1dir='./install_me_here/usr/share/man/man1'
 installman3dir='./install_me_here/usr/share/man/man3'
 installprefix='./install_me_here/usr'
 installprefixexp='./install_me_here/usr'
-installprivlib='./install_me_here/usr/lib/perl5/5.22.1'
+installprivlib='./install_me_here/usr/lib/perl5/5.22.2'
 installscript='./install_me_here/usr/bin'
-installsitearch='./install_me_here/usr/lib/perl5/site_perl/5.22.1/armv4l-linux'
+installsitearch='./install_me_here/usr/lib/perl5/site_perl/5.22.2/armv4l-linux'
 installsitebin='./install_me_here/usr/bin'
 installsitehtml1dir=''
 installsitehtml3dir=''
-installsitelib='./install_me_here/usr/lib/perl5/site_perl/5.22.1'
+installsitelib='./install_me_here/usr/lib/perl5/site_perl/5.22.2'
 installsiteman1dir='./install_me_here/usr/share/man/man1'
 installsiteman3dir='./install_me_here/usr/share/man/man3'
 installsitescript='./install_me_here/usr/bin'
@@ -841,8 +841,8 @@ pmake=''
 pr=''
 prefix='/usr'
 prefixexp='/usr'
-privlib='/usr/lib/perl5/5.22.1'
-privlibexp='/usr/lib/perl5/5.22.1'
+privlib='/usr/lib/perl5/5.22.2'
+privlibexp='/usr/lib/perl5/5.22.2'
 procselfexe='"/proc/self/exe"'
 prototype='define'
 ptrsize='4'
@@ -903,17 +903,17 @@ sig_num='0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
 sig_num_init='0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 6, 17, 29, 31, 0'
 sig_size='68'
 signal_t='void'
-sitearch='/usr/lib/perl5/site_perl/5.22.1/armv4l-linux'
-sitearchexp='/usr/lib/perl5/site_perl/5.22.1/armv4l-linux'
+sitearch='/usr/lib/perl5/site_perl/5.22.2/armv4l-linux'
+sitearchexp='/usr/lib/perl5/site_perl/5.22.2/armv4l-linux'
 sitebin='/usr/bin'
 sitebinexp='/usr/bin'
 sitehtml1dir=''
 sitehtml1direxp=''
 sitehtml3dir=''
 sitehtml3direxp=''
-sitelib='/usr/lib/perl5/site_perl/5.22.1'
+sitelib='/usr/lib/perl5/site_perl/5.22.2'
 sitelib_stem='/usr/lib/perl5/site_perl'
-sitelibexp='/usr/lib/perl5/site_perl/5.22.1'
+sitelibexp='/usr/lib/perl5/site_perl/5.22.2'
 siteman1dir='/usr/share/man/man1'
 siteman1direxp='/usr/share/man/man1'
 siteman3dir='/usr/share/man/man3'
@@ -950,7 +950,7 @@ stdio_stream_array=''
 strerror_r_proto='0'
 strings='/usr/include/string.h'
 submit=''
-subversion='1'
+subversion='2'
 sysman='/usr/share/man/man1'
 tail=''
 tar=''
@@ -1035,8 +1035,8 @@ vendorprefix=''
 vendorprefixexp=''
 vendorscript=''
 vendorscriptexp=''
-version='5.22.1'
-version_patchlevel_string='version 22 subversion 1'
+version='5.22.2'
+version_patchlevel_string='version 22 subversion 2'
 versiononly='undef'
 vi=''
 xlibpth='/usr/lib/386 /lib/386'
@@ -1050,7 +1050,7 @@ config_args=''
 config_argc=0
 PERL_REVISION=5
 PERL_VERSION=22
-PERL_SUBVERSION=1
+PERL_SUBVERSION=2
 PERL_API_REVISION=5
 PERL_API_VERSION=22
 PERL_API_SUBVERSION=0
diff --git a/INSTALL b/INSTALL
index ec1846f..de390f4 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -582,7 +582,7 @@ The directories set up by Configure fall into three broad categories.
 
 =item Directories for the perl distribution
 
-By default, Configure will use the following directories for 5.22.1.
+By default, Configure will use the following directories for 5.22.2.
 $version is the full perl version number, including subversion, e.g.
 5.12.3, and $archname is a string like sun4-sunos,
 determined by Configure.  The full definitions of all Configure
@@ -2441,7 +2441,7 @@ http://www.chiark.greenend.org.uk/~sgtatham/bugs.html
 
 =head1 Coexistence with earlier versions of perl 5
 
-Perl 5.22.1 is not binary compatible with versions of Perl earlier than
+Perl 5.22.2 is not binary compatible with versions of Perl earlier than
 5.22.0.
 In other words, you will have to recompile your XS modules.
 
@@ -2517,9 +2517,9 @@ won't interfere with another version.  (The defaults guarantee this for
 libraries after 5.6.0, but not for executables. TODO?)  One convenient
 way to do this is by using a separate prefix for each version, such as
 
-       sh Configure -Dprefix=/opt/perl5.22.1
+       sh Configure -Dprefix=/opt/perl5.22.2
 
-and adding /opt/perl5.22.1/bin to the shell PATH variable.  Such users
+and adding /opt/perl5.22.2/bin to the shell PATH variable.  Such users
 may also wish to add a symbolic link /usr/local/bin/perl so that
 scripts can still start with #!/usr/local/bin/perl.
 
@@ -2534,11 +2534,11 @@ yet.
 
 =head2 Upgrading from 5.21.11 or earlier
 
-B<Perl 5.22.1 may not be binary compatible with Perl 5.21.11 or
+B<Perl 5.22.2 may not be binary compatible with Perl 5.21.11 or
 earlier Perl releases.>  Perl modules having binary parts
 (meaning that a C compiler is used) will have to be recompiled to be
-used with 5.22.1.  If you find you do need to rebuild an extension with
-5.22.1, you may safely do so without disturbing the older
+used with 5.22.2.  If you find you do need to rebuild an extension with
+5.22.2, you may safely do so without disturbing the older
 installations.  (See L<"Coexistence with earlier versions of perl 5">
 above.)
 
@@ -2571,15 +2571,15 @@ Firstly, the bare minimum to run this script
      print("$f\n");
   }
 
-in Linux with perl-5.22.1 is as follows (under $Config{prefix}):
+in Linux with perl-5.22.2 is as follows (under $Config{prefix}):
 
   ./bin/perl
-  ./lib/perl5/5.22.1/strict.pm
-  ./lib/perl5/5.22.1/warnings.pm
-  ./lib/perl5/5.22.1/i686-linux/File/Glob.pm
-  ./lib/perl5/5.22.1/feature.pm
-  ./lib/perl5/5.22.1/XSLoader.pm
-  ./lib/perl5/5.22.1/i686-linux/auto/File/Glob/Glob.so
+  ./lib/perl5/5.22.2/strict.pm
+  ./lib/perl5/5.22.2/warnings.pm
+  ./lib/perl5/5.22.2/i686-linux/File/Glob.pm
+  ./lib/perl5/5.22.2/feature.pm
+  ./lib/perl5/5.22.2/XSLoader.pm
+  ./lib/perl5/5.22.2/i686-linux/auto/File/Glob/Glob.so
 
 Secondly, for perl-5.10.1, the Debian perl-base package contains 591
 files, (of which 510 are for lib/unicore) totaling about 3.5MB in its
index 6af238c..e099c9f 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -3965,6 +3965,7 @@ ext/XS-APItest/t/utf16_to_utf8.t  Test behaviour of utf16_to_utf8{,reversed}
 ext/XS-APItest/t/utf8.t                Tests for code in utf8.c
 ext/XS-APItest/t/weaken.t      XS::APItest: tests for sv_rvweaken() and sv_get_backrefs()
 ext/XS-APItest/t/whichsig.t    XS::APItest: tests for whichsig() and variants
+ext/XS-APItest/t/win32.t       Test Win32 specific APIs
 ext/XS-APItest/t/xs_special_subs_require.t     for require too
 ext/XS-APItest/t/xs_special_subs.t     Test that XS BEGIN/CHECK/INIT/END work
 ext/XS-APItest/t/xsub_h.t      Tests for XSUB.h
@@ -4567,6 +4568,7 @@ pod/perl5201delta.pod             Perl changes in version 5.20.1
 pod/perl5202delta.pod          Perl changes in version 5.20.2
 pod/perl5203delta.pod          Perl changes in version 5.20.3
 pod/perl5220delta.pod          Perl changes in version 5.22.0
+pod/perl5221delta.pod          Perl changes in version 5.22.1
 pod/perl561delta.pod           Perl changes in version 5.6.1
 pod/perl56delta.pod            Perl changes in version 5.6
 pod/perl581delta.pod           Perl changes in version 5.8.1
@@ -4984,6 +4986,7 @@ t/lib/croak/op                    Test croak calls from op.c
 t/lib/croak/pp                 Test croak calls from pp.c
 t/lib/croak/pp_ctl             Test croak calls from pp_ctl.c
 t/lib/croak/pp_hot             Test croak calls from pp_hot.c
+t/lib/croak/pp_sys             Test croak calls from pp_sys.c
 t/lib/croak.t                  Test calls to Perl_croak() in the C source.
 t/lib/croak/toke               Test croak calls from toke.c
 t/lib/cygwin.t                 Builtin cygwin function tests
@@ -5508,6 +5511,7 @@ t/uni/universal.t         See if Unicode in calls to UNIVERSAL works
 t/uni/upper.t                  See if Unicode casing works
 t/uni/variables.t              See that the rules for variable names work
 t/uni/write.t                  See if Unicode formats work
+t/win32/crypt.t                        Test Win32 crypt for compatibility
 t/win32/fs.t                   Test Win32 link for compatibility
 t/win32/popen.t                        Test for stdout races in backticks, etc
 t/win32/runenv.t               Test if Win* perl honors its env variables
index d5ee162..f639e6d 100644 (file)
--- a/META.json
+++ b/META.json
          "url" : "http://perl5.git.perl.org/"
       }
    },
-   "version" : "5.022001"
+   "version" : "5.022002"
 }
index b1ddfc0..4b525a4 100644 (file)
--- a/META.yml
+++ b/META.yml
@@ -112,4 +112,4 @@ resources:
   homepage: http://www.perl.org/
   license: http://dev.perl.org/licenses/
   repository: http://perl5.git.perl.org/
-version: '5.022001'
+version: '5.022002'
index b6999b2..c078b90 100755 (executable)
@@ -225,10 +225,13 @@ dtrace_o=''
 minidtrace_o=''
 case "$usedtrace" in
 define|true)
-       dtrace_h='perldtrace.h' 
-       $dtrace -G -s perldtrace.d -o perldtrace.tmp >/dev/null 2>&1 \
-               && rm -f perldtrace.tmp && dtrace_o='perldtrace$(OBJ_EXT)' \
-               && minidtrace_o='miniperldtrace$(OBJ_EXT)'
+       dtrace_h='perldtrace.h'
+       case "$dtraceobject" in
+       define)
+               dtrace_o='perldtrace$(OBJ_EXT)'
+               minidtrace_o='miniperldtrace$(OBJ_EXT)'
+               ;;
+       esac
        ;;
 esac
 
@@ -492,7 +495,7 @@ mini_obj = $(minindt_obj) $(MINIDTRACE_O)
 ndt_obj = $(obj0) $(obj1) $(obj2) $(obj3) $(ARCHOBJS)
 obj = $(ndt_obj) $(DTRACE_O)
 
-perltoc_pod_prereqs = extra.pods pod/perl5221delta.pod pod/perlapi.pod pod/perlintern.pod pod/perlmodlib.pod pod/perluniprops.pod
+perltoc_pod_prereqs = extra.pods pod/perl5222delta.pod pod/perlapi.pod pod/perlintern.pod pod/perlmodlib.pod pod/perluniprops.pod
 generated_pods = pod/perltoc.pod $(perltoc_pod_prereqs)
 generated_headers = uudmap.h bitcount.h mg_data.h
 
@@ -1020,9 +1023,9 @@ pod/perlintern.pod: $(MINIPERL_EXE) autodoc.pl embed.fnc
 pod/perlmodlib.pod: $(MINIPERL_EXE) pod/perlmodlib.PL MANIFEST
        $(MINIPERL) pod/perlmodlib.PL -q
 
-pod/perl5221delta.pod: pod/perldelta.pod
-       $(RMS) pod/perl5221delta.pod
-       $(LNS) perldelta.pod pod/perl5221delta.pod
+pod/perl5222delta.pod: pod/perldelta.pod
+       $(RMS) pod/perl5222delta.pod
+       $(LNS) perldelta.pod pod/perl5222delta.pod
 
 extra.pods: $(MINIPERL_EXE)
        -@test ! -f extra.pods || rm -f `cat extra.pods`
index a758bc2..fbef48a 100644 (file)
@@ -86,7 +86,7 @@ NLM_VERSION    = 3,20,0
 
 
 # Here comes the CW tools - TO BE FILLED TO BUILD WITH CW -
-MODULE_DESC     = "Perl 5.22.1 for NetWare"
+MODULE_DESC     = "Perl 5.22.2 for NetWare"
 CCTYPE          = CodeWarrior
 C_COMPILER             = mwccnlm -c
 CPP_COMPILER   = mwccnlm
@@ -462,7 +462,7 @@ INST_NW_TOP2 = $(INST_NW_DRV)\perl
 # versioned installation can be obtained by setting INST_TOP above to a
 # path that includes an arbitrary version string.
 #
-INST_VER       = \5.22.1
+INST_VER       = \5.22.2
 
 #
 # Comment this out if you DON'T want your perl installation to have
index 401cf80..20118bb 100644 (file)
  *     This symbol contains the ~name expanded version of ARCHLIB, to be used
  *     in programs that are not prepared to deal with ~ expansion at run-time.
  */
-#define ARCHLIB "c:\\perl\\5.22.1\\lib\\NetWare-x86-multi-thread"              /**/
+#define ARCHLIB "c:\\perl\\5.22.2\\lib\\NetWare-x86-multi-thread"              /**/
 /*#define ARCHLIB_EXP ""       /**/
 
 /* ARCHNAME:
  *     This symbol is the filename expanded version of the BIN symbol, for
  *     programs that do not want to deal with that at run-time.
  */
-#define BIN "c:\\perl\\5.22.1\\bin\\NetWare-x86-multi-thread"  /**/
-#define BIN_EXP "c:\\perl\\5.22.1\\bin\\NetWare-x86-multi-thread"      /**/
+#define BIN "c:\\perl\\5.22.2\\bin\\NetWare-x86-multi-thread"  /**/
+#define BIN_EXP "c:\\perl\\5.22.2\\bin\\NetWare-x86-multi-thread"      /**/
 
 /* BYTEORDER:
  *     This symbol holds the hexadecimal constant defined in byteorder,
  *     This symbol contains the ~name expanded version of SITEARCH, to be used
  *     in programs that are not prepared to deal with ~ expansion at run-time.
  */
-#define SITEARCH "c:\\perl\\site\\5.22.1\\lib\\NetWare-x86-multi-thread"               /**/
+#define SITEARCH "c:\\perl\\site\\5.22.2\\lib\\NetWare-x86-multi-thread"               /**/
 /*#define SITEARCH_EXP ""      /**/
 
 /* SITELIB:
  *     removed.  The elements in inc_version_list (inc_version_list.U) can
  *     be tacked onto this variable to generate a list of directories to search.
  */
-#define SITELIB "c:\\perl\\site\\5.22.1\\lib"          /**/
+#define SITELIB "c:\\perl\\site\\5.22.2\\lib"          /**/
 /*#define SITELIB_EXP ""       /**/
 #define SITELIB_STEM ""                /**/
 
index 3f9057e..84385f6 100644 (file)
@@ -2842,14 +2842,14 @@ dlsrc (dlsrc.U):
 
 doublekind (longdblfio.U):
        This variable, if defined, encodes the type of a double:
-       1 = IEEE 754 32-bit big little endian,
-       2 = IEEE 754 32-bit big big endian,
-       3 = IEEE 754 64-bit big little endian,
-       4 = IEEE 754 64-bit big big endian,
-       5 = IEEE 754 128-bit big little endian,
-       6 = IEEE 754 128-bit big big endian,
-       7 = IEEE 754 64-bit big mixed endian le-be,
-       8 = IEEE 754 64-bit big mixed endian be-le,
+       1 = IEEE 754 32-bit little endian,
+       2 = IEEE 754 32-bit big endian,
+       3 = IEEE 754 64-bit little endian,
+       4 = IEEE 754 64-bit big endian,
+       5 = IEEE 754 128-bit little endian,
+       6 = IEEE 754 128-bit big endian,
+       7 = IEEE 754 64-bit mixed endian le-be,
+       8 = IEEE 754 64-bit mixed endian be-le,
        -1 = unknown format.
 
 doublesize (doublesize.U):
@@ -2872,6 +2872,9 @@ drand48_r_proto (d_drand48_r.U):
 dtrace (usedtrace.U):
        This variable holds the location of the dtrace executable.
 
+dtraceobject (usedtrace.U):
+       Whether we need to build an object file with the dtrace tool.
+
 dynamic_ext (Extensions.U):
        This variable holds a list of XS extension files we want to
        link dynamically into the package.  It is used by Makefile.
@@ -4078,8 +4081,8 @@ loclibpth (libpth.U):
 
 longdblkind (d_longdbl.U):
        This variable, if defined, encodes the type of a long double:
-       0 = double, 1 = IEEE 754 128-bit big little endian,
-       2 = IEEE 754 128-bit big big endian, 3 = x86 80-bit little endian,
+       0 = double, 1 = IEEE 754 128-bit little endian,
+       2 = IEEE 754 128-bit big endian, 3 = x86 80-bit little endian,
        4 = x86 80-bit big endian, 5 = double-double 128-bit little endian,
        6 = double-double 128-bit big endian, -1 = unknown format.
 
index c4002d2..38c7bd7 100755 (executable)
@@ -586,6 +586,7 @@ crt\100kiski.net                        perl\100ctweten.amsite.com
 
 dairiki\100dairiki.org                  dairiki at dairiki.org
 dagolden\100cpan.org                    xdaveg\100gmail.com
++                                       xdg\100xdg.me
 damian\100conway.org                    damian\100cs.monash.edu.au
 dan\100sidhe.org                        sugalsd\100lbcc.cc.or.us
 +                                       sugalskd\100osshe.edu
index ea09439..e6ec404 100644 (file)
@@ -43,8 +43,8 @@ api_subversion='0'
 api_version='22'
 api_versionstring='5.22.0'
 ar='ar'
-archlib='/pro/lib/perl5/5.22.1/i686-linux-64int'
-archlibexp='/pro/lib/perl5/5.22.1/i686-linux-64int'
+archlib='/pro/lib/perl5/5.22.2/i686-linux-64int'
+archlibexp='/pro/lib/perl5/5.22.2/i686-linux-64int'
 archname64='64int'
 archname='i686-linux-64int'
 archobjs=''
@@ -810,7 +810,7 @@ incpath=''
 incpth='/usr/lib/gcc/i586-suse-linux/4.8/include /usr/local/include /usr/lib/gcc/i586-suse-linux/4.8/include-fixed /usr/lib/gcc/i586-suse-linux/4.8/../../../../i586-suse-linux/include /usr/include'
 inews=''
 initialinstalllocation='/pro/bin'
-installarchlib='/pro/lib/perl5/5.22.1/i686-linux-64int'
+installarchlib='/pro/lib/perl5/5.22.2/i686-linux-64int'
 installbin='/pro/bin'
 installhtml1dir=''
 installhtml3dir=''
@@ -818,13 +818,13 @@ installman1dir='/pro/local/man/man1'
 installman3dir='/pro/local/man/man3'
 installprefix='/pro'
 installprefixexp='/pro'
-installprivlib='/pro/lib/perl5/5.22.1'
+installprivlib='/pro/lib/perl5/5.22.2'
 installscript='/pro/bin'
-installsitearch='/pro/lib/perl5/site_perl/5.22.1/i686-linux-64int'
+installsitearch='/pro/lib/perl5/site_perl/5.22.2/i686-linux-64int'
 installsitebin='/pro/bin'
 installsitehtml1dir=''
 installsitehtml3dir=''
-installsitelib='/pro/lib/perl5/site_perl/5.22.1'
+installsitelib='/pro/lib/perl5/site_perl/5.22.2'
 installsiteman1dir='/pro/local/man/man1'
 installsiteman3dir='/pro/local/man/man3'
 installsitescript='/pro/bin'
@@ -946,7 +946,7 @@ perl_patchlevel=''
 perl_static_inline='static __inline__'
 perladmin='hmbrand@cpan.org'
 perllibs='-lnsl -ldl -lm -lcrypt -lutil -lc'
-perlpath='/pro/bin/perl5.22.1'
+perlpath='/pro/bin/perl5.22.2'
 pg='pg'
 phostname='hostname'
 pidtype='pid_t'
@@ -955,8 +955,8 @@ pmake=''
 pr=''
 prefix='/pro'
 prefixexp='/pro'
-privlib='/pro/lib/perl5/5.22.1'
-privlibexp='/pro/lib/perl5/5.22.1'
+privlib='/pro/lib/perl5/5.22.2'
+privlibexp='/pro/lib/perl5/5.22.2'
 procselfexe='"/proc/self/exe"'
 prototype='define'
 ptrsize='4'
@@ -1022,17 +1022,17 @@ sig_num='0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
 sig_num_init='0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 6, 17, 29, 31, 0'
 sig_size='69'
 signal_t='void'
-sitearch='/pro/lib/perl5/site_perl/5.22.1/i686-linux-64int'
-sitearchexp='/pro/lib/perl5/site_perl/5.22.1/i686-linux-64int'
+sitearch='/pro/lib/perl5/site_perl/5.22.2/i686-linux-64int'
+sitearchexp='/pro/lib/perl5/site_perl/5.22.2/i686-linux-64int'
 sitebin='/pro/bin'
 sitebinexp='/pro/bin'
 sitehtml1dir=''
 sitehtml1direxp=''
 sitehtml3dir=''
 sitehtml3direxp=''
-sitelib='/pro/lib/perl5/site_perl/5.22.1'
+sitelib='/pro/lib/perl5/site_perl/5.22.2'
 sitelib_stem='/pro/lib/perl5/site_perl'
-sitelibexp='/pro/lib/perl5/site_perl/5.22.1'
+sitelibexp='/pro/lib/perl5/site_perl/5.22.2'
 siteman1dir='/pro/local/man/man1'
 siteman1direxp='/pro/local/man/man1'
 siteman3dir='/pro/local/man/man3'
@@ -1058,7 +1058,7 @@ src='.'
 ssizetype='ssize_t'
 st_ino_sign='1'
 st_ino_size='8'
-startperl='#!/pro/bin/perl5.22.1'
+startperl='#!/pro/bin/perl5.22.2'
 startsh='#!/bin/sh'
 static_ext=' '
 stdchar='char'
@@ -1071,7 +1071,7 @@ stdio_stream_array=''
 strerror_r_proto='0'
 strings='/usr/include/string.h'
 submit=''
-subversion='1'
+subversion='2'
 sysman='/usr/share/man/man1'
 sysroot=''
 tail=''
@@ -1170,8 +1170,8 @@ vendorprefix=''
 vendorprefixexp=''
 vendorscript=''
 vendorscriptexp=''
-version='5.22.1'
-version_patchlevel_string='version 22 subversion 1'
+version='5.22.2'
+version_patchlevel_string='version 22 subversion 2'
 versiononly='define'
 vi=''
 xlibpth='/usr/lib/386 /lib/386'
@@ -1181,7 +1181,7 @@ zcat=''
 zip='zip'
 PERL_REVISION=5
 PERL_VERSION=22
-PERL_SUBVERSION=1
+PERL_SUBVERSION=2
 PERL_API_REVISION=5
 PERL_API_VERSION=22
 PERL_API_SUBVERSION=0
index 742acaf..5b59f04 100644 (file)
  *     This symbol contains the ~name expanded version of ARCHLIB, to be used
  *     in programs that are not prepared to deal with ~ expansion at run-time.
  */
-#define ARCHLIB "/pro/lib/perl5/5.22.1/i686-linux-64int-ld"            /**/
-#define ARCHLIB_EXP "/pro/lib/perl5/5.22.1/i686-linux-64int-ld"                /**/
+#define ARCHLIB "/pro/lib/perl5/5.22.2/i686-linux-64int-ld"            /**/
+#define ARCHLIB_EXP "/pro/lib/perl5/5.22.2/i686-linux-64int-ld"                /**/
 
 /* ARCHNAME:
  *     This symbol holds a string representing the architecture name.
  *     This symbol contains the ~name expanded version of PRIVLIB, to be used
  *     in programs that are not prepared to deal with ~ expansion at run-time.
  */
-#define PRIVLIB "/pro/lib/perl5/5.22.1"                /**/
-#define PRIVLIB_EXP "/pro/lib/perl5/5.22.1"            /**/
+#define PRIVLIB "/pro/lib/perl5/5.22.2"                /**/
+#define PRIVLIB_EXP "/pro/lib/perl5/5.22.2"            /**/
 
 /* PTRSIZE:
  *     This symbol contains the size of a pointer, so that the C preprocessor
  *     This symbol contains the ~name expanded version of SITEARCH, to be used
  *     in programs that are not prepared to deal with ~ expansion at run-time.
  */
-#define SITEARCH "/pro/lib/perl5/site_perl/5.22.1/i686-linux-64int-ld"         /**/
-#define SITEARCH_EXP "/pro/lib/perl5/site_perl/5.22.1/i686-linux-64int-ld"             /**/
+#define SITEARCH "/pro/lib/perl5/site_perl/5.22.2/i686-linux-64int-ld"         /**/
+#define SITEARCH_EXP "/pro/lib/perl5/site_perl/5.22.2/i686-linux-64int-ld"             /**/
 
 /* SITELIB:
  *     This symbol contains the name of the private library for this package.
  *     removed.  The elements in inc_version_list (inc_version_list.U) can
  *     be tacked onto this variable to generate a list of directories to search.
  */
-#define SITELIB "/pro/lib/perl5/site_perl/5.22.1"              /**/
-#define SITELIB_EXP "/pro/lib/perl5/site_perl/5.22.1"          /**/
+#define SITELIB "/pro/lib/perl5/site_perl/5.22.2"              /**/
+#define SITELIB_EXP "/pro/lib/perl5/site_perl/5.22.2"          /**/
 #define SITELIB_STEM "/pro/lib/perl5/site_perl"                /**/
 
 /* SSize_t:
  *     script to make sure (one hopes) that it runs with perl and not
  *     some shell.
  */
-#define STARTPERL "#!/pro/bin/perl5.22.1"              /**/
+#define STARTPERL "#!/pro/bin/perl5.22.2"              /**/
 
 /* HAS_STDIO_STREAM_ARRAY:
  *     This symbol, if defined, tells that there is an array
index d4e31ad..d54eb51 100644 (file)
@@ -17,6 +17,102 @@ Consult your favorite dictionary for details.
 
 =head1 EPIGRAPHS
 
+=head2 v5.23.9 - Tom Kitchin, "from nature to plate"
+
+L<Announced on 2016-03-20 by Abigail|http://www.nntp.perl.org/group/perl.perl5.porters/2016/03/msg235251.html>
+
+Spring
+
+Spring is the proper beginning of my kitchen and a season that I
+look forward to with great anticipation. By the time spring arrives
+I am desperate to welcome all the spring produce into my kitchen
+and I long to work with fresh green vegetables again. As much as I
+love root vegetables, such as celeriac and parsnips, and the heaver
+meat and game dishes, I'm ready to leave those behind with winter
+and begin a new adventure.
+
+Somehow spring always gives me a little bit of bounce in my feet
+-- I feel like I want to kick off my shoes and dance around in my
+kitchen. Not that I do, of course, but I feel lighter somehow. My
+adrenalin kicks in with spring and so does the level of excitement,
+as I think about all the produce that is about to come in.
+
+The moment spring arrives I'm eager to cook peas, broad beans, green
+asparagus and other fresh vegetables! I want to create lighter,
+brighter dishes and I can't wait to get my hands on the first greens
+and the first morels, not to mention the first wild Scottish salmon.
+Thanks to my network of trusted suppliers, I always get to first
+produce of the season delivered to my restaurant as soon as it is
+possible. I want my customers to experience and understand the
+beauty of locally grown produce and to try things the minute they
+are available so they can taste how incredibly fresh the ingredients
+are. I also want them to understand the relationship between
+seasonality and flavours. One of the most important things to
+remember is to allow the seasons to inspire your dishes and help
+you make natural matches. Wild spring herbs, such as sorrel, sweet
+cicely and wild garlic, as well as spring salad leaves and green
+lettuce served with wild salmon, wild sea trout, lamb or rabbit are
+marriages made in heaven.
+
+
+=head2 v5.23.8 - Patrick Rothfuss, "The Wise Man's Fear (The Kingkiller's Chronicle: Day Two)"
+
+L<Announced on 2016-02-20 by Sawyer X|http://www.nntp.perl.org/group/perl.perl5.porters/2016/02/msg234535.html>
+
+Denna, on the other hand, had never been trained. She knew nothing
+of shortcuts. You'd think she'd be forced to wander the city, lost and
+helpless, trapped in a twisting maze of mortared stone.
+
+But instead, she simply walked throught the walls. She didn't know
+any better. Nobody had ever told her she couldn't. Because of this,
+she moved through the city like some faerie creature. She walked roads
+no one else could see, and it made her music wild and strange and
+free.
+
+=head2 v5.23.7 - William Gibson, "Neuromancer"
+
+L<Announced on 2016-01-20 by Stevan Little|http://www.nntp.perl.org/group/perl.perl5.porters/2016/01/msg233856.html>
+
+A year here and he still dreamed of cyberspace, hope fading
+nightly. All the speed he took, all the turns he'd taken and
+the corners he cut in Night City, and he'd still see the matrix
+in his dreams, bright lattices of logic unfolding across that
+colourless void...The Sprawl was a long, strange way home now
+over the Pacific, and he was no Console Man, no cyberspace
+cowboy. Just another hustler, trying to make it through. But
+the dreams came on in the Japanese night like livewire voodoo,
+and he'd cry for it, cry in his sleep, and wake alone in the
+dark, curled in his capsule in some coffin hotel, hands clawed
+into the bedslab, temper foam bunched between his fingers,
+trying to reach the console that wasn't there.
+
+=head2 v5.23.6 - 5.23 Episode VII
+
+L<Announced on 2015-12-21 by David Golden|http://www.nntp.perl.org/group/perl.perl5.porters/2015/12/msg233475.html>
+
+  A long time ago in microseconds, in a galaxy not very far away...
+
+                   5.23 Episode VII
+                   THE FUZZ AWAKENS
+
+                  It is a period of
+                unrest as separatists
+               announce their intentions
+              to fork PERL and return the
+             galaxy to speed and stability.
+
+            Chancellor Rik Hoolian struggles
+          to hold together the remains of the
+         once mighty Republic against a tide of
+        incivility and the depredations of a new
+       foe, the FUZZ RAIDERS.
+
+      Meanwhile, after 15 years of preparation and
+     high expectations, Supreme Leader Toady prepares
+    to unleash a devastating new weapon, PERL SIXDOTOH,
+   that could splinter the Republic forever and usher in
+  a new Empire of gradual typing....
+
 =head2 v5.23.5 - utastro!nather (Ed Nather), "The Story of Mel", in net.jokes, May 21, 1983.
 
 L<Announced on 2015-11-20 by Abigail|http://www.nntp.perl.org/group/perl.perl5.porters/2015/11/msg232758.html>
@@ -190,7 +286,7 @@ L<Announced on 2015-07-20 by Matthew Horsfall|http://www.nntp.perl.org/group/per
   Will chase the sun into the morning
   Beyond the sky, beyond the sea.
 
-=head2 v5.23.0 - Bob Dylan, Maggie's Farm
+=head2 v5.23.0 - Bob Dylan, "Maggie's Farm"
 
 L<Announced on 2015-06-20 by Ricardo Signes|http://www.nntp.perl.org/group/perl.perl5.porters/2015/06/msg228807.html>
 
@@ -203,6 +299,59 @@ L<Announced on 2015-06-20 by Ricardo Signes|http://www.nntp.perl.org/group/perl.
   They sing while you slave and I just get bored
   I ain't gonna work on Maggie's farm no more
 
+=head2 v5.22.2-RC1 - Gaston Leroux, trans. Mireille Ribière, "The Phantom of the Opera"
+
+L<Announced on 2016-04-10 by Steve Hay|http://www.nntp.perl.org/group/perl.perl5.porters/2016/04/msg235732.html>
+
+This annual ball was quite a magnificent affair.  It was given some time
+before Shrovetide to celebrate the birthday of a famous illustrator
+whose pencil had immortalized, in the style of Gavarni, the extravagant
+carnival parade down La Courtille.  As such, the ball was an altogether
+merrier, noisier and more Bohemian occasion than was usual for a masked
+ball.  Many artists had arranged to meet there; they arrived with an
+entourage of models and pupils, who, by midnight, had become quite
+boisterous.
+Raoul climbed the grand staircase at five minutes to midnight.  He did
+not linger to admire the many-coloured costumes on display all the way
+up the marble steps of one of the most luxurious settings in the world;
+nor did he allow himself to be drawn into the facetious conversation of
+masked guests.  He simply ignored all the jesting remarks, and shook off
+the attentions of several all too merry couples.
+Crossing the big crush-room and escaping from the dancers' farandole
+that had encircled him awhile, he at last entered the salon mentioned by
+Christine in her letter.  The small room was crammed with people either
+on their way to supper at the restaurant in the Rotunda or back from
+raising a glass of champagne.
+In the midst of the gay and lively hubbub, Raoul thought that, for their
+mysterious assignation, Christine must have preferred this crowd to some
+lonely corner.
+He leaned against a door-jamb and waited.  He did not have to wait long;
+a black domino passed him and deftly touched his hand.  He understood
+that it was Christine and followed her.
+'Is that you, Christine?' he murmured, barely moving his slips.
+The black domino promptly looked back and raised her finger to her lips,
+no doubt to caution him against uttering her name again.  Raoul followed
+on in silence.
+
+=head2 v5.22.1 - Wilhelm Müller, trans. Anon., "Courage" (No. 22 in Schubert's song-cycle, "Winterreise")
+
+L<Announced on 2015-12-13 by Steve Hay|http://www.nntp.perl.org/group/perl.perl5.porters/2015/12/msg233318.html>
+
+  If the snow flies in my face,
+  Let me shake it off me!
+  If my heart within me speaks,
+  I'll sing bright and gaily!
+
+  Will not listen what it says,
+  Have no ears for moaning.
+  Do not feel what it complains,--
+  Only fools like groaning!
+
+  Jolly brave into the world,
+  'Gainst all wind and weather,--
+  If there is no God on earth,
+  Let 's be gods down nether!
+
 =head2 v5.22.1-RC4 - Wilhelm Müller, trans. Anon., "The Signpost" (No. 20 in Schubert's song-cycle, "Winterreise")
 
 L<Announced on 2015-12-08 by Steve Hay|http://www.nntp.perl.org/group/perl.perl5.porters/2015/12/msg233215.html>
index 3691eb4..dd041ca 100644 (file)
@@ -378,7 +378,7 @@ here.
 
 XXX Generate this with:
 
-  perl Porting/acknowledgements.pl v5.22.1..HEAD
+  perl Porting/acknowledgements.pl v5.22.2..HEAD
 
 =head1 Reporting Bugs
 
index c13d3fb..6d67d0b 100644 (file)
@@ -141,12 +141,6 @@ Andreas' email address at:
 
     https://pause.perl.org/pause/query?ACTION=pause_04imprint
 
-=head3 search.cpan.org pumpkin status
-
-Make sure that search.cpan.org knows that you're allowed to upload
-perl distros. Contact Graham Barr to make sure that you're on the right
-list.
-
 =head3 rt.perl.org update access
 
 Make sure you have permission to close tickets on L<http://rt.perl.org/>
@@ -165,6 +159,20 @@ release.  Have a chat with whichever evil perl porter tried to talk
 you into the idea in the first place to figure out the best way to
 resolve the issue.
 
+=head3 web-based file share
+
+You will need to be able to share tarballs with #p5p members for
+pre-release testing, and you may wish to upload to PAUSE via URL.
+Make sure you have a way of sharing files, such as a web server or
+file-sharing service.
+
+Porters have access to the "dromedary" server (users.perl5.git.perl.org),
+which has a F<public_html> directory to share files with.
+(L<http://users.perl5.git.perl.org/~username/perl-5.xx.y.tar.gz>)
+
+If you use Dropbox, you can append "raw=1" as a parameter to their usual
+sharing link to allow direct download (albeit with redirects).
+
 =head3 git clone of https://github.com/perlorg/perlweb
 
 For updating the L<http://dev.perl.org> web pages, either a Github account or
@@ -175,6 +183,13 @@ is only needed on the day of the release or shortly afterwards.
 
 You will need a quotation to use as an epigraph to your release announcement.
 
+=head3 Install the previous version of perl
+
+During the testing phase of the release you have created, you will be
+asked to compare the installed files with a previous install. Save yourself
+some time on release day, and have a (clean) install of the previous
+version ready.
+
 =head2 Building a release - advance actions
 
 The work of building a release candidate for an even numbered release
@@ -249,7 +264,7 @@ C<git checkout .gitignore> in the F<cpan/Distro> directory.
 =item *
 
 Remove files we do not need. That is, remove any files that match the
-entries in C<@IGNORABLE> in F<Porting/Maintainer.pl>, and anything that
+entries in C<@IGNORABLE> in F<Porting/Maintainers.pl>, and anything that
 matches the C<EXCLUDED> section of the distro's entry in the C<%Modules>
 hash.
 
@@ -292,7 +307,7 @@ Run the tests for the package.
 
 =item *
 
-Run the tests in F<t/porting>.
+Run the tests in F<t/porting> (C<make test_porting>).
 
 =item *
 
@@ -342,8 +357,8 @@ Ensure dual-life CPAN modules are stable, which comes down to:
 =head3 monitor smoke tests for failures
 
 Similarly, monitor the smoking of core tests, and try to fix.  See
-L<http://doc.procura.nl/smoke/index.html> and L<http://perl5.test-smoke.org/>
-for a summary. See also
+L<http://smoke.procura.nl/index.html>, L<http://perl5.test-smoke.org/>
+and L<http://perl.develop-help.com> for a summary. See also
 L<http://www.nntp.perl.org/group/perl.daily-build.reports/> which has
 the raw reports.
 
@@ -421,10 +436,6 @@ You may also need to regen opcodes:
 
  $ ./perl -Ilib regen/opcode.pl
 
-You may have to add stub entries in C<%Module::CoreList::version>,
-C<%Module::CoreList::deprecated> and C<%Module::CoreList::Utils::delta>.
-If so, you must up their version numbers as well.
-
 Test your changes:
 
  $ git clean -xdf   # careful if you don't have local files to keep!
@@ -432,6 +443,9 @@ Test your changes:
  $ make
  $ make test
 
+Do note that at this stage, porting tests will fail. They will continue
+to fail until you've updated Module::CoreList, as described below.
+
 Commit your changes:
 
  $ git status
@@ -465,7 +479,9 @@ release in the previous development cycle (so for example, for a 5.14.x
 release, this would be 5.13.11).
 
 For BLEAD-POINT releases, it needs to refer to the previous BLEAD-POINT
-release (so for 5.15.3 this would be 5.15.2).
+release (so for 5.15.3 this would be 5.15.2).  If the last release manager
+followed instructions, this should have already been done after the last
+blead release, so you may find nothing to do here.
 
 =head3 Check copyright years
 
@@ -634,6 +650,7 @@ Check those files over carefully:
 =head4 Bump version in Module::CoreList F<Changes>
 
 Also edit Module::CoreList's new version number in its F<Changes> file.
+This file is F<dist/Module-CoreList/Changes>.
 
 =head4 Add Module::CoreList version bump to perldelta
 
@@ -882,6 +899,11 @@ utility is included with most modern UNIX-type operating systems and
 is available for Cygwin. A Windows port is available from
 L<http://tukaani.org/xz/>.
 
+B<IMPORTANT>: if you are on OS X, you must export C<COPYFILE_DISABLE=1>
+to prevent OS X resource files from being included in your tarball. After
+creating the tarball following the instructions below, inspect it to ensure
+you don't have files like F<._foobar>.
+
 Create a tarball. Use the C<-s> option to specify a suitable suffix for
 the tarball and directory name:
 
@@ -920,12 +942,20 @@ Once you have a tarball it's time to test the tarball (not the repository).
 Copy the tarballs (.gz and possibly .bz2 and .xz) to a web server somewhere you
 have access to.
 
-=head4 Download the tarball to another machine
+=head4 Download the tarball to another machine and unpack it
 
 Download the tarball to some other machine. For a release candidate,
 you really want to test your tarball on two or more different platforms
-and architectures. The #p5p IRC channel on irc.perl.org is a good place
-to find willing victims.
+and architectures.
+
+=head4 Ask #p5p to test the tarball on different platforms
+
+Once you've verified the tarball can be downloaded and unpacked,
+ask the #p5p IRC channel on irc.perl.org for volunteers to test the
+tarballs on whatever platforms they can.
+
+If you're not confident in the tarball, you can defer this step until after
+your own tarball testing, below.
 
 =head4 Check that F<Configure> works
 
@@ -1056,10 +1086,14 @@ high-reliability connection to the Internet, you should probably use the
 new release from wherever you put it for testers to find it.  This will
 eliminate anxious gnashing of teeth while you wait to see if your
 15 megabyte HTTP upload successfully completes across your slow, twitchy
-cable modem.  You can make use of your home directory on dromedary for
+cable modem.
+
+You can make use of your home directory on dromedary for
 this purpose: F<http://users.perl5.git.perl.org/~USERNAME> maps to
 F</home/USERNAME/public_html>, where F<USERNAME> is your login account
-on dromedary.  I<Remember>: if your upload is partially successful, you
+on dromedary.
+
+I<Remember>: if your upload is partially successful, you
 may need to contact a PAUSE administrator or even bump the version of perl.
 
 Upload the .gz, .xz, and .bz2 versions of the tarball.
index 07bb732..e04e78c 100644 (file)
@@ -467,7 +467,7 @@ Natively 64-bit systems need neither -Duse64bitint nor -Duse64bitall.
 On these systems, it might be the default compilation mode, and there
 is currently no guarantee that passing no use64bitall option to the
 Configure process will build a 32bit perl. Implementing -Duse32bit*
-options would be nice for perl 5.22.1.
+options would be nice for perl 5.22.2.
 
 =head2 Profile Perl - am I hot or not?
 
@@ -1169,7 +1169,7 @@ L<http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2013-01/msg00339.html>
 =head1 Big projects
 
 Tasks that will get your name mentioned in the description of the "Highlights
-of 5.22.1"
+of 5.22.2"
 
 =head2 make ithreads more robust
 
index 691da50..7142595 100644 (file)
@@ -107,6 +107,9 @@ DES crypt port by Corinna Vinschen.
 
 Alternatively, the crypt libraries in GNU libc have been ported to Cygwin.
 
+As of libcrypt 1.3 (March 2016), you will need to install the
+libcrypt-devel package for Configure to detect crypt().
+
 =item * C<-lgdbm_compat> (C<use GDBM_File>)
 
 GDBM is available for Cygwin.
index d1e27ba..ee7c71c 100644 (file)
@@ -22,9 +22,9 @@ The build procedure is completely standard:
 Make perl executable and create a symlink for libperl:
 
   chmod a+x /boot/common/bin/perl
-  cd /boot/common/lib; ln -s perl5/5.22.1/BePC-haiku/CORE/libperl.so .
+  cd /boot/common/lib; ln -s perl5/5.22.2/BePC-haiku/CORE/libperl.so .
 
-Replace C<5.22.1> with your respective version of Perl.
+Replace C<5.22.2> with your respective version of Perl.
 
 =head1 KNOWN PROBLEMS
 
index 0e9b851..77c25ec 100644 (file)
@@ -10,9 +10,9 @@ perlmacosx - Perl under Mac OS X
 
 This document briefly describes Perl under Mac OS X.
 
-  curl -O http://www.cpan.org/src/perl-5.22.1.tar.gz
-  tar -xzf perl-5.22.1.tar.gz
-  cd perl-5.22.1
+  curl -O http://www.cpan.org/src/perl-5.22.2.tar.gz
+  tar -xzf perl-5.22.2.tar.gz
+  cd perl-5.22.2
   ./Configure -des -Dprefix=/usr/local/
   make
   make test
@@ -20,7 +20,7 @@ This document briefly describes Perl under Mac OS X.
 
 =head1 DESCRIPTION
 
-The latest Perl release (5.22.1 as of this writing) builds without changes
+The latest Perl release (5.22.2 as of this writing) builds without changes
 under all versions of Mac OS X from 10.3 "Panther" onwards. 
 
 In order to build your own version of Perl you will need 'make',
index d6128bd..f9a4723 100644 (file)
@@ -619,7 +619,7 @@ C<set PERLLIB_PREFIX> in F<Config.sys>, see L<"PERLLIB_PREFIX">.
 
 =item Additional Perl modules
 
-  unzip perl_ste.zip -d f:/perllib/lib/site_perl/5.22.1/
+  unzip perl_ste.zip -d f:/perllib/lib/site_perl/5.22.2/
 
 Same remark as above applies.  Additionally, if this directory is not
 one of directories on @INC (and @INC is influenced by C<PERLLIB_PREFIX>), you
index 0801396..28cae74 100644 (file)
@@ -142,11 +142,11 @@ You may need to set up a foreign symbol for the unpacking utility of
 choice.  Once you have done so, use a command like the following to
 unpack the archive:
 
-    vmstar -xvf perl-5^.22^.1.tar
+    vmstar -xvf perl-5^.22^.2.tar
 
 Then set default to the top-level source directory like so:
 
-    set default [.perl-5^.22^.1]
+    set default [.perl-5^.22^.2]
 
 and proceed with configuration as described in the next section.
 
index fb2224e..fc93f24 100755 (executable)
@@ -1967,8 +1967,10 @@ sed <<!GROK!THIS! >$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un
  *     LONG_DOUBLE_IS_IEEE_754_128_BIT_BIG_ENDIAN
  *     LONG_DOUBLE_IS_X86_80_BIT_LITTLE_ENDIAN
  *     LONG_DOUBLE_IS_X86_80_BIT_BIG_ENDIAN
- *     LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LITTLE_ENDIAN
- *     LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BIG_ENDIAN
+ *     LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LE_LE
+ *     LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BE_BE
+ *     LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LE_BE
+ *     LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BE_LE
  *     LONG_DOUBLE_IS_UNKNOWN_FORMAT
  *     It is only defined if the system supports long doubles.
  */
@@ -1982,9 +1984,14 @@ sed <<!GROK!THIS! >$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un
 #define LONG_DOUBLE_IS_IEEE_754_128_BIT_BIG_ENDIAN     2
 #define LONG_DOUBLE_IS_X86_80_BIT_LITTLE_ENDIAN                3
 #define LONG_DOUBLE_IS_X86_80_BIT_BIG_ENDIAN           4
-#define LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LITTLE_ENDIAN      5
-#define LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BIG_ENDIAN 6
+#define LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LE_LE      5
+#define LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BE_BE      6
+#define LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LE_BE      7
+#define LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BE_LE      8
 #define LONG_DOUBLE_IS_UNKNOWN_FORMAT                  -1
+/* Backward compat. */
+#define LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LITTLE_ENDIAN      LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LE_LE
+#define LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BIG_ENDIAN LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BE_BE
 #endif
 
 /* HAS_LONG_LONG:
diff --git a/cop.h b/cop.h
index 8a96331..f2006c2 100644 (file)
--- a/cop.h
+++ b/cop.h
@@ -935,11 +935,13 @@ struct subst {
        cx->sb_rx               = rx,                                   \
        cx->cx_type             = CXt_SUBST | (once ? CXp_ONCE : 0);    \
        rxres_save(&cx->sb_rxres, rx);                                  \
-       (void)ReREFCNT_inc(rx)
+       (void)ReREFCNT_inc(rx);                                         \
+        SvREFCNT_inc_void_NN(targ)
 
 #  define POPSUBST(cx) cx = &cxstack[cxstack_ix--];                    \
        rxres_free(&cx->sb_rxres);                                      \
-       ReREFCNT_dec(cx->sb_rx)
+       ReREFCNT_dec(cx->sb_rx);                                        \
+        SvREFCNT_dec_NN(cx->sb_targ)
 #endif
 
 #define CxONCE(cx)             ((cx)->cx_type & CXp_ONCE)
index a9e8441..b254182 100644 (file)
@@ -1,3 +1,21 @@
+5.20160429
+ - Updated for v5.22.2
+
+5.20160320
+ - Updated vor v5.23.9
+
+5.20160228
+  - [perl #127624] corelist: wrong Digest::SHA version in 5.18.4
+
+5.20160220
+  - Updated for v5.23.8
+
+5.20160120
+  - Updated for v5.23.7
+
+5.20151220
+  - Updated for v5.23.6
+
 5.20151213
   - Updated for v5.22.1
 
index 17655b2..beeda29 100644 (file)
@@ -4,7 +4,7 @@ use vars qw/$VERSION %released %version %families %upstream
            %bug_tracker %deprecated %delta/;
 use Module::CoreList::TieHashDelta;
 use version;
-$VERSION = '5.20151213';
+$VERSION = '5.20160429';
 
 sub _released_order {   # Sort helper, to make '?' sort after everything else
     (substr($released{$a}, 0, 1) eq "?")
@@ -287,6 +287,11 @@ sub changes_between {
     5.023004 => '2015-10-20',
     5.023005 => '2015-11-20',
     5.022001 => '2015-12-13',
+    5.023006 => '2015-12-21',
+    5.023007 => '2016-01-20',
+    5.023008 => '2016-02-20',
+    5.023009 => '2016-03-20',
+    5.022002 => '2016-04-29',
   );
 
 for my $version ( sort { $a <=> $b } keys %released ) {
@@ -8115,6 +8120,8 @@ for my $version ( sort { $a <=> $b } keys %released ) {
     5.018003 => {
         delta_from => 5.018002,
         changed => {
+            'Config'                => '5.018003',
+            'Digest::SHA'           => '5.84_02',
             'Module::CoreList'      => '3.12',
             'Module::CoreList::TieHashDelta'=> '3.12',
             'Module::CoreList::Utils'=> '3.12',
@@ -8123,6 +8130,7 @@ for my $version ( sort { $a <=> $b } keys %released ) {
     5.018004 => {
         delta_from => 5.018003,
         changed => {
+            'Config'                => '5.018004',
             'Module::CoreList'      => '3.13',
             'Module::CoreList::TieHashDelta'=> '3.13',
             'Module::CoreList::Utils'=> '3.13',
@@ -12020,6 +12028,361 @@ for my $version ( sort { $a <=> $b } keys %released ) {
         removed => {
         }
     },
+    5.023006 => {
+        delta_from => 5.023005,
+        changed => {
+            'B::Deparse'            => '1.36',
+            'B::Op_private'         => '5.023006',
+            'Benchmark'             => '1.21',
+            'CPAN::Meta::Requirements'=> '2.140',
+            'CPAN::Meta::YAML'      => '0.018',
+            'Config'                => '5.023006',
+            'Cwd'                   => '3.60',
+            'Data::Dumper'          => '2.159',
+            'DynaLoader'            => '1.37',
+            'File::Spec'            => '3.60',
+            'File::Spec::AmigaOS'   => '3.60',
+            'File::Spec::Cygwin'    => '3.60',
+            'File::Spec::Epoc'      => '3.60',
+            'File::Spec::Functions' => '3.60',
+            'File::Spec::Mac'       => '3.60',
+            'File::Spec::OS2'       => '3.60',
+            'File::Spec::Unix'      => '3.60',
+            'File::Spec::VMS'       => '3.60',
+            'File::Spec::Win32'     => '3.60',
+            'Hash::Util::FieldHash' => '1.19',
+            'Locale::Codes'         => '3.37',
+            'Locale::Codes::Constants'=> '3.37',
+            'Locale::Codes::Country'=> '3.37',
+            'Locale::Codes::Country_Codes'=> '3.37',
+            'Locale::Codes::Country_Retired'=> '3.37',
+            'Locale::Codes::Currency'=> '3.37',
+            'Locale::Codes::Currency_Codes'=> '3.37',
+            'Locale::Codes::Currency_Retired'=> '3.37',
+            'Locale::Codes::LangExt'=> '3.37',
+            'Locale::Codes::LangExt_Codes'=> '3.37',
+            'Locale::Codes::LangExt_Retired'=> '3.37',
+            'Locale::Codes::LangFam'=> '3.37',
+            'Locale::Codes::LangFam_Codes'=> '3.37',
+            'Locale::Codes::LangFam_Retired'=> '3.37',
+            'Locale::Codes::LangVar'=> '3.37',
+            'Locale::Codes::LangVar_Codes'=> '3.37',
+            'Locale::Codes::LangVar_Retired'=> '3.37',
+            'Locale::Codes::Language'=> '3.37',
+            'Locale::Codes::Language_Codes'=> '3.37',
+            'Locale::Codes::Language_Retired'=> '3.37',
+            'Locale::Codes::Script' => '3.37',
+            'Locale::Codes::Script_Codes'=> '3.37',
+            'Locale::Codes::Script_Retired'=> '3.37',
+            'Locale::Country'       => '3.37',
+            'Locale::Currency'      => '3.37',
+            'Locale::Language'      => '3.37',
+            'Locale::Script'        => '3.37',
+            'Math::BigInt::FastCalc'=> '0.38',
+            'Module::CoreList'      => '5.20151220',
+            'Module::CoreList::TieHashDelta'=> '5.20151220',
+            'Module::CoreList::Utils'=> '5.20151220',
+            'Module::Metadata'      => '1.000031',
+            'Opcode'                => '1.34',
+            'PerlIO::mmap'          => '0.016',
+            'Pod::Perldoc'          => '3.25_02',
+            'SDBM_File'             => '1.14',
+            'Term::ANSIColor'       => '4.04',
+            'Test'                  => '1.28',
+            'Unicode::Normalize'    => '1.24',
+            'XS::APItest'           => '0.77',
+            'base'                  => '2.23',
+            'encoding::warnings'    => '0.12',
+            'fields'                => '2.23',
+            'locale'                => '1.08',
+            'strict'                => '1.10',
+            'threads'               => '2.05',
+            'threads::shared'       => '1.50',
+            'utf8'                  => '1.18',
+        },
+        removed => {
+        }
+    },
+    5.023007 => {
+        delta_from => 5.023006,
+        changed => {
+            'App::Prove'            => '3.36',
+            'App::Prove::State'     => '3.36',
+            'App::Prove::State::Result'=> '3.36',
+            'App::Prove::State::Result::Test'=> '3.36',
+            'B'                     => '1.62',
+            'B::Deparse'            => '1.37',
+            'B::Op_private'         => '5.023007',
+            'Benchmark'             => '1.22',
+            'Config'                => '5.023007',
+            'Cwd'                   => '3.62',
+            'Data::Dumper'          => '2.160',
+            'ExtUtils::ParseXS'     => '3.31',
+            'ExtUtils::ParseXS::Constants'=> '3.31',
+            'ExtUtils::ParseXS::CountLines'=> '3.31',
+            'ExtUtils::ParseXS::Eval'=> '3.31',
+            'ExtUtils::ParseXS::Utilities'=> '3.31',
+            'ExtUtils::Typemaps'    => '3.31',
+            'ExtUtils::Typemaps::Cmd'=> '3.31',
+            'ExtUtils::Typemaps::InputMap'=> '3.31',
+            'ExtUtils::Typemaps::OutputMap'=> '3.31',
+            'ExtUtils::Typemaps::Type'=> '3.31',
+            'File::Find'            => '1.33',
+            'File::Spec'            => '3.62',
+            'File::Spec::AmigaOS'   => '3.62',
+            'File::Spec::Cygwin'    => '3.62',
+            'File::Spec::Epoc'      => '3.62',
+            'File::Spec::Functions' => '3.62',
+            'File::Spec::Mac'       => '3.62',
+            'File::Spec::OS2'       => '3.62',
+            'File::Spec::Unix'      => '3.62',
+            'File::Spec::VMS'       => '3.62',
+            'File::Spec::Win32'     => '3.62',
+            'Math::BigFloat'        => '1.999715',
+            'Math::BigFloat::Trace' => '0.42',
+            'Math::BigInt'          => '1.999715',
+            'Math::BigInt::Calc'    => '1.999715',
+            'Math::BigInt::CalcEmu' => '1.999715',
+            'Math::BigInt::FastCalc'=> '0.40',
+            'Math::BigInt::Trace'   => '0.42',
+            'Math::BigRat'          => '0.260802',
+            'Module::CoreList'      => '5.20160120',
+            'Module::CoreList::TieHashDelta'=> '5.20160120',
+            'Module::CoreList::Utils'=> '5.20160120',
+            'Net::Cmd'              => '3.08',
+            'Net::Config'           => '3.08',
+            'Net::Domain'           => '3.08',
+            'Net::FTP'              => '3.08',
+            'Net::FTP::A'           => '3.08',
+            'Net::FTP::E'           => '3.08',
+            'Net::FTP::I'           => '3.08',
+            'Net::FTP::L'           => '3.08',
+            'Net::FTP::dataconn'    => '3.08',
+            'Net::NNTP'             => '3.08',
+            'Net::Netrc'            => '3.08',
+            'Net::POP3'             => '3.08',
+            'Net::SMTP'             => '3.08',
+            'Net::Time'             => '3.08',
+            'Pod::Man'              => '4.04',
+            'Pod::ParseLink'        => '4.04',
+            'Pod::Text'             => '4.04',
+            'Pod::Text::Color'      => '4.04',
+            'Pod::Text::Overstrike' => '4.04',
+            'Pod::Text::Termcap'    => '4.04',
+            'Pod::Usage'            => '1.68',
+            'TAP::Base'             => '3.36',
+            'TAP::Formatter::Base'  => '3.36',
+            'TAP::Formatter::Color' => '3.36',
+            'TAP::Formatter::Console'=> '3.36',
+            'TAP::Formatter::Console::ParallelSession'=> '3.36',
+            'TAP::Formatter::Console::Session'=> '3.36',
+            'TAP::Formatter::File'  => '3.36',
+            'TAP::Formatter::File::Session'=> '3.36',
+            'TAP::Formatter::Session'=> '3.36',
+            'TAP::Harness'          => '3.36',
+            'TAP::Harness::Env'     => '3.36',
+            'TAP::Object'           => '3.36',
+            'TAP::Parser'           => '3.36',
+            'TAP::Parser::Aggregator'=> '3.36',
+            'TAP::Parser::Grammar'  => '3.36',
+            'TAP::Parser::Iterator' => '3.36',
+            'TAP::Parser::Iterator::Array'=> '3.36',
+            'TAP::Parser::Iterator::Process'=> '3.36',
+            'TAP::Parser::Iterator::Stream'=> '3.36',
+            'TAP::Parser::IteratorFactory'=> '3.36',
+            'TAP::Parser::Multiplexer'=> '3.36',
+            'TAP::Parser::Result'   => '3.36',
+            'TAP::Parser::Result::Bailout'=> '3.36',
+            'TAP::Parser::Result::Comment'=> '3.36',
+            'TAP::Parser::Result::Plan'=> '3.36',
+            'TAP::Parser::Result::Pragma'=> '3.36',
+            'TAP::Parser::Result::Test'=> '3.36',
+            'TAP::Parser::Result::Unknown'=> '3.36',
+            'TAP::Parser::Result::Version'=> '3.36',
+            'TAP::Parser::Result::YAML'=> '3.36',
+            'TAP::Parser::ResultFactory'=> '3.36',
+            'TAP::Parser::Scheduler'=> '3.36',
+            'TAP::Parser::Scheduler::Job'=> '3.36',
+            'TAP::Parser::Scheduler::Spinner'=> '3.36',
+            'TAP::Parser::Source'   => '3.36',
+            'TAP::Parser::SourceHandler'=> '3.36',
+            'TAP::Parser::SourceHandler::Executable'=> '3.36',
+            'TAP::Parser::SourceHandler::File'=> '3.36',
+            'TAP::Parser::SourceHandler::Handle'=> '3.36',
+            'TAP::Parser::SourceHandler::Perl'=> '3.36',
+            'TAP::Parser::SourceHandler::RawTAP'=> '3.36',
+            'TAP::Parser::YAMLish::Reader'=> '3.36',
+            'TAP::Parser::YAMLish::Writer'=> '3.36',
+            'Test::Harness'         => '3.36',
+            'Unicode::Normalize'    => '1.25',
+            'Unicode::UCD'          => '0.64',
+            'XS::APItest'           => '0.78',
+            'bigint'                => '0.42',
+            'bignum'                => '0.42',
+            'bigrat'                => '0.42',
+            'utf8'                  => '1.19',
+        },
+        removed => {
+        }
+    },
+    5.023008 => {
+        delta_from => 5.023007,
+        changed => {
+            'B::Op_private'         => '5.023008',
+            'Config'                => '5.023008',
+            'Cwd'                   => '3.63',
+            'DynaLoader'            => '1.38',
+            'Encode'                => '2.80',
+            'Encode::Alias'         => '2.20',
+            'Encode::MIME::Header'  => '2.19',
+            'Encode::Unicode'       => '2.15',
+            'ExtUtils::CBuilder'    => '0.280225',
+            'ExtUtils::CBuilder::Base'=> '0.280225',
+            'ExtUtils::CBuilder::Platform::Unix'=> '0.280225',
+            'ExtUtils::CBuilder::Platform::VMS'=> '0.280225',
+            'ExtUtils::CBuilder::Platform::Windows'=> '0.280225',
+            'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.280225',
+            'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.280225',
+            'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.280225',
+            'ExtUtils::CBuilder::Platform::aix'=> '0.280225',
+            'ExtUtils::CBuilder::Platform::android'=> '0.280225',
+            'ExtUtils::CBuilder::Platform::cygwin'=> '0.280225',
+            'ExtUtils::CBuilder::Platform::darwin'=> '0.280225',
+            'ExtUtils::CBuilder::Platform::dec_osf'=> '0.280225',
+            'ExtUtils::CBuilder::Platform::os2'=> '0.280225',
+            'ExtUtils::Command::MM' => '7.10_01',
+            'ExtUtils::Liblist'     => '7.10_01',
+            'ExtUtils::Liblist::Kid'=> '7.10_01',
+            'ExtUtils::MM'          => '7.10_01',
+            'ExtUtils::MM_AIX'      => '7.10_01',
+            'ExtUtils::MM_Any'      => '7.10_01',
+            'ExtUtils::MM_BeOS'     => '7.10_01',
+            'ExtUtils::MM_Cygwin'   => '7.10_01',
+            'ExtUtils::MM_DOS'      => '7.10_01',
+            'ExtUtils::MM_Darwin'   => '7.10_01',
+            'ExtUtils::MM_MacOS'    => '7.10_01',
+            'ExtUtils::MM_NW5'      => '7.10_01',
+            'ExtUtils::MM_OS2'      => '7.10_01',
+            'ExtUtils::MM_QNX'      => '7.10_01',
+            'ExtUtils::MM_UWIN'     => '7.10_01',
+            'ExtUtils::MM_Unix'     => '7.10_01',
+            'ExtUtils::MM_VMS'      => '7.10_01',
+            'ExtUtils::MM_VOS'      => '7.10_01',
+            'ExtUtils::MM_Win32'    => '7.10_01',
+            'ExtUtils::MM_Win95'    => '7.10_01',
+            'ExtUtils::MY'          => '7.10_01',
+            'ExtUtils::MakeMaker'   => '7.10_01',
+            'ExtUtils::MakeMaker::Config'=> '7.10_01',
+            'ExtUtils::MakeMaker::version'=> '7.10_01',
+            'ExtUtils::MakeMaker::version::regex'=> '7.10_01',
+            'ExtUtils::Mkbootstrap' => '7.10_01',
+            'ExtUtils::Mksymlists'  => '7.10_01',
+            'ExtUtils::testlib'     => '7.10_01',
+            'File::Spec'            => '3.63',
+            'File::Spec::AmigaOS'   => '3.63',
+            'File::Spec::Cygwin'    => '3.63',
+            'File::Spec::Epoc'      => '3.63',
+            'File::Spec::Functions' => '3.63',
+            'File::Spec::Mac'       => '3.63',
+            'File::Spec::OS2'       => '3.63',
+            'File::Spec::Unix'      => '3.63',
+            'File::Spec::VMS'       => '3.63',
+            'File::Spec::Win32'     => '3.63',
+            'IPC::Msg'              => '2.05',
+            'IPC::Semaphore'        => '2.05',
+            'IPC::SharedMem'        => '2.05',
+            'IPC::SysV'             => '2.05',
+            'Module::CoreList'      => '5.20160121',
+            'Module::CoreList::TieHashDelta'=> '5.20160121',
+            'Module::CoreList::Utils'=> '5.20160121',
+            'ODBM_File'             => '1.13',
+            'POSIX'                 => '1.63',
+            'PerlIO::encoding'      => '0.24',
+            'Pod::Man'              => '4.06',
+            'Pod::ParseLink'        => '4.06',
+            'Pod::Text'             => '4.06',
+            'Pod::Text::Color'      => '4.06',
+            'Pod::Text::Overstrike' => '4.06',
+            'Pod::Text::Termcap'    => '4.06',
+            'Storable'              => '2.55',
+            'Time::HiRes'           => '1.9730',
+            'XS::APItest'           => '0.79',
+        },
+        removed => {
+        }
+    },
+    5.023009 => {
+        delta_from => 5.023008,
+        changed => {
+            'Amiga::ARexx'          => '0.04',
+            'Amiga::Exec'           => '0.02',
+            'B::Op_private'         => '5.023009',
+            'Carp'                  => '1.40',
+            'Carp::Heavy'           => '1.40',
+            'Config'                => '5.023009',
+            'Errno'                 => '1.25',
+            'ExtUtils::Embed'       => '1.33',
+            'File::Find'            => '1.34',
+            'File::Glob'            => '1.26',
+            'File::Spec::AmigaOS'   => ';.64',
+            'IPC::Msg'              => '2.06_01',
+            'IPC::Semaphore'        => '2.06_01',
+            'IPC::SharedMem'        => '2.06_01',
+            'IPC::SysV'             => '2.06_01',
+            'List::Util'            => '1.42_02',
+            'List::Util::XS'        => '1.42_02',
+            'Module::CoreList'      => '5.20160320',
+            'Module::CoreList::TieHashDelta'=> '5.20160320',
+            'Module::CoreList::Utils'=> '5.20160320',
+            'POSIX'                 => '1.64',
+            'Pod::Functions'        => '1.10',
+            'Pod::Functions::Functions'=> '1.10',
+            'Scalar::Util'          => '1.42_02',
+            'SelfLoader'            => '1.23',
+            'Socket'                => '2.020_03',
+            'Storable'              => '2.56',
+            'Sub::Util'             => '1.42_02',
+            'Thread::Queue'         => '3.08',
+            'Tie::File'             => '1.02',
+            'Time::HiRes'           => '1.9732',
+            'Win32API::File'        => '0.1203',
+            'Win32API::File::inc::ExtUtils::Myconst2perl'=> '1',
+            'XS::APItest'           => '0.80',
+            'autouse'               => '1.11',
+            'bytes'                 => '1.05',
+            'strict'                => '1.11',
+            'threads'               => '2.06',
+            'version'               => '0.9916',
+            'version::regex'        => '0.9916',
+            'warnings'              => '1.36',
+        },
+        removed => {
+            'Win32API::File::ExtUtils::Myconst2perl'=> 1,
+        }
+    },
+    5.022002 => {
+        delta_from => 5.022001,
+        changed => {
+            'B::Op_private'         => '5.022002',
+            'Config'                => '5.022002',
+            'Cwd'                   => '3.56_01',
+            'File::Spec'            => '3.56_01',
+            'File::Spec::Cygwin'    => '3.56_01',
+            'File::Spec::Epoc'      => '3.56_01',
+            'File::Spec::Functions' => '3.56_01',
+            'File::Spec::Mac'       => '3.56_01',
+            'File::Spec::OS2'       => '3.56_01',
+            'File::Spec::Unix'      => '3.56_01',
+            'File::Spec::VMS'       => '3.56_01',
+            'File::Spec::Win32'     => '3.56_01',
+            'Module::CoreList'      => '5.20160429',
+            'Module::CoreList::TieHashDelta'=> '5.20160429',
+            'Module::CoreList::Utils'=> '5.20160429',
+            'XS::APItest'           => '0.72_01',
+        },
+        removed => {
+        }
+    },
 );
 
 sub is_core
@@ -12632,6 +12995,41 @@ for my $version (sort { $a <=> $b } keys %delta) {
         removed => {
         }
     },
+    5.023006 => {
+        delta_from => 5.023005,
+        changed => {
+        },
+        removed => {
+        }
+    },
+    5.023007 => {
+        delta_from => 5.023006,
+        changed => {
+        },
+        removed => {
+        }
+    },
+    5.023008 => {
+        delta_from => 5.023007,
+        changed => {
+        },
+        removed => {
+        }
+    },
+    5.023009 => {
+        delta_from => 5.023008,
+        changed => {
+        },
+        removed => {
+        }
+    },
+    5.022002 => {
+        delta_from => 5.022001,
+        changed => {
+        },
+        removed => {
+        }
+    },
 );
 
 for my $version (sort { $a <=> $b } keys %deprecated) {
@@ -13085,7 +13483,7 @@ for my $version (sort { $a <=> $b } keys %deprecated) {
     'CPAN::Meta::History'   => 'https://github.com/Perl-Toolchain-Gang/CPAN-Meta/issues',
     'CPAN::Meta::Merge'     => 'https://github.com/Perl-Toolchain-Gang/CPAN-Meta/issues',
     'CPAN::Meta::Prereqs'   => 'https://github.com/Perl-Toolchain-Gang/CPAN-Meta/issues',
-    'CPAN::Meta::Requirements'=> 'https://github.com/dagolden/CPAN-Meta-Requirements/issues',
+    'CPAN::Meta::Requirements'=> 'https://github.com/Perl-Toolchain-Gang/CPAN-Meta-Requirements/issues',
     'CPAN::Meta::Spec'      => 'https://github.com/Perl-Toolchain-Gang/CPAN-Meta/issues',
     'CPAN::Meta::Validator' => 'https://github.com/Perl-Toolchain-Gang/CPAN-Meta/issues',
     'CPAN::Meta::YAML'      => 'https://github.com/Perl-Toolchain-Gang/YAML-Tiny/issues',
@@ -13217,8 +13615,8 @@ for my $version (sort { $a <=> $b } keys %deprecated) {
     'IPC::SysV'             => undef,
     'JSON::PP'              => undef,
     'JSON::PP::Boolean'     => undef,
-    'List::Util'            => undef,
-    'List::Util::XS'        => undef,
+    'List::Util'            => 'https://rt.cpan.org/Public/Dist/Display.html?Name=Scalar-List-Utils',
+    'List::Util::XS'        => 'https://rt.cpan.org/Public/Dist/Display.html?Name=Scalar-List-Utils',
     'Locale::Codes'         => undef,
     'Locale::Codes::Constants'=> undef,
     'Locale::Codes::Country'=> undef,
@@ -13289,8 +13687,8 @@ for my $version (sort { $a <=> $b } keys %deprecated) {
     'Pod::Escapes'          => undef,
     'Pod::Find'             => undef,
     'Pod::InputObjects'     => undef,
-    'Pod::Man'              => undef,
-    'Pod::ParseLink'        => undef,
+    'Pod::Man'              => 'https://rt.cpan.org/Dist/Display.html?Name=podlators',
+    'Pod::ParseLink'        => 'https://rt.cpan.org/Dist/Display.html?Name=podlators',
     'Pod::ParseUtils'       => undef,
     'Pod::Parser'           => undef,
     'Pod::Perldoc'          => undef,
@@ -13336,14 +13734,14 @@ for my $version (sort { $a <=> $b } keys %deprecated) {
     'Pod::Simple::TranscodeSmart'=> 'https://github.com/perl-pod/pod-simple/issues',
     'Pod::Simple::XHTML'    => 'https://github.com/perl-pod/pod-simple/issues',
     'Pod::Simple::XMLOutStream'=> 'https://github.com/perl-pod/pod-simple/issues',
-    'Pod::Text'             => undef,
-    'Pod::Text::Color'      => undef,
-    'Pod::Text::Overstrike' => undef,
-    'Pod::Text::Termcap'    => undef,
+    'Pod::Text'             => 'https://rt.cpan.org/Dist/Display.html?Name=podlators',
+    'Pod::Text::Color'      => 'https://rt.cpan.org/Dist/Display.html?Name=podlators',
+    'Pod::Text::Overstrike' => 'https://rt.cpan.org/Dist/Display.html?Name=podlators',
+    'Pod::Text::Termcap'    => 'https://rt.cpan.org/Dist/Display.html?Name=podlators',
     'Pod::Usage'            => undef,
-    'Scalar::Util'          => undef,
+    'Scalar::Util'          => 'https://rt.cpan.org/Public/Dist/Display.html?Name=Scalar-List-Utils',
     'Socket'                => undef,
-    'Sub::Util'             => undef,
+    'Sub::Util'             => 'https://rt.cpan.org/Public/Dist/Display.html?Name=Scalar-List-Utils',
     'Sys::Syslog'           => undef,
     'Sys::Syslog::Win32'    => undef,
     'TAP::Base'             => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
@@ -13389,7 +13787,7 @@ for my $version (sort { $a <=> $b } keys %deprecated) {
     'TAP::Parser::SourceHandler::RawTAP'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
     'TAP::Parser::YAMLish::Reader'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
     'TAP::Parser::YAMLish::Writer'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
-    'Term::ANSIColor'       => 'https://rt.cpan.org/Public/Dist/Display.html?Name=Term-ANSIColor',
+    'Term::ANSIColor'       => 'https://rt.cpan.org/Dist/Display.html?Name=Term-ANSIColor',
     'Term::Cap'             => undef,
     'Test'                  => undef,
     'Test::Builder'         => 'http://github.com/Test-More/test-more/issues/',
index d8807bf..0ab1f61 100644 (file)
@@ -8,9 +8,14 @@ Module::CoreList - what modules shipped with versions of perl
 
  print $Module::CoreList::version{5.00503}{CPAN}; # prints 1.48
 
- print Module::CoreList->first_release('File::Spec');         # prints 5.00405
- print Module::CoreList->first_release_by_date('File::Spec'); # prints 5.005
- print Module::CoreList->first_release('File::Spec', 0.82);   # prints 5.006001
+ print Module::CoreList->first_release('File::Spec');
+ # prints 5.00405
+
+ print Module::CoreList->first_release_by_date('File::Spec');
+ # prints 5.005
+
+ print Module::CoreList->first_release('File::Spec', 0.82);
+ # prints 5.006001
 
  if (Module::CoreList::is_core('File::Spec')) {
    print "File::Spec is a core module\n";
@@ -19,7 +24,7 @@ Module::CoreList - what modules shipped with versions of perl
  print join ', ', Module::CoreList->find_modules(qr/Data/);
     # prints 'Data::Dumper'
  print join ', ',
-            Module::CoreList->find_modules(qr/test::h.*::.*s/i, 5.008008);
+          Module::CoreList->find_modules(qr/test::h.*::.*s/i, 5.008008);
     # prints 'Test::Harness::Assert, Test::Harness::Straps'
 
  print join ", ", @{ $Module::CoreList::families{5.005} };
index bbe1066..4b7c5a5 100644 (file)
@@ -3,7 +3,7 @@ package Module::CoreList::TieHashDelta;
 use strict;
 use vars qw($VERSION);
 
-$VERSION = '5.20151213';
+$VERSION = '5.20160429';
 
 sub TIEHASH {
     my ($class, $changed, $removed, $parent) = @_;
index ef82479..cbf1ca9 100644 (file)
@@ -6,7 +6,7 @@ use vars qw[$VERSION %utilities];
 use Module::CoreList;
 use Module::CoreList::TieHashDelta;
 
-$VERSION = '5.20151213';
+$VERSION = '5.20160429';
 
 sub utilities {
     my $perl = shift;
@@ -1108,6 +1108,41 @@ my %delta = (
         removed => {
         }
     },
+    5.023006 => {
+        delta_from => 5.023005,
+        changed => {
+        },
+        removed => {
+        }
+    },
+    5.023007 => {
+        delta_from => 5.023006,
+        changed => {
+        },
+        removed => {
+        }
+    },
+    5.023008 => {
+        delta_from => 5.023007,
+        changed => {
+        },
+        removed => {
+        }
+    },
+    5.023009 => {
+        delta_from => 5.023008,
+        changed => {
+        },
+        removed => {
+        }
+    },
+    5.022002 => {
+        delta_from => 5.022001,
+        changed => {
+        },
+        removed => {
+        }
+    },
 );
 
 for my $version (sort { $a <=> $b } keys %delta) {
@@ -1154,8 +1189,11 @@ Module::CoreList::Utils - what utilities shipped with versions of perl
 
  print $Module::CoreList::Utils::utilities{5.009003}{ptar}; # prints 1
 
- print Module::CoreList::Utils->first_release('corelist');           # prints 5.008009
- print Module::CoreList::Utils->first_release_by_date('corelist');   # prints 5.009002
+ print Module::CoreList::Utils->first_release('corelist');
+ # prints 5.008009
+
+ print Module::CoreList::Utils->first_release_by_date('corelist');
+ # prints 5.009002
 
 =head1 DESCRIPTION
 
index 49cc4c1..b4e80c6 100644 (file)
@@ -3,7 +3,7 @@ use strict;
 use Exporter;
 use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION);
 
-$VERSION = '3.56';
+$VERSION = '3.56_01';
 my $xs_version = $VERSION;
 $VERSION =~ tr/_//;
 
index 9d4dcf0..3d018dc 100644 (file)
@@ -535,6 +535,7 @@ THX_unix_canonpath(pTHX_ SV *path)
     *o = 0;
     SvPOK_on(retval);
     SvCUR_set(retval, o - SvPVX(retval));
+    SvTAINT(retval);
     return retval;
 }
 
index 8c77c98..584a1d0 100644 (file)
@@ -3,7 +3,7 @@ package File::Spec;
 use strict;
 use vars qw(@ISA $VERSION);
 
-$VERSION = '3.56';
+$VERSION = '3.56_01';
 $VERSION =~ tr/_//;
 
 my %module = (MacOS   => 'Mac',
index 1b77e6a..e4d55e1 100644 (file)
@@ -4,7 +4,7 @@ use strict;
 use vars qw(@ISA $VERSION);
 require File::Spec::Unix;
 
-$VERSION = '3.56';
+$VERSION = '3.56_01';
 $VERSION =~ tr/_//;
 
 @ISA = qw(File::Spec::Unix);
index 7bc3867..d9f2126 100644 (file)
@@ -3,7 +3,7 @@ package File::Spec::Epoc;
 use strict;
 use vars qw($VERSION @ISA);
 
-$VERSION = '3.56';
+$VERSION = '3.56_01';
 $VERSION =~ tr/_//;
 
 require File::Spec::Unix;
index 8eafe24..f34966b 100644 (file)
@@ -5,7 +5,7 @@ use strict;
 
 use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $VERSION);
 
-$VERSION = '3.56';
+$VERSION = '3.56_01';
 $VERSION =~ tr/_//;
 
 require Exporter;
index 02cae14..20e8374 100644 (file)
@@ -4,7 +4,7 @@ use strict;
 use vars qw(@ISA $VERSION);
 require File::Spec::Unix;
 
-$VERSION = '3.56';
+$VERSION = '3.56_01';
 $VERSION =~ tr/_//;
 
 @ISA = qw(File::Spec::Unix);
index fb8f101..727032f 100644 (file)
@@ -4,7 +4,7 @@ use strict;
 use vars qw(@ISA $VERSION);
 require File::Spec::Unix;
 
-$VERSION = '3.56';
+$VERSION = '3.56_01';
 $VERSION =~ tr/_//;
 
 @ISA = qw(File::Spec::Unix);
index f76b29e..3525f16 100644 (file)
@@ -3,7 +3,7 @@ package File::Spec::Unix;
 use strict;
 use vars qw($VERSION);
 
-$VERSION = '3.56';
+$VERSION = '3.56_01';
 my $xs_version = $VERSION;
 $VERSION =~ tr/_//;
 
index 254f524..964b26c 100644 (file)
@@ -4,7 +4,7 @@ use strict;
 use vars qw(@ISA $VERSION);
 require File::Spec::Unix;
 
-$VERSION = '3.56';
+$VERSION = '3.56_01';
 $VERSION =~ tr/_//;
 
 @ISA = qw(File::Spec::Unix);
index 53f3854..9a36847 100644 (file)
@@ -5,7 +5,7 @@ use strict;
 use vars qw(@ISA $VERSION);
 require File::Spec::Unix;
 
-$VERSION = '3.56';
+$VERSION = '3.56_01';
 $VERSION =~ tr/_//;
 
 @ISA = qw(File::Spec::Unix);
index 309b3e5..48f8c5b 100644 (file)
@@ -12,7 +12,7 @@ use Test::More;
 BEGIN {
     plan(
         ${^TAINT}
-        ? (tests => 17)
+        ? (tests => 21)
         : (skip_all => "A perl without taint support")
     );
 }
@@ -34,3 +34,20 @@ foreach my $func (@Functions) {
 
 # Previous versions of Cwd tainted $^O
 is !tainted($^O), 1, "\$^O should not be tainted";
+
+{
+    # [perl #126862] canonpath() loses taint
+    my $tainted = substr($ENV{PATH}, 0, 0);
+    # yes, getcwd()'s result should be tainted, and is tested above
+    # but be sure
+    ok tainted(File::Spec->canonpath($tainted . Cwd::getcwd)),
+        "canonpath() keeps taint on non-empty string";
+    ok tainted(File::Spec->canonpath($tainted)),
+        "canonpath() keeps taint on empty string";
+
+    (Cwd::getcwd() =~ /^(.*)/);
+    my $untainted = $1;
+    ok !tainted($untainted), "make sure our untainted value is untainted";
+    ok !tainted(File::Spec->canonpath($untainted)),
+        "canonpath() doesn't add taint to untainted string";
+}
index 5302779..b26ba18 100644 (file)
--- a/embed.fnc
+++ b/embed.fnc
@@ -230,7 +230,9 @@ Apd |void   |av_push        |NN AV *av|NN SV *val
 EXp    |void   |av_reify       |NN AV *av
 ApdR   |SV*    |av_shift       |NN AV *av
 Apd    |SV**   |av_store       |NN AV *av|SSize_t key|NULLOK SV *val
+#ifndef PERL_NO_INLINE_FUNCTIONS
 AidR   |SSize_t|av_top_index   |NN AV *av
+#endif
 AmpdR  |SSize_t|av_tindex      |NN AV *av
 Apd    |void   |av_undef       |NN AV *av
 ApdoxM |SV**   |av_create_and_unshift_one|NN AV **const avp|NN SV *const val
@@ -653,7 +655,9 @@ pR  |OP*    |invert         |NULLOK OP* cmd
 ApR    |I32    |is_lvalue_sub
 : Used in cop.h
 XopR   |I32    |was_lvalue_sub
+#ifndef PERL_NO_INLINE_FUNCTIONS
 AiMRn  |STRLEN |_is_utf8_char_slow|NN const U8 *s|NN const U8 *e
+#endif
 ADMpPR |U32    |to_uni_upper_lc|U32 c
 ADMpPR |U32    |to_uni_title_lc|U32 c
 ADMpPR |U32    |to_uni_lower_lc|U32 c
@@ -1449,7 +1453,9 @@ Apd       |void   |sv_magic       |NN SV *const sv|NULLOK SV *const obj|const int how \
 Apd    |MAGIC *|sv_magicext    |NN SV *const sv|NULLOK SV *const obj|const int how \
                                |NULLOK const MGVTBL *const vtbl|NULLOK const char *const name \
                                |const I32 namlen
+#ifndef PERL_NO_INLINE_FUNCTIONS
 Ein    |bool   |sv_only_taint_gmagic|NN SV *sv
+#endif
 : exported for re.pm
 EXp    |MAGIC *|sv_magicext_mglob|NN SV *sv
 ApdbamR        |SV*    |sv_mortalcopy  |NULLOK SV *const oldsv
@@ -1693,8 +1699,10 @@ Am       |I32    |whichsig       |NN const char* sig
 Ap     |I32    |whichsig_sv    |NN SV* sigsv
 Ap     |I32    |whichsig_pv    |NN const char* sig
 Ap     |I32    |whichsig_pvn   |NN const char* sig|STRLEN len
+#ifndef PERL_NO_INLINE_FUNCTIONS
 : used to check for NULs in pathnames and other names
 AiR    |bool   |is_safe_syscall|NN const char *pv|STRLEN len|NN const char *what|NN const char *op_name
+#endif
 #ifdef PERL_CORE
 inR    |bool   |should_warn_nl|NN const char *pv
 #endif
@@ -2492,6 +2500,12 @@ sn       |void   |mem_log_common |enum mem_log_type mlt|const UV n|const UV typesize \
 #endif
 #endif
 
+#if defined(PERL_MEM_LOG)
+pn     |Malloc_t       |mem_log_alloc  |const UV nconst|UV typesize|NN const char *type_name|Malloc_t newalloc|NN const char *filename|const int linenumber|NN const char *funcname
+pn     |Malloc_t       |mem_log_realloc        |const UV n|const UV typesize|NN const char *type_name|Malloc_t oldalloc|Malloc_t newalloc|NN const char *filename|const int linenumber|NN const char *funcname
+pn     |Malloc_t       |mem_log_free   |Malloc_t oldalloc|NN const char *filename|const int linenumber|NN const char *funcname
+#endif
+
 #if defined(PERL_IN_NUMERIC_C)
 #ifndef USE_QUADMATH
 sn     |NV|mulexp10    |NV value|I32 exponent
@@ -2511,7 +2525,9 @@ sRM       |U8*    |swash_scan_list_line|NN U8* l|NN U8* const lend|NN UV* min \
                |NN const U8* const typestr
 #endif
 
+#ifndef PERL_NO_INLINE_FUNCTIONS
 AiMn   |void   |append_utf8_from_native_byte|const U8 byte|NN U8** dest
+#endif
 
 Apd    |void   |sv_setsv_flags |NN SV *dstr|NULLOK SV *sstr|const I32 flags
 Apd    |void   |sv_catpvn_flags|NN SV *const dstr|NN const char *sstr|const STRLEN len \
diff --git a/embed.h b/embed.h
index 687819c..e09ffee 100644 (file)
--- a/embed.h
+++ b/embed.h
@@ -32,7 +32,6 @@
 #define _is_uni_perl_idcont(a) Perl__is_uni_perl_idcont(aTHX_ a)
 #define _is_uni_perl_idstart(a)        Perl__is_uni_perl_idstart(aTHX_ a)
 #define _is_utf8_FOO(a,b)      Perl__is_utf8_FOO(aTHX_ a,b)
-#define _is_utf8_char_slow     S__is_utf8_char_slow
 #define _is_utf8_idcont(a)     Perl__is_utf8_idcont(aTHX_ a)
 #define _is_utf8_idstart(a)    Perl__is_utf8_idstart(aTHX_ a)
 #define _is_utf8_mark(a)       Perl__is_utf8_mark(aTHX_ a)
@@ -47,7 +46,6 @@
 #define _to_utf8_upper_flags(a,b,c,d)  Perl__to_utf8_upper_flags(aTHX_ a,b,c,d)
 #define amagic_call(a,b,c,d)   Perl_amagic_call(aTHX_ a,b,c,d)
 #define amagic_deref_call(a,b) Perl_amagic_deref_call(aTHX_ a,b)
-#define append_utf8_from_native_byte   S_append_utf8_from_native_byte
 #define apply_attrs_string(a,b,c,d)    Perl_apply_attrs_string(aTHX_ a,b,c,d)
 #define atfork_lock            Perl_atfork_lock
 #define atfork_unlock          Perl_atfork_unlock
@@ -63,7 +61,6 @@
 #define av_push(a,b)           Perl_av_push(aTHX_ a,b)
 #define av_shift(a)            Perl_av_shift(aTHX_ a)
 #define av_store(a,b,c)                Perl_av_store(aTHX_ a,b,c)
-#define av_top_index(a)                S_av_top_index(aTHX_ a)
 #define av_undef(a)            Perl_av_undef(aTHX_ a)
 #define av_unshift(a,b)                Perl_av_unshift(aTHX_ a,b)
 #define block_end(a,b)         Perl_block_end(aTHX_ a,b)
 #define isIDFIRST_lazy(a)      Perl_isIDFIRST_lazy(aTHX_ a)
 #define is_invariant_string    Perl_is_invariant_string
 #define is_lvalue_sub()                Perl_is_lvalue_sub(aTHX)
-#define is_safe_syscall(a,b,c,d)       S_is_safe_syscall(aTHX_ a,b,c,d)
 #define is_uni_alnum(a)                Perl_is_uni_alnum(aTHX_ a)
 #define is_uni_alnum_lc(a)     Perl_is_uni_alnum_lc(aTHX_ a)
 #define is_uni_alnumc(a)       Perl_is_uni_alnumc(aTHX_ a)
 #define my_pclose(a)           Perl_my_pclose(aTHX_ a)
 #define my_popen(a,b)          Perl_my_popen(aTHX_ a,b)
 #endif
+#if !defined(PERL_NO_INLINE_FUNCTIONS)
+#define _is_utf8_char_slow     S__is_utf8_char_slow
+#define append_utf8_from_native_byte   S_append_utf8_from_native_byte
+#define av_top_index(a)                S_av_top_index(aTHX_ a)
+#define is_safe_syscall(a,b,c,d)       S_is_safe_syscall(aTHX_ a,b,c,d)
+#endif
 #if (!defined(HAS_MEMCPY) && !defined(HAS_BCOPY)) || (!defined(HAS_MEMMOVE) && !defined(HAS_SAFE_MEMCPY) && !defined(HAS_SAFE_BCOPY))
 #define my_bcopy               Perl_my_bcopy
 #endif
 #define reg_temp_copy(a,b)     Perl_reg_temp_copy(aTHX_ a,b)
 #define report_uninit(a)       Perl_report_uninit(aTHX_ a)
 #define sv_magicext_mglob(a)   Perl_sv_magicext_mglob(aTHX_ a)
-#define sv_only_taint_gmagic   S_sv_only_taint_gmagic
 #define validate_proto(a,b,c)  Perl_validate_proto(aTHX_ a,b,c)
 #define vivify_defelem(a)      Perl_vivify_defelem(aTHX_ a)
 #define yylex()                        Perl_yylex(aTHX)
 #define invlist_trim           S_invlist_trim
 #    endif
 #  endif
+#  if !defined(PERL_NO_INLINE_FUNCTIONS)
+#define sv_only_taint_gmagic   S_sv_only_taint_gmagic
+#  endif
 #  if defined(DEBUGGING)
 #    if defined(PERL_IN_REGCOMP_C)
 #define dump_trie(a,b,c,d)     S_dump_trie(aTHX_ a,b,c,d)
 #define mem_log_common         S_mem_log_common
 #    endif
 #  endif
+#  if defined(PERL_MEM_LOG)
+#define mem_log_alloc          Perl_mem_log_alloc
+#define mem_log_free           Perl_mem_log_free
+#define mem_log_realloc                Perl_mem_log_realloc
+#  endif
 #  if defined(PERL_USES_PL_PIDSTATUS) && defined(PERL_IN_UTIL_C)
 #define pidgone(a,b)           S_pidgone(aTHX_ a,b)
 #  endif
index 5e5c311..c4f38ca 100644 (file)
@@ -5,7 +5,7 @@ use strict;
 use warnings;
 use Carp;
 
-our $VERSION = '0.72';
+our $VERSION = '0.72_01';
 
 require XSLoader;
 
index c78dc7b..5cc63c8 100644 (file)
@@ -5067,3 +5067,12 @@ has_backrefs(SV *sv)
     OUTPUT:
         RETVAL
 
+#if defined(WIN32) && defined(PERL_IMPLICIT_SYS)
+
+const char *
+PerlDir_mapA(const char *path)
+
+const WCHAR *
+PerlDir_mapW(const WCHAR *wpath)
+
+#endif
diff --git a/ext/XS-APItest/t/win32.t b/ext/XS-APItest/t/win32.t
new file mode 100644 (file)
index 0000000..a8905c2
--- /dev/null
@@ -0,0 +1,39 @@
+#!perl -w
+use strict;
+use Test::More;
+use XS::APItest;
+use Config;
+
+plan skip_all => "Tests only apply on MSWin32"
+  unless $^O eq "MSWin32";
+
+SKIP:
+{
+    # [perl #126755] previous the bad drive tests would crash
+    $Config{ccflags} =~ /(?:\A|\s)-DPERL_IMPLICIT_SYS\b/
+      or skip "need implicit_sys for this test", 1;
+    eval "use Encode; 1"
+      or skip "Can't load Encode", 1;
+    for my $letter ("A" .. "Z", "a" .. "z") {
+        my $good_drive = $letter . ":";
+        my $result = PerlDir_mapA($good_drive);
+        like($result, qr/^$letter:\\/i, "check good drive $letter");
+
+        my $wgood_drive = encode("UTF-16LE", $good_drive . "\0");
+        $result = PerlDir_mapW($wgood_drive);
+        like(decode("UTF16-LE", $result), qr/^$letter:\\/i,
+             "check a good drive (wide)");
+    }
+    for my $bad ('@', '[', '!', '~', '`', '{') {
+        my $bad_drive = "$bad:";
+        my $result = PerlDir_mapA($bad_drive);
+        is($result, $bad_drive, "check bad drive $bad:");
+
+        my $wbad_drive = encode("UTF-16LE", $bad_drive . "\0");
+        $result = PerlDir_mapW($wbad_drive);
+        is(decode("UTF16-LE", $result), "$bad_drive\0",
+           "check bad drive $bad: (wide)");
+    }
+}
+
+done_testing();
index 035f882..ed86a37 100644 (file)
@@ -1 +1,13 @@
 XS::APItest::PtrTable          T_PTROBJ
+
+const WCHAR *                  WPV
+
+INPUT
+
+WPV
+        $var = ($type)SvPV_nolen($arg);
+
+OUTPUT
+
+WPV
+        sv_setpvn($arg, (const char *)($var), sizeof(WCHAR) * (1+wcslen($var)));
diff --git a/handy.h b/handy.h
index 3e6fd52..dfd6429 100644 (file)
--- a/handy.h
+++ b/handy.h
@@ -1976,12 +1976,6 @@ PoisonWith(0xEF) for catching access to freed memory.
  * - lots of ENV reads
  */
 
-PERL_EXPORT_C Malloc_t Perl_mem_log_alloc(const UV n, const UV typesize, const char *type_name, Malloc_t newalloc, const char *filename, const int linenumber, const char *funcname);
-
-PERL_EXPORT_C Malloc_t Perl_mem_log_realloc(const UV n, const UV typesize, const char *type_name, Malloc_t oldalloc, Malloc_t newalloc, const char *filename, const int linenumber, const char *funcname);
-
-PERL_EXPORT_C Malloc_t Perl_mem_log_free(Malloc_t oldalloc, const char *filename, const int linenumber, const char *funcname);
-
 # ifdef PERL_CORE
 #  ifndef PERL_MEM_LOG_NOIMPL
 enum mem_log_type {
index fa0bc96..2dff421 100644 (file)
 # mkdir -p /opt/perl-catamount
 # mkdir -p /opt/perl-catamount/include
 # mkdir -p /opt/perl-catamount/lib
-# mkdir -p /opt/perl-catamount/lib/perl5/5.22.1
+# mkdir -p /opt/perl-catamount/lib/perl5/5.22.2
 # mkdir -p /opt/perl-catamount/bin
 # cp *.h /opt/perl-catamount/include
 # cp libperl.a /opt/perl-catamount/lib
-# cp -pr lib/* /opt/perl-catamount/lib/perl5/5.22.1
+# cp -pr lib/* /opt/perl-catamount/lib/perl5/5.22.2
 # cp miniperl perl run.sh cc.sh /opt/perl-catamount/lib
 #
 # With the headers and the libperl.a you can embed Perl to your Catamount
index fec05fd..73acae1 100644 (file)
@@ -352,3 +352,13 @@ esac
 # makefile in the same place.  Since Darwin uses GNU make, this dodges
 # the problem.
 firstmakefile=GNUmakefile;
+
+# Parts of the system call setenv(), in particular in an atfork handler.
+# This causes problems when the child tries to clean up environ[], so
+# let libc manage environ[].
+cat >> config.over <<'EOOVER'
+if test "$d_unsetenv" = "$define" -a \
+    `expr "$ccflags" : '.*-DPERL_USE_SAFE_PUTENV'` -eq 0; then
+        ccflags="$ccflags -DPERL_USE_SAFE_PUTENV"
+fi
+EOOVER
index 9633635..74defda 100644 (file)
@@ -179,7 +179,7 @@ PERLVAR(I, statgv,  GV *)
 PERLVARI(I, statname,  SV *,   NULL)
 
 #ifdef HAS_TIMES
-/* Will be removed soon after v5.22.1. See RT #121351 */
+/* Will be removed soon after v5.22.2. See RT #121351 */
 PERLVAR(I, timesbuf,   struct tms)
 #endif
 
@@ -753,7 +753,7 @@ PERLVARI(I, globhook,       globhook_t, NULL)
 
 PERLVARI(I, padlist_generation, U32, 1)        /* id to identify padlist clones */
 
-/* The last unconditional member of the interpreter structure when 5.22.1 was
+/* The last unconditional member of the interpreter structure when 5.22.2 was
    released. The offset of the end of this is baked into a global variable in 
    any shared perl library which will allow a sanity test in future perl
    releases.  */
index 20b598e..6d4b136 100644 (file)
@@ -118,7 +118,7 @@ package B::Op_private;
 our %bits;
 
 
-our $VERSION = "5.022001";
+our $VERSION = "5.022002";
 
 $bits{$_}{3} = 'OPpENTERSUB_AMPER' for qw(entersub rv2cv);
 $bits{$_}{6} = 'OPpENTERSUB_DB' for qw(entersub rv2cv);
diff --git a/op.c b/op.c
index cab214a..e92de57 100644 (file)
--- a/op.c
+++ b/op.c
@@ -719,10 +719,23 @@ Perl_op_free(pTHX_ OP *o)
         type = o->op_type;
 
         /* an op should only ever acquire op_private flags that we know about.
-         * If this fails, you may need to fix something in regen/op_private */
-        if (o->op_ppaddr == PL_ppaddr[o->op_type]) {
+         * If this fails, you may need to fix something in regen/op_private.
+         * Don't bother testing if:
+         *   * the op_ppaddr doesn't match the op; someone may have
+         *     overridden the op and be doing strange things with it;
+         *   * we've errored, as op flags are often left in an
+         *     inconsistent state then. Note that an error when
+         *     compiling the main program leaves PL_parser NULL, so
+         *     we can't spot faults in the main code, onoly
+         *     evaled/required code */
+#ifdef DEBUGGING
+        if (   o->op_ppaddr == PL_ppaddr[o->op_type]
+            && PL_parser
+            && !PL_parser->error_count)
+        {
             assert(!(o->op_private & ~PL_op_private_valid[type]));
         }
+#endif
 
         if (o->op_private & OPpREFCOUNTED) {
             switch (type) {
@@ -2338,6 +2351,13 @@ S_check_hash_fields_and_hekify(pTHX_ UNOP *rop, SVOP *key_op)
             continue;
         svp = cSVOPx_svp(key_op);
 
+        /* make sure it's not a bareword under strict subs */
+        if (key_op->op_private & OPpCONST_BARE &&
+            key_op->op_private & OPpCONST_STRICT)
+        {
+            no_bareword_allowed((OP*)key_op);
+        }
+
         /* Make the CONST have a shared SV */
         if (   !SvIsCOW_shared_hash(sv = *svp)
             && SvTYPE(sv) < SVt_PVMG
@@ -2609,7 +2629,13 @@ S_mark_padname_lvalue(pTHX_ PADNAME *pn)
     PadnameLVALUE_on(pn);
     while (PadnameOUTER(pn) && PARENT_PAD_INDEX(pn)) {
        cv = CvOUTSIDE(cv);
-       assert(cv);
+        /* RT #127786: cv can be NULL due to an eval within the DB package
+         * called from an anon sub - anon subs don't have CvOUTSIDE() set
+         * unless they contain an eval, but calling eval within DB
+         * pretends the eval was done in the caller's scope.
+         */
+       if (!cv)
+            break;
        assert(CvPADLIST(cv));
        pn =
           PadlistNAMESARRAY(CvPADLIST(cv))[PARENT_PAD_INDEX(pn)];
@@ -8558,7 +8584,6 @@ Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs,
            S_op_const_sv(aTHX_ start, PL_compcv, cBOOL(CvCLONE(PL_compcv)));
 
     if (SvPOK(gv) || (SvROK(gv) && SvTYPE(SvRV(gv)) != SVt_PVCV)) {
-       assert (block);
        cv_ckproto_len_flags((const CV *)gv,
                             o ? (const GV *)cSVOPo->op_sv : NULL, ps,
                             ps_len, ps_utf8|CV_CKPROTO_CURSTASH);
@@ -11316,11 +11341,20 @@ OP *
 Perl_ck_entersub_args_list(pTHX_ OP *entersubop)
 {
     OP *aop;
+
     PERL_ARGS_ASSERT_CK_ENTERSUB_ARGS_LIST;
+
     aop = cUNOPx(entersubop)->op_first;
     if (!OpHAS_SIBLING(aop))
        aop = cUNOPx(aop)->op_first;
     for (aop = OpSIBLING(aop); OpHAS_SIBLING(aop); aop = OpSIBLING(aop)) {
+        /* skip the extra attributes->import() call implicitly added in
+         * something like foo(my $x : bar)
+         */
+        if (   aop->op_type == OP_ENTERSUB
+            && (aop->op_flags & OPf_WANT) == OPf_WANT_VOID
+        )
+            continue;
         list(aop);
         op_lvalue(aop, OP_ENTERSUB);
     }
index bd56612..bfd796b 100644 (file)
@@ -15,7 +15,7 @@
 
 #define PERL_REVISION  5               /* age */
 #define PERL_VERSION   22              /* epoch */
-#define PERL_SUBVERSION        1               /* generation */
+#define PERL_SUBVERSION        2               /* generation */
 
 /* The following numbers describe the earliest compatible version of
    Perl ("compatibility" here being defined as sufficient binary/API
diff --git a/perl.c b/perl.c
index 16a6ca4..36253df 100644 (file)
--- a/perl.c
+++ b/perl.c
@@ -3760,7 +3760,7 @@ S_open_script(pTHX_ const char *scriptname, bool dosearch, bool *suidscript)
        const char * const err = "Failed to create a fake bit bucket";
        if (strEQ(scriptname, BIT_BUCKET)) {
 #ifdef HAS_MKSTEMP /* Hopefully mkstemp() is safe here. */
-            int old_umask = umask(0600);
+            int old_umask = umask(0177);
            int tmpfd = mkstemp(tmpname);
             umask(old_umask);
            if (tmpfd > -1) {
@@ -4298,23 +4298,70 @@ S_init_postdump_symbols(pTHX_ int argc, char **argv, char **env)
        }
        if (env) {
          char *s, *old_var;
+          STRLEN nlen;
          SV *sv;
+          HV *dups = newHV();
+
          for (; *env; env++) {
            old_var = *env;
 
            if (!(s = strchr(old_var,'=')) || s == old_var)
                continue;
+            nlen = s - old_var;
 
 #if defined(MSDOS) && !defined(DJGPP)
            *s = '\0';
            (void)strupr(old_var);
            *s = '=';
 #endif
-           sv = newSVpv(s+1, 0);
-           (void)hv_store(hv, old_var, s - old_var, sv, 0);
+            if (hv_exists(hv, old_var, nlen)) {
+                const char *name = savepvn(old_var, nlen);
+
+                /* make sure we use the same value as getenv(), otherwise code that
+                   uses getenv() (like setlocale()) might see a different value to %ENV
+                 */
+                sv = newSVpv(PerlEnv_getenv(name), 0);
+
+                /* keep a count of the dups of this name so we can de-dup environ later */
+                if (hv_exists(dups, name, nlen))
+                    ++SvIVX(*hv_fetch(dups, name, nlen, 0));
+                else
+                    (void)hv_store(dups, name, nlen, newSViv(1), 0);
+
+                Safefree(name);
+            }
+            else {
+                sv = newSVpv(s+1, 0);
+            }
+           (void)hv_store(hv, old_var, nlen, sv, 0);
            if (env_is_not_environ)
                mg_set(sv);
          }
+          if (HvKEYS(dups)) {
+              /* environ has some duplicate definitions, remove them */
+              HE *entry;
+              hv_iterinit(dups);
+              while ((entry = hv_iternext_flags(dups, 0))) {
+                  STRLEN nlen;
+                  const char *name = HePV(entry, nlen);
+                  IV count = SvIV(HeVAL(entry));
+                  IV i;
+                  SV **valp = hv_fetch(hv, name, nlen, 0);
+
+                  assert(valp);
+
+                  /* try to remove any duplicate names, depending on the
+                   * implementation used in my_setenv() the iteration might
+                   * not be necessary, but let's be safe.
+                   */
+                  for (i = 0; i < count; ++i)
+                      my_setenv(name, 0);
+
+                  /* and set it back to the value we set $ENV{name} to */
+                  my_setenv(name, SvPV_nolen(*valp));
+              }
+          }
+          SvREFCNT_dec_NN(dups);
       }
 #endif /* USE_ENVIRON_ARRAY */
 #endif /* !PERL_MICRO */
index b8ee074..c9fed45 100644 (file)
--- a/perlio.c
+++ b/perlio.c
@@ -5027,7 +5027,7 @@ PerlIO_tmpfile(void)
      char tempname[] = "/tmp/PerlIO_XXXXXX";
      const char * const tmpdir = TAINTING_get ? NULL : PerlEnv_getenv("TMPDIR");
      SV * sv = NULL;
-     int old_umask = umask(0600);
+     int old_umask = umask(0177);
      /*
       * I have no idea how portable mkstemp() is ... NI-S
       */
index 88c1afb..078c83b 100644 (file)
  *     This symbol contains the ~name expanded version of PRIVLIB, to be used
  *     in programs that are not prepared to deal with ~ expansion at run-time.
  */
-#define PRIVLIB "/sys/lib/perl/5.22.1"         /**/
-#define PRIVLIB_EXP "/sys/lib/perl/5.22.1"             /**/
+#define PRIVLIB "/sys/lib/perl/5.22.2"         /**/
+#define PRIVLIB_EXP "/sys/lib/perl/5.22.2"             /**/
 
 /* PTRSIZE:
  *     This symbol contains the size of a pointer, so that the C preprocessor
  *     removed.  The elements in inc_version_list (inc_version_list.U) can
  *     be tacked onto this variable to generate a list of directories to search.
  */
-#define SITELIB "/sys/lib/perl/5.22.1/site_perl"               /**/
-#define SITELIB_EXP "/sys/lib/perl/5.22.1/site_perl"           /**/
-#define SITELIB_STEM "/sys/lib/perl/5.22.1/site_perl"          /**/
+#define SITELIB "/sys/lib/perl/5.22.2/site_perl"               /**/
+#define SITELIB_EXP "/sys/lib/perl/5.22.2/site_perl"           /**/
+#define SITELIB_STEM "/sys/lib/perl/5.22.2/site_perl"          /**/
 
 /* Size_t_size:
  *     This symbol holds the size of a Size_t in bytes.
index 7b69187..df619ba 100644 (file)
@@ -36,8 +36,8 @@ api_subversion='0'
 api_version='22'
 api_versionstring='5.22.0'
 ar='ar'
-archlib='/sys/lib/perl5/5.22.1/386'
-archlibexp='/sys/lib/perl5/5.22.1/386'
+archlib='/sys/lib/perl5/5.22.2/386'
+archlibexp='/sys/lib/perl5/5.22.2/386'
 archname64=''
 archname='386'
 archobjs=''
@@ -787,17 +787,17 @@ inc_version_list=' '
 inc_version_list_init='0'
 incpath=''
 inews=''
-installarchlib='/sys/lib/perl/5.22.1/386'
+installarchlib='/sys/lib/perl/5.22.2/386'
 installbin='/usr/bin'
 installman1dir='/sys/man/1pub'
 installman3dir='/sys/man/2pub'
 installprefix='/usr'
 installprefixexp='/usr'
-installprivlib='/sys/lib/perl/5.22.1'
+installprivlib='/sys/lib/perl/5.22.2'
 installscript='/usr/bin'
-installsitearch='/sys/lib/perl/5.22.1/site_perl/386'
+installsitearch='/sys/lib/perl/5.22.2/site_perl/386'
 installsitebin='/usr/bin'
-installsitelib='/sys/lib/perl/5.22.1/site_perl'
+installsitelib='/sys/lib/perl/5.22.2/site_perl'
 installstyle='lib/perl5'
 installusrbinperl='undef'
 installvendorarch=''
@@ -918,8 +918,8 @@ pmake=''
 pr=''
 prefix='/usr'
 prefixexp='/usr'
-privlib='/sys/lib/perl/5.22.1'
-privlibexp='/sys/lib/perl/5.22.1'
+privlib='/sys/lib/perl/5.22.2'
+privlibexp='/sys/lib/perl/5.22.2'
 procselfexe=''
 prototype='define'
 ptrsize='4'
@@ -984,13 +984,13 @@ sig_num='0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
 sig_num_init='0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 0'
 sig_size='50'
 signal_t='void'
-sitearch='/sys/lib/perl/5.22.1/site_perl/386'
+sitearch='/sys/lib/perl/5.22.2/site_perl/386'
 sitearchexp='/sys/lib/perl/site_perl/386'
 sitebin='/usr/bin'
 sitebinexp='/usr/bin'
-sitelib='/sys/lib/perl/5.22.1/site_perl'
-sitelib_stem='/sys/lib/perl/5.22.1/site_perl'
-sitelibexp='/sys/lib/perl/5.22.1/site_perl'
+sitelib='/sys/lib/perl/5.22.2/site_perl'
+sitelib_stem='/sys/lib/perl/5.22.2/site_perl'
+sitelibexp='/sys/lib/perl/5.22.2/site_perl'
 siteprefix='/usr'
 siteprefixexp='/usr'
 sizesize='4'
@@ -1023,7 +1023,7 @@ stdio_stream_array=''
 strerror_r_proto='0'
 strings='/sys/include/ape/string.h'
 submit=''
-subversion='1'
+subversion='2'
 sysman='/sys/man/1pub'
 tail=''
 tar=''
@@ -1105,8 +1105,8 @@ vendorlib_stem=''
 vendorlibexp=''
 vendorprefix=''
 vendorprefixexp=''
-version='5.22.1'
-version_patchlevel_string='version 22 subversion 1'
+version='5.22.2'
+version_patchlevel_string='version 22 subversion 2'
 versiononly='undef'
 vi=''
 xlibpth=''
@@ -1120,7 +1120,7 @@ config_args=''
 config_argc=0
 PERL_REVISION=5
 PERL_VERSION=22
-PERL_SUBVERSION=1
+PERL_SUBVERSION=2
 PERL_API_REVISION=5
 PERL_API_VERSION=22
 PERL_API_SUBVERSION=0
index feb08eb..ab1d730 100644 (file)
@@ -53,7 +53,7 @@
 /roffitall
 
 # generated
-/perl5221delta.pod
+/perl5222delta.pod
 /perlapi.pod
 /perlintern.pod
 *.html
diff --git a/pod/perl5221delta.pod b/pod/perl5221delta.pod
new file mode 100644 (file)
index 0000000..5d01a4b
--- /dev/null
@@ -0,0 +1,338 @@
+=encoding utf8
+
+=head1 NAME
+
+perl5221delta - what is new for perl v5.22.1
+
+=head1 DESCRIPTION
+
+This document describes differences between the 5.22.0 release and the 5.22.1
+release.
+
+If you are upgrading from an earlier release such as 5.20.0, first read
+L<perl5220delta>, which describes differences between 5.20.0 and 5.22.0.
+
+=head1 Incompatible Changes
+
+There are no changes intentionally incompatible with 5.20.0 other than the
+following single exception, which we deemed to be a sensible change to make in
+order to get the new C<\b{wb}> and (in particular) C<\b{sb}> features sane
+before people decided they're worthless because of bugs in their Perl 5.22.0
+implementation and avoided them in the future.
+If any others exist, they are bugs, and we request that you submit a report.
+See L</Reporting Bugs> below.
+
+=head2 Bounds Checking Constructs
+
+Several bugs, including a segmentation fault, have been fixed with the bounds
+checking constructs (introduced in Perl 5.22) C<\b{gcb}>, C<\b{sb}>, C<\b{wb}>,
+C<\B{gcb}>, C<\B{sb}>, and C<\B{wb}>.  All the C<\B{}> ones now match an empty
+string; none of the C<\b{}> ones do.
+L<[perl #126319]|https://rt.perl.org/Ticket/Display.html?id=126319>
+
+=head1 Modules and Pragmata
+
+=head2 Updated Modules and Pragmata
+
+=over 4
+
+=item *
+
+L<Module::CoreList> has been upgraded from version 5.20150520 to 5.20151213.
+
+=item *
+
+L<PerlIO::scalar> has been upgraded from version 0.22 to 0.23.
+
+=item *
+
+L<POSIX> has been upgraded from version 1.53 to 1.53_01.
+
+If C<POSIX::strerror> was passed C<$!> as its argument then it accidentally
+cleared C<$!>.  This has been fixed.
+L<[perl #126229]|https://rt.perl.org/Ticket/Display.html?id=126229>
+
+=item *
+
+L<Storable> has been upgraded from version 2.53 to 2.53_01.
+
+=item *
+
+L<warnings> has been upgraded from version 1.32 to 1.34.
+
+The C<warnings::enabled> example now actually uses C<warnings::enabled>.
+L<[perl #126051]|https://rt.perl.org/Ticket/Display.html?id=126051>
+
+=item *
+
+L<Win32> has been upgraded from version 0.51 to 0.52.
+
+This has been updated for Windows 8.1, 10 and 2012 R2 Server.
+
+=back
+
+=head1 Documentation
+
+=head2 Changes to Existing Documentation
+
+=head3 L<perltie>
+
+=over 4
+
+=item *
+
+The usage of C<FIRSTKEY> and C<NEXTKEY> has been clarified.
+
+=back
+
+=head3 L<perlvar>
+
+=over 4
+
+=item *
+
+The specific true value of C<$!{E...}> is now documented, noting that it is
+subject to change and not guaranteed.
+
+=back
+
+=head1 Diagnostics
+
+The following additions or changes have been made to diagnostic output,
+including warnings and fatal error messages.  For the complete list of
+diagnostic messages, see L<perldiag>.
+
+=head2 Changes to Existing Diagnostics
+
+=over 4
+
+=item *
+
+The C<printf> and C<sprintf> builtins are now more careful about the warnings
+they emit: argument reordering now disables the "redundant argument" warning in
+all cases.
+L<[perl #125469]|https://rt.perl.org/Ticket/Display.html?id=125469>
+
+=back
+
+=head1 Configuration and Compilation
+
+=over 4
+
+=item *
+
+Using the C<NO_HASH_SEED> define in combination with the default hash algorithm
+C<PERL_HASH_FUNC_ONE_AT_A_TIME_HARD> resulted in a fatal error while compiling
+the interpreter, since Perl 5.17.10.  This has been fixed.
+
+=item *
+
+Configuring with ccflags containing quotes (e.g.
+C<< -Accflags='-DAPPLLIB_EXP=\"/usr/libperl\"' >>) was broken in Perl 5.22.0
+but has now been fixed again.
+L<[perl #125314]|https://rt.perl.org/Ticket/Display.html?id=125314>
+
+=back
+
+=head1 Platform Support
+
+=head2 Platform-Specific Notes
+
+=over 4
+
+=item IRIX
+
+=over
+
+=item *
+
+Under some circumstances IRIX stdio fgetc() and fread() set the errno to
+C<ENOENT>, which made no sense according to either IRIX or POSIX docs.  Errno
+is now cleared in such cases.
+L<[perl #123977]|https://rt.perl.org/Ticket/Display.html?id=123977>
+
+=item *
+
+Problems when multiplying long doubles by infinity have been fixed.
+L<[perl #126396]|https://rt.perl.org/Ticket/Display.html?id=126396>
+
+=item *
+
+All tests pass now on IRIX with the default build configuration.
+
+=back
+
+=back
+
+=head1 Selected Bug Fixes
+
+=over 4
+
+=item *
+
+C<qr/(?[ () ])/> no longer segfaults, giving a syntax error message instead.
+L<[perl #125805]|https://rt.perl.org/Ticket/Display.html?id=125805>
+
+=item *
+
+Regular expression possessive quantifier Perl 5.20 regression now fixed.
+C<qr/>I<PAT>C<{>I<min>,I<max>C<}+>C</> is supposed to behave identically to
+C<qr/(?E<gt>>I<PAT>C<{>I<min>,I<max>C<})/>.  Since Perl 5.20, this didn't work
+if I<min> and I<max> were equal.
+L<[perl #125825]|https://rt.perl.org/Ticket/Display.html?id=125825>
+
+=item *
+
+Certain syntax errors in
+L<perlrecharclass/Extended Bracketed Character Classes> caused panics instead
+of the proper error message.  This has now been fixed.
+L<[perl #126481]|https://rt.perl.org/Ticket/Display.html?id=126481>
+
+=item *
+
+C<< BEGIN <> >> no longer segfaults and properly produces an error message.
+L<[perl #125341]|https://rt.perl.org/Ticket/Display.html?id=125341>
+
+=item *
+
+A regression from Perl 5.20 has been fixed, in which some syntax errors in
+L<C<(?[...])>|perlrecharclass/Extended Bracketed Character Classes> constructs
+within regular expression patterns could cause a segfault instead of a proper
+error message.
+L<[perl #126180]|https://rt.perl.org/Ticket/Display.html?id=126180>
+
+=item *
+
+Another problem with
+L<C<(?[...])>|perlrecharclass/Extended Bracketed Character Classes>
+constructs has been fixed wherein things like C<\c]> could cause panics.
+L<[perl #126181]|https://rt.perl.org/Ticket/Display.html?id=126181>
+
+=item *
+
+In Perl 5.22.0, the logic changed 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.
+L<[perl #125381]|https://rt.perl.org/Ticket/Display.html?id=125381>
+
+=item *
+
+Warning fatality is now ignored when rewinding the stack.  This prevents
+infinite recursion when the now fatal error also causes rewinding of the stack.
+L<[perl #123398]|https://rt.perl.org/Ticket/Display.html?id=123398>
+
+=item *
+
+A crash with C<< %::=(); J->${\"::"} >> has been fixed.
+L<[perl #125541]|https://rt.perl.org/Ticket/Display.html?id=125541>
+
+=item *
+
+Nested quantifiers such as C</.{1}??/> should cause perl to throw a fatal
+error, but were being silently accepted since Perl 5.20.0.  This has been
+fixed.
+L<[perl #126253]|https://rt.perl.org/Ticket/Display.html?id=126253>
+
+=item *
+
+Regular expression sequences such as C</(?i/> (and similarly with other
+recognized flags or combination of flags) should cause perl to throw a fatal
+error, but were being silently accepted since Perl 5.18.0.  This has been
+fixed.
+L<[perl #126178]|https://rt.perl.org/Ticket/Display.html?id=126178>
+
+=item *
+
+A bug in hexadecimal floating point literal support meant that high-order bits
+could be lost in cases where mantissa overflow was caused by too many trailing
+zeros in the fractional part.  This has been fixed.
+L<[perl #126582]|https://rt.perl.org/Ticket/Display.html?id=126582>
+
+=item *
+
+Another hexadecimal floating point bug, causing low-order bits to be lost in
+cases where the last hexadecimal digit of the mantissa has bits straddling the
+limit of the number of bits allowed for the mantissa, has also been fixed.
+L<[perl #126586]|https://rt.perl.org/Ticket/Display.html?id=126586>
+
+=item *
+
+Further hexadecimal floating point bugs have been fixed: In some circumstances,
+the C<%a> format specifier could variously lose the sign of the negative zero,
+fail to display zeros after the radix point with the requested precision, or
+even lose the radix point after the leftmost hexadecimal digit completely.
+
+=item *
+
+A crash caused by incomplete expressions within C<< /(?[ ])/ >> (e.g.
+C<< /(?[[0]+()+])/ >>) has been fixed.
+L<[perl #126615]|https://rt.perl.org/Ticket/Display.html?id=126615>
+
+=back
+
+=head1 Acknowledgements
+
+Perl 5.22.1 represents approximately 6 months of development since Perl 5.22.0
+and contains approximately 19,000 lines of changes across 130 files from 27
+authors.
+
+Excluding auto-generated files, documentation and release tools, there were
+approximately 1,700 lines of changes to 44 .pm, .t, .c and .h files.
+
+Perl continues to flourish into its third decade thanks to a vibrant community
+of users and developers.  The following people are known to have contributed
+the improvements that became Perl 5.22.1:
+
+Aaron Crane, Abigail, Andy Broad, Aristotle Pagaltzis, Chase Whitener, Chris
+'BinGOs' Williams, Craig A. Berry, Daniel Dragan, David Mitchell, Father
+Chrysostomos, Herbert Breunung, Hugo van der Sanden, James E Keenan, Jan
+Dubois, Jarkko Hietaniemi, Karen Etheridge, Karl Williamson, Lukas Mai, Matthew
+Horsfall, Peter Martini, Rafael Garcia-Suarez, Ricardo Signes, Shlomi Fish,
+Sisyphus, Steve Hay, Tony Cook, Victor Adam.
+
+The list above is almost certainly incomplete as it is automatically generated
+from version control history.  In particular, it does not include the names of
+the (very much appreciated) contributors who reported issues to the Perl bug
+tracker.
+
+Many of the changes included in this version originated in the CPAN modules
+included in Perl's core.  We're grateful to the entire CPAN community for
+helping Perl to flourish.
+
+For a more complete list of all of Perl's historical contributors, please see
+the F<AUTHORS> file in the Perl source distribution.
+
+=head1 Reporting Bugs
+
+If you find what you think is a bug, you might check the articles recently
+posted to the comp.lang.perl.misc newsgroup and the perl bug database at
+https://rt.perl.org/ .  There may also be information at
+http://www.perl.org/ , the Perl Home Page.
+
+If you believe you have an unreported bug, please run the L<perlbug> program
+included with your release.  Be sure to trim your bug down to a tiny but
+sufficient test case.  Your bug report, along with the output of C<perl -V>,
+will be sent off to perlbug@perl.org to be analysed by the Perl porting team.
+
+If the bug you are reporting has security implications, which make it
+inappropriate to send to a publicly archived mailing list, then please send it
+to perl5-security-report@perl.org.  This points to a closed subscription
+unarchived mailing list, which includes all the core committers, who will be
+able to help assess the impact of issues, figure out a resolution, and help
+co-ordinate the release of patches to mitigate or fix the problem across all
+platforms on which Perl is supported.  Please only use this address for
+security issues in the Perl core, not for modules independently distributed on
+CPAN.
+
+=head1 SEE ALSO
+
+The F<Changes> file for an explanation of how to view exhaustive details on
+what changed.
+
+The F<INSTALL> file for how to build Perl.
+
+The F<README> file for general stuff.
+
+The F<Artistic> and F<Copying> files for copyright information.
+
+=cut
index 257124a..c214120 100644 (file)
@@ -2,72 +2,89 @@
 
 =head1 NAME
 
-perldelta - what is new for perl v5.22.1
+perldelta - what is new for perl v5.22.2
 
 =head1 DESCRIPTION
 
-This document describes differences between the 5.22.0 release and the 5.22.1
+This document describes differences between the 5.22.1 release and the 5.22.2
 release.
 
-If you are upgrading from an earlier release such as 5.20.0, first read
-L<perl5220delta>, which describes differences between 5.20.0 and 5.22.0.
+If you are upgrading from an earlier release such as 5.22.0, first read
+L<perl5221delta>, which describes differences between 5.22.0 and 5.22.1.
 
-=head1 Incompatible Changes
+=head1 Security
 
-There are no changes intentionally incompatible with 5.20.0 other than the
-following single exception, which we deemed to be a sensible change to make in
-order to get the new C<\b{wb}> and (in particular) C<\b{sb}> features sane
-before people decided they're worthless because of bugs in their Perl 5.22.0
-implementation and avoided them in the future.
-If any others exist, they are bugs, and we request that you submit a report.
-See L</Reporting Bugs> below.
+=head2 Fix out of boundary access in Win32 path handling
 
-=head2 Bounds Checking Constructs
+This is CVE-2015-8608.  For more information see
+L<[perl #126755]|https://rt.perl.org/Ticket/Display.html?id=126755>.
 
-Several bugs, including a segmentation fault, have been fixed with the bounds
-checking constructs (introduced in Perl 5.22) C<\b{gcb}>, C<\b{sb}>, C<\b{wb}>,
-C<\B{gcb}>, C<\B{sb}>, and C<\B{wb}>.  All the C<\B{}> ones now match an empty
-string; none of the C<\b{}> ones do.
-L<[perl #126319]|https://rt.perl.org/Ticket/Display.html?id=126319>
+=head2 Fix loss of taint in C<canonpath()>
 
-=head1 Modules and Pragmata
+This is CVE-2015-8607.  For more information see
+L<[perl #126862]|https://rt.perl.org/Ticket/Display.html?id=126862>.
 
-=head2 Updated Modules and Pragmata
+=head2 Set proper umask before calling C<mkstemp(3)>
 
-=over 4
+In 5.22.0 perl started setting umask to C<0600> before calling C<mkstemp(3)>
+and restoring it afterwards.  This wrongfully tells C<open(2)> to strip the
+owner read and write bits from the given mode before applying it, rather than
+the intended negation of leaving only those bits in place.
 
-=item *
+Systems that use mode C<0666> in C<mkstemp(3)> (like old versions of glibc)
+create a file with permissions C<0066>, leaving world read and write permissions
+regardless of current umask.
 
-L<Module::CoreList> has been upgraded from version 5.20150520 to 5.20151213.
+This has been fixed by using umask C<0177> instead.
 
-=item *
+L<[perl #127322]|https://rt.perl.org/Ticket/Display.html?id=127322>
 
-L<PerlIO::scalar> has been upgraded from version 0.22 to 0.23.
+=head2 Avoid accessing uninitialized memory in Win32 C<crypt()>
 
-=item *
+Validation that will detect both a short salt and invalid characters in the
+salt has been added.
 
-L<POSIX> has been upgraded from version 1.53 to 1.53_01.
+L<[perl #126922]|https://rt.perl.org/Ticket/Display.html?id=126922>
 
-If C<POSIX::strerror> was passed C<$!> as its argument then it accidentally
-cleared C<$!>.  This has been fixed.
-L<[perl #126229]|https://rt.perl.org/Ticket/Display.html?id=126229>
+=head2 Remove duplicate environment variables from C<environ>
 
-=item *
+Previously, if an environment variable appeared more than once in C<environ[]>,
+L<C<%ENV>|perlvar/%ENV> would contain the last entry for that name, while a
+typical C<getenv()> would return the first entry.  We now make sure C<%ENV>
+contains the same as what C<getenv()> returns.
+
+Secondly, we now remove duplicates from C<environ[]>, so if a setting with that
+name is set in C<%ENV> we won't pass an unsafe value to a child process.
+
+This is CVE-2016-2381.
+
+=head1 Incompatible Changes
 
-L<Storable> has been upgraded from version 2.53 to 2.53_01.
+There are no changes intentionally incompatible with Perl 5.22.1.  If any
+exist, they are bugs, and we request that you submit a report.  See
+L</Reporting Bugs> below.
+
+=head1 Modules and Pragmata
+
+=head2 Updated Modules and Pragmata
+
+=over 4
 
 =item *
 
-L<warnings> has been upgraded from version 1.32 to 1.34.
+L<File::Spec> has been upgraded from version 3.56 to 3.56_01.
 
-The C<warnings::enabled> example now actually uses C<warnings::enabled>.
-L<[perl #126051]|https://rt.perl.org/Ticket/Display.html?id=126051>
+C<canonpath()> now preserves taint.  See L</"Fix loss of taint in
+C<canonpath()>">.
 
 =item *
 
-L<Win32> has been upgraded from version 0.51 to 0.52.
+L<Module::CoreList> has been upgraded from version 5.20151213 to 5.20160429.
 
-This has been updated for Windows 8.1, 10 and 2012 R2 Server.
+The version number of L<Digest::SHA> listed for Perl 5.18.4 was wrong and has
+been corrected.  Likewise for the version number of L<Config> in 5.18.3 and
+5.18.4.
+L<[perl #127624]|https://rt.perl.org/Ticket/Display.html?id=127624>
 
 =back
 
@@ -75,62 +92,56 @@ This has been updated for Windows 8.1, 10 and 2012 R2 Server.
 
 =head2 Changes to Existing Documentation
 
-=head3 L<perltie>
+=head3 L<perldiag>
 
 =over 4
 
 =item *
 
-The usage of C<FIRSTKEY> and C<NEXTKEY> has been clarified.
+The explanation of the warning "unable to close filehandle %s properly: %s"
+which can occur when doing an implicit close of a filehandle has been expanded
+and improved.
 
 =back
 
-=head3 L<perlvar>
+=head3 L<perlfunc>
 
 =over 4
 
 =item *
 
-The specific true value of C<$!{E...}> is now documented, noting that it is
-subject to change and not guaranteed.
+The documentation of L<C<hex()>|perlfunc/hex> has been revised to clarify valid
+inputs.
 
 =back
 
-=head1 Diagnostics
-
-The following additions or changes have been made to diagnostic output,
-including warnings and fatal error messages.  For the complete list of
-diagnostic messages, see L<perldiag>.
-
-=head2 Changes to Existing Diagnostics
+=head1 Configuration and Compilation
 
 =over 4
 
 =item *
 
-The C<printf> and C<sprintf> builtins are now more careful about the warnings
-they emit: argument reordering now disables the "redundant argument" warning in
-all cases.
-L<[perl #125469]|https://rt.perl.org/Ticket/Display.html?id=125469>
+Dtrace builds now build successfully on systems with a newer dtrace that
+require an input object file that uses the probes in the F<.d> file.
 
-=back
+Previously the probe would fail and cause a build failure.
 
-=head1 Configuration and Compilation
+L<[perl #122287]|https://rt.perl.org/Ticket/Display.html?id=122287>
 
-=over 4
+=item *
+
+F<Configure> no longer probes for F<libnm> by default.  Originally this was the
+"New Math" library, but the name has been re-used by the GNOME NetworkManager.
+
+L<[perl #127131]|https://rt.perl.org/Ticket/Display.html?id=127131>
 
 =item *
 
-Using the C<NO_HASH_SEED> define in combination with the default hash algorithm
-C<PERL_HASH_FUNC_ONE_AT_A_TIME_HARD> resulted in a fatal error while compiling
-the interpreter, since Perl 5.17.10.  This has been fixed.
+F<Configure> now knows about gcc 5.
 
 =item *
 
-Configuring with ccflags containing quotes (e.g.
-C<< -Accflags='-DAPPLLIB_EXP=\"/usr/libperl\"' >>) was broken in Perl 5.22.0
-but has now been fixed again.
-L<[perl #125314]|https://rt.perl.org/Ticket/Display.html?id=125314>
+Compiling perl with B<-DPERL_MEM_LOG> now works again.
 
 =back
 
@@ -140,28 +151,47 @@ L<[perl #125314]|https://rt.perl.org/Ticket/Display.html?id=125314>
 
 =over 4
 
-=item IRIX
+=item Darwin
 
-=over
+Compiling perl with B<-Dusecbacktrace> on Darwin now works again.
 
-=item *
+L<[perl #127764]|https://rt.perl.org/Ticket/Display.html?id=127764>
 
-Under some circumstances IRIX stdio fgetc() and fread() set the errno to
-C<ENOENT>, which made no sense according to either IRIX or POSIX docs.  Errno
-is now cleared in such cases.
-L<[perl #123977]|https://rt.perl.org/Ticket/Display.html?id=123977>
+=item OS X/Darwin
 
-=item *
+Builds with both B<-DDEBUGGING> and threading enabled would fail with a "panic:
+free from wrong pool" error when built or tested from Terminal on OS X.  This
+was caused by perl's internal management of the environment conflicting with an
+atfork handler using the libc C<setenv()> function to update the environment.
 
-Problems when multiplying long doubles by infinity have been fixed.
-L<[perl #126396]|https://rt.perl.org/Ticket/Display.html?id=126396>
+Perl now uses C<setenv()>/C<unsetenv()> to update the environment on OS X.
 
-=item *
+L<[perl #126240]|https://rt.perl.org/Ticket/Display.html?id=126240>
+
+=item ppc64el
+
+The floating point format of ppc64el (Debian naming for little-endian PowerPC)
+is now detected correctly.
 
-All tests pass now on IRIX with the default build configuration.
+=item Tru64
+
+A test failure in F<t/porting/extrefs.t> has been fixed.
 
 =back
 
+=head1 Internal Changes
+
+=over 4
+
+=item *
+
+An unwarranted assertion in C<Perl_newATTRSUB_x()> has been removed.  If a stub
+subroutine definition with a prototype has been seen, then any subsequent stub
+(or definition) of the same subroutine with an attribute was causing an
+assertion failure because of a null pointer.
+
+L<[perl #126845]|https://rt.perl.org/Ticket/Display.html?id=126845>
+
 =back
 
 =head1 Selected Bug Fixes
@@ -170,125 +200,143 @@ All tests pass now on IRIX with the default build configuration.
 
 =item *
 
-C<qr/(?[ () ])/> no longer segfaults, giving a syntax error message instead.
-L<[perl #125805]|https://rt.perl.org/Ticket/Display.html?id=125805>
+Calls to the placeholder C<&PL_sv_yes> used internally when an C<import()> or
+C<unimport()> method isn't found now correctly handle scalar context.
+L<[perl #126042]|https://rt.perl.org/Ticket/Display.html?id=126042>
+
+=item *
+
+The L<C<pipe()>|perlfunc/pipe> operator would assert for C<DEBUGGING> builds
+instead of producing the correct error message.  The condition asserted on is
+detected and reported on correctly without the assertions, so the assertions
+were removed.
+L<[perl #126480]|https://rt.perl.org/Ticket/Display.html?id=126480>
+
+=item *
+
+In some cases, failing to parse a here-doc would attempt to use freed memory.
+This was caused by a pointer not being restored correctly.
+L<[perl #126443]|https://rt.perl.org/Ticket/Display.html?id=126443>
 
 =item *
 
-Regular expression possessive quantifier Perl 5.20 regression now fixed.
-C<qr/>I<PAT>C<{>I<min>,I<max>C<}+>C</> is supposed to behave identically to
-C<qr/(?E<gt>>I<PAT>C<{>I<min>,I<max>C<})/>.  Since Perl 5.20, this didn't work
-if I<min> and I<max> were equal.
-L<[perl #125825]|https://rt.perl.org/Ticket/Display.html?id=125825>
+Perl now reports more context when it sees an array where it expects to see an
+operator, and avoids an assertion failure.
+L<[perl #123737]|https://rt.perl.org/Ticket/Display.html?id=123737>
 
 =item *
 
-Certain syntax errors in
-L<perlrecharclass/Extended Bracketed Character Classes> caused panics instead
-of the proper error message.  This has now been fixed.
-L<[perl #126481]|https://rt.perl.org/Ticket/Display.html?id=126481>
+If a here-doc was found while parsing another operator, the parser had already
+read end of file, and the here-doc was not terminated, perl could produce an
+assertion or a segmentation fault.  This now reliably complains about the
+unterminated here-doc.
+L<[perl #125540]|https://rt.perl.org/Ticket/Display.html?id=125540>
 
 =item *
 
-C<< BEGIN <> >> no longer segfaults and properly produces an error message.
-L<[perl #125341]|https://rt.perl.org/Ticket/Display.html?id=125341>
+Parsing beyond the end of the buffer when processing a C<#line> directive with
+no filename is now avoided.
+L<[perl #127334]|https://rt.perl.org/Ticket/Display.html?id=127334>
 
 =item *
 
-A regression from Perl 5.20 has been fixed, in which some syntax errors in
-L<C<(?[...])>|perlrecharclass/Extended Bracketed Character Classes> constructs
-within regular expression patterns could cause a segfault instead of a proper
-error message.
-L<[perl #126180]|https://rt.perl.org/Ticket/Display.html?id=126180>
+Perl 5.22.0 added support for the C99 hexadecimal floating point notation, but
+sometimes misparsed hex floats.  This has been fixed.
+L<[perl #127183]|https://rt.perl.org/Ticket/Display.html?id=127183>
 
 =item *
 
-Another problem with
-L<C<(?[...])>|perlrecharclass/Extended Bracketed Character Classes>
-constructs has been fixed wherein things like C<\c]> could cause panics.
-L<[perl #126181]|https://rt.perl.org/Ticket/Display.html?id=126181>
+Certain regex patterns involving a complemented posix class in an inverted
+bracketed character class, and matching something else optionally would
+improperly fail to match.  An example of one that could fail is
+C<qr/_?[^\Wbar]\x{100}/>.  This has been fixed.
+L<[perl #127537]|https://rt.perl.org/Ticket/Display.html?id=127537>
 
 =item *
 
-In Perl 5.22.0, the logic changed 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.
-L<[perl #125381]|https://rt.perl.org/Ticket/Display.html?id=125381>
+Fixed an issue with L<C<pack()>|perlfunc/pack> where C<< pack "H" >> (and
+C<< pack "h" >>) could read past the source when given a non-utf8 source and a
+utf8 target.
+L<[perl #126325]|https://rt.perl.org/Ticket/Display.html?id=126325>
 
 =item *
 
-Warning fatality is now ignored when rewinding the stack.  This prevents
-infinite recursion when the now fatal error also causes rewinding of the stack.
-L<[perl #123398]|https://rt.perl.org/Ticket/Display.html?id=123398>
+Fixed some cases where perl would abort due to a segmentation fault, or a
+C-level assert.
+L<[perl #126193]|https://rt.perl.org/Ticket/Display.html?id=126193>
+L<[perl #126257]|https://rt.perl.org/Ticket/Display.html?id=126257>
+L<[perl #126258]|https://rt.perl.org/Ticket/Display.html?id=126258>
+L<[perl #126405]|https://rt.perl.org/Ticket/Display.html?id=126405>
+L<[perl #126602]|https://rt.perl.org/Ticket/Display.html?id=126602>
+L<[perl #127773]|https://rt.perl.org/Ticket/Display.html?id=127773>
+L<[perl #127786]|https://rt.perl.org/Ticket/Display.html?id=127786>
 
 =item *
 
-A crash with C<< %::=(); J->${\"::"} >> has been fixed.
-L<[perl #125541]|https://rt.perl.org/Ticket/Display.html?id=125541>
+A memory leak when setting C<$ENV{foo}> on Darwin has been fixed.
+L<[perl #126240]|https://rt.perl.org/Ticket/Display.html?id=126240>
 
 =item *
 
-Nested quantifiers such as C</.{1}??/> should cause perl to throw a fatal
-error, but were being silently accepted since Perl 5.20.0.  This has been
-fixed.
-L<[perl #126253]|https://rt.perl.org/Ticket/Display.html?id=126253>
+Perl now correctly raises an error when trying to compile patterns with
+unterminated character classes while there are trailing backslashes.
+L<[perl #126141]|https://rt.perl.org/Ticket/Display.html?id=126141>
 
 =item *
 
-Regular expression sequences such as C</(?i/> (and similarly with other
-recognized flags or combination of flags) should cause perl to throw a fatal
-error, but were being silently accepted since Perl 5.18.0.  This has been
-fixed.
-L<[perl #126178]|https://rt.perl.org/Ticket/Display.html?id=126178>
+C<NOTHING> regops and C<EXACTFU_SS> regops in C<make_trie()> are now handled
+properly.
+L<[perl #126206]|https://rt.perl.org/Ticket/Display.html?id=126206>
 
 =item *
 
-A bug in hexadecimal floating point literal support meant that high-order bits
-could be lost in cases where mantissa overflow was caused by too many trailing
-zeros in the fractional part.  This has been fixed.
-L<[perl #126582]|https://rt.perl.org/Ticket/Display.html?id=126582>
+Perl now only tests C<semctl()> if we have everything needed to use it.  In
+FreeBSD the C<semctl()> entry point may exist, but it can be disabled by
+policy.
+L<[perl #127533]|https://rt.perl.org/Ticket/Display.html?id=127533>
 
 =item *
 
-Another hexadecimal floating point bug, causing low-order bits to be lost in
-cases where the last hexadecimal digit of the mantissa has bits straddling the
-limit of the number of bits allowed for the mantissa, has also been fixed.
-L<[perl #126586]|https://rt.perl.org/Ticket/Display.html?id=126586>
+A regression that allowed undeclared barewords as hash keys to work despite
+strictures has been fixed.
+L<[perl #126981]|https://rt.perl.org/Ticket/Display.html?id=126981>
 
 =item *
 
-Further hexadecimal floating point bugs have been fixed: In some circumstances,
-the C<%a> format specifier could variously lose the sign of the negative zero,
-fail to display zeros after the radix point with the requested precision, or
-even lose the radix point after the leftmost hexadecimal digit completely.
+As an optimization (introduced in Perl 5.20.0), L<C<uc()>|perlfunc/uc>,
+L<C<lc()>|perlfunc/lc>, L<C<ucfirst()>|perlfunc/ucfirst> and
+L<C<lcfirst()>|perlfunc/lcfirst> sometimes modify their argument in-place
+rather than returning a modified copy.  The criteria for this optimization has
+been made stricter to avoid these functions accidentally modifying in-place
+when they should not, which has been happening in some cases, e.g. in
+L<List::Util>.
 
 =item *
 
-A crash caused by incomplete expressions within C<< /(?[ ])/ >> (e.g.
-C<< /(?[[0]+()+])/ >>) has been fixed.
-L<[perl #126615]|https://rt.perl.org/Ticket/Display.html?id=126615>
+Excessive memory usage in the compilation of some regular expressions involving
+non-ASCII characters has been reduced.  A more complete fix is forthcoming in
+Perl 5.24.0.
 
 =back
 
 =head1 Acknowledgements
 
-Perl 5.22.1 represents approximately 6 months of development since Perl 5.22.0
-and contains approximately 19,000 lines of changes across 130 files from 27
+Perl 5.22.2 represents approximately 5 months of development since Perl 5.22.1
+and contains approximately 3,000 lines of changes across 110 files from 24
 authors.
 
 Excluding auto-generated files, documentation and release tools, there were
-approximately 1,700 lines of changes to 44 .pm, .t, .c and .h files.
+approximately 1,500 lines of changes to 52 .pm, .t, .c and .h files.
 
 Perl continues to flourish into its third decade thanks to a vibrant community
 of users and developers.  The following people are known to have contributed
-the improvements that became Perl 5.22.1:
+the improvements that became Perl 5.22.2:
 
-Aaron Crane, Abigail, Andy Broad, Aristotle Pagaltzis, Chase Whitener, Chris
-'BinGOs' Williams, Craig A. Berry, Daniel Dragan, David Mitchell, Father
-Chrysostomos, Herbert Breunung, Hugo van der Sanden, James E Keenan, Jan
-Dubois, Jarkko Hietaniemi, Karen Etheridge, Karl Williamson, Lukas Mai, Matthew
-Horsfall, Peter Martini, Rafael Garcia-Suarez, Ricardo Signes, Shlomi Fish,
-Sisyphus, Steve Hay, Tony Cook, Victor Adam.
+Aaron Crane, Abigail, Andreas König, Aristotle Pagaltzis, Chris 'BinGOs'
+Williams, Craig A. Berry, Dagfinn Ilmari MannsÃ¥ker, David Golden, David
+Mitchell, H.Merijn Brand, James E Keenan, Jarkko Hietaniemi, Karen Etheridge,
+Karl Williamson, Matthew Horsfall, Niko Tyni, Ricardo Signes, Sawyer X, Stevan
+Little, Steve Hay, Todd Rinaldo, Tony Cook, Vladimir Timofeev, Yves Orton.
 
 The list above is almost certainly incomplete as it is automatically generated
 from version control history.  In particular, it does not include the names of
@@ -306,8 +354,8 @@ the F<AUTHORS> file in the Perl source distribution.
 
 If you find what you think is a bug, you might check the articles recently
 posted to the comp.lang.perl.misc newsgroup and the perl bug database at
-https://rt.perl.org/ .  There may also be information at
-http://www.perl.org/ , the Perl Home Page.
+https://rt.perl.org/ .  There may also be information at http://www.perl.org/ ,
+the Perl Home Page.
 
 If you believe you have an unreported bug, please run the L<perlbug> program
 included with your release.  Be sure to trim your bug down to a tiny but
index c6e8c18..1421928 100644 (file)
@@ -7068,8 +7068,21 @@ space.
 
 =item Warning: unable to close filehandle %s properly: %s
 
-(S io) An error occurred when Perl implicitly closed a filehandle.  This
-usually indicates your file system ran out of disk space.
+(S io) There were errors during the implicit close() done on a filehandle
+when its reference count reached zero while it was still open, e.g.:
+
+    {
+        open my $fh, '>', $file  or die "open: '$file': $!\n";
+        print $fh $data or die "print: $!";
+    } # implicit close here
+
+Because various errors may only be detected by close() (e.g. buffering could
+allow the C<print> in this example to return true even when the disk is full),
+it is dangerous to ignore its result. So when it happens implicitly, perl will
+signal errors by warning.
+
+B<Prior to version 5.22.0, perl ignored such errors>, so the common idiom shown
+above was liable to cause B<silent data loss>.
 
 =item Warning: Use of "%s" without parentheses is ambiguous
 
index 650ad0e..4a18793 100644 (file)
@@ -2235,7 +2235,7 @@ value returned work just like C<ioctl> below.
 For example:
 
     use Fcntl;
-    fcntl($filehandle, F_GETFL, $packed_return_buffer)
+    my $flags = fcntl($filehandle, F_GETFL, 0)
         or die "can't fcntl F_GETFL: $!";
 
 You don't have to check for C<defined> on the return from C<fcntl>.
@@ -3040,18 +3040,23 @@ X<hex> X<hexadecimal>
 
 =item hex
 
-=for Pod::Functions convert a string to a hexadecimal number
+=for Pod::Functions convert a hexadecimal string to a number
 
-Interprets EXPR as a hex string and returns the corresponding value.
-(To convert strings that might start with either C<0>, C<0x>, or C<0b>, see
-L</oct>.)  If EXPR is omitted, uses C<$_>.
+Interprets EXPR as a hex string and returns the corresponding numeric value.
+If EXPR is omitted, uses C<$_>.
 
     print hex '0xAf'; # prints '175'
     print hex 'aF';   # same
+    $valid_input =~ /\A(?:0?[xX])?(?:_?[0-9a-fA-F])*\z/
+
+A hex string consists of hex digits and an optional C<0x> or C<x> prefix.
+Each hex digit may be preceded by a single underscore, which will be ignored.
+Any other character triggers a warning and causes the rest of the string
+to be ignored (even leading whitespace, unlike L</oct>).
+Only integers can be represented, and integer overflow triggers a warning.
 
-Hex strings may only represent integers.  Strings that would cause
-integer overflow trigger a warning.  Leading whitespace is not stripped,
-unlike oct().  To present something as hex, look into L</printf>,
+To convert strings that might start with any of C<0>, C<0x>, or C<0b>, see L</oct>.
+To present something as hex, look into L</printf>,
 L</sprintf>, and L</unpack>.
 
 =item import LIST
@@ -6642,7 +6647,7 @@ argument is given.  Returns the integer number of seconds actually slept.
 May be interrupted if the process receives a signal such as C<SIGALRM>.
 
     eval {
-        local $SIG{ALARM} = sub { die "Alarm!\n" };
+        local $SIG{ALRM} = sub { die "Alarm!\n" };
         sleep;
     };
     die $@ unless $@ eq "Alarm!\n";
index f7cd08d..29cb79e 100644 (file)
@@ -1436,12 +1436,13 @@ C<-DPERL_MEM_LOG> instead.
 
 =head2 PERL_MEM_LOG
 
-If compiled with C<-DPERL_MEM_LOG>, both memory and SV allocations go
-through logging functions, which is handy for breakpoint setting.
+If compiled with C<-DPERL_MEM_LOG> (C<-Accflags=-DPERL_MEM_LOG>), both
+memory and SV allocations go through logging functions, which is
+handy for breakpoint setting.
 
-Unless C<-DPERL_MEM_LOG_NOIMPL> is also compiled, the logging functions
-read $ENV{PERL_MEM_LOG} to determine whether to log the event, and if
-so how:
+Unless C<-DPERL_MEM_LOG_NOIMPL> (C<-Accflags=-DPERL_MEM_LOG_NOIMPL>) is
+also compiled, the logging functions read $ENV{PERL_MEM_LOG} to
+determine whether to log the event, and if so how:
 
     $ENV{PERL_MEM_LOG} =~ /m/          Log all memory ops
     $ENV{PERL_MEM_LOG} =~ /s/          Log all SV ops
index ecbec1a..37bab71 100644 (file)
@@ -565,6 +565,8 @@ the strings?).
  Steve     5.22.1-RC3   2015-Dec-02
  Steve     5.22.1-RC4   2015-Dec-08
  Steve     5.22.1       2015-Dec-13
+ Steve     5.22.2-RC1   2016-Apr-10
+ Steve     5.22.2       2016-Apr-29
 
  Ricardo   5.23.0       2015-Jun-20     The 5.23 development track
  Matthew   5.23.1       2015-Jul-20
@@ -572,6 +574,10 @@ the strings?).
  Peter     5.23.3       2015-Sep-20
  Steve     5.23.4       2015-Oct-20
  Abigail   5.23.5       2015-Nov-20
+ David G   5.23.6       2015-Dec-21
+ Stevan    5.23.7       2016-Jan-20
+ Sawyer X  5.23.8       2016-Feb-20
+ Abigail   5.23.9       2016-Mar-20
 
 =head2 SELECTED RELEASE SIZES
 
index 464d144..6542fb4 100644 (file)
@@ -379,8 +379,8 @@ semantics for that.  Let the operating system sort it out.
 
 The I<portable filename characters> as defined by ANSI C are
 
- a b c d e f g h i j k l m n o p q r t u v w x y z
- A B C D E F G H I J K L M N O P Q R T U V W X Y Z
+ a b c d e f g h i j k l m n o p q r t u v w x y z
+ A B C D E F G H I J K L M N O P Q R T U V W X Y Z
  0 1 2 3 4 5 6 7 8 9
  . _ -
 
index 86ecfdd..b3a30c8 100644 (file)
@@ -887,7 +887,7 @@ for obfuscated code:
     # @harry is (1,2,3)
 
     my $type = ref $thingy;
-    ($type ? $type == 'ARRAY' ? \@foo : \$bar : $baz) = $thingy;
+    ($type ? $type eq 'ARRAY' ? \@foo : \$bar : $baz) = $thingy;
 
 The C<foreach> loop can also take a reference constructor for its loop
 variable, though the syntax is limited to one of the following, with an
@@ -906,7 +906,7 @@ arrays-of-arrays, or arrays-of-hashes:
     }
 
     foreach \my %h (@array_of_hashes) {
-        $h{gelastic}++ if $h{type} == 'funny';
+        $h{gelastic}++ if $h{type} eq 'funny';
     }
 
 B<CAVEAT:> Aliasing does not work correctly with closures.  If you try to
diff --git a/pp.c b/pp.c
index db1f626..3173c5a 100644 (file)
--- a/pp.c
+++ b/pp.c
@@ -3681,10 +3681,7 @@ PP(pp_ucfirst)
     /* We may be able to get away with changing only the first character, in
      * place, but not if read-only, etc.  Later we may discover more reasons to
      * not convert in-place. */
-    inplace = !SvREADONLY(source)
-          && (  SvPADTMP(source)
-             || (  SvTEMP(source) && !SvSMAGICAL(source)
-                && SvREFCNT(source) == 1));
+    inplace = !SvREADONLY(source) && SvPADTMP(source);
 
     /* First calculate what the changed first character should be.  This affects
      * whether we can just swap it out, leaving the rest of the string unchanged,
@@ -3924,9 +3921,7 @@ PP(pp_uc)
 
     SvGETMAGIC(source);
 
-    if ((SvPADTMP(source)
-        ||
-       (SvTEMP(source) && !SvSMAGICAL(source) && SvREFCNT(source) == 1))
+    if (   SvPADTMP(source)
        && !SvREADONLY(source) && SvPOK(source)
        && !DO_UTF8(source)
        && (
@@ -4179,10 +4174,7 @@ PP(pp_lc)
 
     SvGETMAGIC(source);
 
-    if (   (  SvPADTMP(source)
-          || (  SvTEMP(source) && !SvSMAGICAL(source)
-             && SvREFCNT(source) == 1  )
-          )
+    if (   SvPADTMP(source)
        && !SvREADONLY(source) && SvPOK(source)
        && !DO_UTF8(source)) {
 
@@ -5121,15 +5113,20 @@ PP(pp_lslice)
     SV **lelem;
 
     if (GIMME_V != G_ARRAY) {
-       I32 ix = SvIV(*lastlelem);
-       if (ix < 0)
-           ix += max;
-       if (ix < 0 || ix >= max)
-           *firstlelem = &PL_sv_undef;
-       else
-           *firstlelem = firstrelem[ix];
-       SP = firstlelem;
-       RETURN;
+        if (lastlelem < firstlelem) {
+            *firstlelem = &PL_sv_undef;
+        }
+        else {
+            I32 ix = SvIV(*lastlelem);
+            if (ix < 0)
+                ix += max;
+            if (ix < 0 || ix >= max)
+                *firstlelem = &PL_sv_undef;
+            else
+                *firstlelem = firstrelem[ix];
+        }
+        SP = firstlelem;
+        RETURN;
     }
 
     if (max == 0) {
index 3165bca..d56936f 100644 (file)
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -3039,6 +3039,8 @@ PP(pp_entersub)
                     SP = PL_stack_base + POPMARK;
                 else
                     (void)POPMARK;
+                if (GIMME_V == G_SCALAR)
+                    PUSHs(&PL_sv_undef);
                 RETURN;
             }
             SvGETMAGIC(sv);
index 40eba7d..dd7bc8a 100644 (file)
--- a/pp_pack.c
+++ b/pp_pack.c
@@ -2487,7 +2487,7 @@ S_pack_rec(pTHX_ SV *cat, tempsym_t* symptr, SV **beglist, SV **endlist )
            if (howlen == e_star) len = fromlen;
            field_len = (len+1)/2;
            GROWING(utf8, cat, start, cur, field_len);
-           if (!utf8 && len > (I32)fromlen) len = fromlen;
+           if (!utf8_source && len > (I32)fromlen) len = fromlen;
            bits = 0;
            l = 0;
            if (datumtype == 'H')
index 7c20f52..570aaa2 100644 (file)
--- a/pp_sys.c
+++ b/pp_sys.c
@@ -678,8 +678,6 @@ PP(pp_pipe_op)
     GV * const wgv = MUTABLE_GV(POPs);
     GV * const rgv = MUTABLE_GV(POPs);
 
-    assert (isGV_with_GP(rgv));
-    assert (isGV_with_GP(wgv));
     rstio = GvIOn(rgv);
     if (IoIFP(rstio))
        do_close(rgv, FALSE);
diff --git a/proto.h b/proto.h
index 0a33758..ab78202 100644 (file)
--- a/proto.h
+++ b/proto.h
@@ -61,13 +61,6 @@ PERL_CALLCONV bool   Perl__is_utf8_FOO(pTHX_ const U8 classnum, const U8 *p)
 #define PERL_ARGS_ASSERT__IS_UTF8_FOO  \
        assert(p)
 
-PERL_STATIC_INLINE STRLEN      S__is_utf8_char_slow(const U8 *s, const U8 *e)
-                       __attribute__warn_unused_result__
-                       __attribute__nonnull__(1)
-                       __attribute__nonnull__(2);
-#define PERL_ARGS_ASSERT__IS_UTF8_CHAR_SLOW    \
-       assert(s); assert(e)
-
 PERL_CALLCONV bool     Perl__is_utf8_idcont(pTHX_ const U8 *p)
                        __attribute__warn_unused_result__
                        __attribute__nonnull__(pTHX_1);
@@ -158,11 +151,6 @@ PERL_CALLCONV SV * Perl_amagic_deref_call(pTHX_ SV *ref, int method)
        assert(ref)
 
 PERL_CALLCONV bool     Perl_amagic_is_enabled(pTHX_ int method);
-PERL_STATIC_INLINE void        S_append_utf8_from_native_byte(const U8 byte, U8** dest)
-                       __attribute__nonnull__(2);
-#define PERL_ARGS_ASSERT_APPEND_UTF8_FROM_NATIVE_BYTE  \
-       assert(dest)
-
 PERL_CALLCONV I32      Perl_apply(pTHX_ I32 type, SV** mark, SV** sp)
                        __attribute__nonnull__(pTHX_2)
                        __attribute__nonnull__(pTHX_3);
@@ -282,12 +270,6 @@ PERL_CALLCONV SV** Perl_av_store(pTHX_ AV *av, SSize_t key, SV *val)
                        __attribute__warn_unused_result__
                        __attribute__nonnull__(pTHX_1); */
 
-PERL_STATIC_INLINE SSize_t     S_av_top_index(pTHX_ AV *av)
-                       __attribute__warn_unused_result__
-                       __attribute__nonnull__(pTHX_1);
-#define PERL_ARGS_ASSERT_AV_TOP_INDEX  \
-       assert(av)
-
 PERL_CALLCONV void     Perl_av_undef(pTHX_ AV *av)
                        __attribute__nonnull__(pTHX_1);
 #define PERL_ARGS_ASSERT_AV_UNDEF      \
@@ -1880,14 +1862,6 @@ PERL_CALLCONV bool       Perl_is_invariant_string(const U8 *s, STRLEN len)
 PERL_CALLCONV I32      Perl_is_lvalue_sub(pTHX)
                        __attribute__warn_unused_result__;
 
-PERL_STATIC_INLINE bool        S_is_safe_syscall(pTHX_ const char *pv, STRLEN len, const char *what, const char *op_name)
-                       __attribute__warn_unused_result__
-                       __attribute__nonnull__(pTHX_1)
-                       __attribute__nonnull__(pTHX_3)
-                       __attribute__nonnull__(pTHX_4);
-#define PERL_ARGS_ASSERT_IS_SAFE_SYSCALL       \
-       assert(pv); assert(what); assert(op_name)
-
 PERL_CALLCONV bool     Perl_is_uni_alnum(pTHX_ UV c)
                        __attribute__deprecated__
                        __attribute__warn_unused_result__
@@ -4457,11 +4431,6 @@ PERL_CALLCONV NV Perl_sv_nv(pTHX_ SV* sv)
 #define PERL_ARGS_ASSERT_SV_NV \
        assert(sv)
 
-PERL_STATIC_INLINE bool        S_sv_only_taint_gmagic(SV *sv)
-                       __attribute__nonnull__(1);
-#define PERL_ARGS_ASSERT_SV_ONLY_TAINT_GMAGIC  \
-       assert(sv)
-
 PERL_CALLCONV char*    Perl_sv_peek(pTHX_ SV* sv);
 PERL_CALLCONV void     Perl_sv_pos_b2u(pTHX_ SV *const sv, I32 *const offsetp)
                        __attribute__nonnull__(pTHX_2);
@@ -5446,6 +5415,39 @@ STATIC SV *      S_incpush_if_exists(pTHX_ AV *const av, SV *dir, SV *const stem)
 
 #  endif
 #endif
+#if !defined(PERL_NO_INLINE_FUNCTIONS)
+PERL_STATIC_INLINE STRLEN      S__is_utf8_char_slow(const U8 *s, const U8 *e)
+                       __attribute__warn_unused_result__
+                       __attribute__nonnull__(1)
+                       __attribute__nonnull__(2);
+#define PERL_ARGS_ASSERT__IS_UTF8_CHAR_SLOW    \
+       assert(s); assert(e)
+
+PERL_STATIC_INLINE void        S_append_utf8_from_native_byte(const U8 byte, U8** dest)
+                       __attribute__nonnull__(2);
+#define PERL_ARGS_ASSERT_APPEND_UTF8_FROM_NATIVE_BYTE  \
+       assert(dest)
+
+PERL_STATIC_INLINE SSize_t     S_av_top_index(pTHX_ AV *av)
+                       __attribute__warn_unused_result__
+                       __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_AV_TOP_INDEX  \
+       assert(av)
+
+PERL_STATIC_INLINE bool        S_is_safe_syscall(pTHX_ const char *pv, STRLEN len, const char *what, const char *op_name)
+                       __attribute__warn_unused_result__
+                       __attribute__nonnull__(pTHX_1)
+                       __attribute__nonnull__(pTHX_3)
+                       __attribute__nonnull__(pTHX_4);
+#define PERL_ARGS_ASSERT_IS_SAFE_SYSCALL       \
+       assert(pv); assert(what); assert(op_name)
+
+PERL_STATIC_INLINE bool        S_sv_only_taint_gmagic(SV *sv)
+                       __attribute__nonnull__(1);
+#define PERL_ARGS_ASSERT_SV_ONLY_TAINT_GMAGIC  \
+       assert(sv)
+
+#endif
 #if !defined(PERL_NO_UTF16_FILTER)
 #  if defined(PERL_IN_TOKE_C)
 STATIC U8*     S_add_utf16_textfilter(pTHX_ U8 *const s, bool reversed)
@@ -8024,6 +8026,28 @@ STATIC void      S_mem_log_common(enum mem_log_type mlt, const UV n, const UV typesiz
 
 #  endif
 #endif
+#if defined(PERL_MEM_LOG)
+PERL_CALLCONV Malloc_t Perl_mem_log_alloc(const UV nconst, UV typesize, const char *type_name, Malloc_t newalloc, const char *filename, const int linenumber, const char *funcname)
+                       __attribute__nonnull__(3)
+                       __attribute__nonnull__(5)
+                       __attribute__nonnull__(7);
+#define PERL_ARGS_ASSERT_MEM_LOG_ALLOC \
+       assert(type_name); assert(filename); assert(funcname)
+
+PERL_CALLCONV Malloc_t Perl_mem_log_free(Malloc_t oldalloc, const char *filename, const int linenumber, const char *funcname)
+                       __attribute__nonnull__(2)
+                       __attribute__nonnull__(4);
+#define PERL_ARGS_ASSERT_MEM_LOG_FREE  \
+       assert(filename); assert(funcname)
+
+PERL_CALLCONV Malloc_t Perl_mem_log_realloc(const UV n, const UV typesize, const char *type_name, Malloc_t oldalloc, Malloc_t newalloc, const char *filename, const int linenumber, const char *funcname)
+                       __attribute__nonnull__(3)
+                       __attribute__nonnull__(6)
+                       __attribute__nonnull__(8);
+#define PERL_ARGS_ASSERT_MEM_LOG_REALLOC       \
+       assert(type_name); assert(filename); assert(funcname)
+
+#endif
 #if defined(PERL_OP_PARENT)
 PERL_CALLCONV OP*      Perl_op_parent(OP *o)
                        __attribute__nonnull__(1);
index 49644d7..9332dea 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -1173,14 +1173,23 @@ S_get_ANYOF_cp_list_for_ssc(pTHX_ const RExC_state_t *pRExC_state,
     /* Add in the points from the bit map */
     for (i = 0; i < NUM_ANYOF_CODE_POINTS; i++) {
         if (ANYOF_BITMAP_TEST(node, i)) {
-            invlist = add_cp_to_invlist(invlist, i);
+            unsigned int start = i++;
+
+            for (; i < NUM_ANYOF_CODE_POINTS && ANYOF_BITMAP_TEST(node, i); ++i) {
+                /* empty */
+            }
+            invlist = _add_range_to_invlist(invlist, start, i-1);
             new_node_has_latin1 = TRUE;
         }
     }
 
     /* If this can match all upper Latin1 code points, have to add them
-     * as well */
-    if (ANYOF_FLAGS(node) & ANYOF_MATCHES_ALL_NON_UTF8_NON_ASCII) {
+     * as well.  But don't add them if inverting, as when that gets done below,
+     * it would exclude all these characters, including the ones it shouldn't
+     * that were added just above */
+    if ((ANYOF_FLAGS(node) & (ANYOF_INVERT|ANYOF_MATCHES_ALL_NON_UTF8_NON_ASCII))
+           == ANYOF_MATCHES_ALL_NON_UTF8_NON_ASCII)
+    {
         _invlist_union(invlist, PL_UpperLatin1, &invlist);
     }
 
@@ -2227,8 +2236,8 @@ S_make_trie(pTHX_ RExC_state_t *pRExC_state, regnode *startbranch,
 
     for ( cur = first ; cur < last ; cur = regnext( cur ) ) {
         regnode *noper = NEXTOPER( cur );
-        const U8 *uc = (U8*)STRING( noper );
-        const U8 *e  = uc + STR_LEN( noper );
+        const U8 *uc;
+        const U8 *e;
         int foldlen = 0;
         U32 wordlen      = 0;         /* required init */
         STRLEN minchars = 0;
@@ -2238,17 +2247,19 @@ S_make_trie(pTHX_ RExC_state_t *pRExC_state, regnode *startbranch,
 
         if (OP(noper) == NOTHING) {
             regnode *noper_next= regnext(noper);
-            if (noper_next != tail && OP(noper_next) == flags) {
-                noper = noper_next;
-                uc= (U8*)STRING(noper);
-                e= uc + STR_LEN(noper);
-               trie->minlen= STR_LEN(noper);
-            } else {
-               trie->minlen= 0;
-               continue;
-           }
+            if (noper_next < tail)
+                noper= noper_next;
+        }
+
+        if ( noper < tail && ( OP(noper) == flags || ( flags == EXACTFU && OP(noper) == EXACTFU_SS ) ) ) {
+            uc= (U8*)STRING(noper);
+            e= uc + STR_LEN(noper);
+        } else {
+            trie->minlen= 0;
+            continue;
         }
 
+
         if ( set_bit ) { /* bitmap only alloced when !(UTF&&Folding) */
             TRIE_BITMAP_SET(trie,*uc); /* store the raw first byte
                                           regardless of encoding */
@@ -2454,22 +2465,20 @@ S_make_trie(pTHX_ RExC_state_t *pRExC_state, regnode *startbranch,
         for ( cur = first ; cur < last ; cur = regnext( cur ) ) {
 
             regnode *noper   = NEXTOPER( cur );
-           U8 *uc           = (U8*)STRING( noper );
-            const U8 *e      = uc + STR_LEN( noper );
            U32 state        = 1;         /* required init */
            U16 charid       = 0;         /* sanity init */
             U32 wordlen      = 0;         /* required init */
 
             if (OP(noper) == NOTHING) {
                 regnode *noper_next= regnext(noper);
-                if (noper_next != tail && OP(noper_next) == flags) {
-                    noper = noper_next;
-                    uc= (U8*)STRING(noper);
-                    e= uc + STR_LEN(noper);
-                }
+                if (noper_next < tail)
+                    noper= noper_next;
             }
 
-            if (OP(noper) != NOTHING) {
+            if ( noper < tail && ( OP(noper) == flags || ( flags == EXACTFU && OP(noper) == EXACTFU_SS ) ) ) {
+                const U8 *uc= (U8*)STRING(noper);
+                const U8 *e= uc + STR_LEN(noper);
+
                 for ( ; uc < e ; uc += len ) {
 
                     TRIE_READ_CHAR;
@@ -2673,8 +2682,6 @@ S_make_trie(pTHX_ RExC_state_t *pRExC_state, regnode *startbranch,
         for ( cur = first ; cur < last ; cur = regnext( cur ) ) {
 
             regnode *noper   = NEXTOPER( cur );
-           const U8 *uc     = (U8*)STRING( noper );
-            const U8 *e      = uc + STR_LEN( noper );
 
             U32 state        = 1;         /* required init */
 
@@ -2685,14 +2692,14 @@ S_make_trie(pTHX_ RExC_state_t *pRExC_state, regnode *startbranch,
 
             if (OP(noper) == NOTHING) {
                 regnode *noper_next= regnext(noper);
-                if (noper_next != tail && OP(noper_next) == flags) {
-                    noper = noper_next;
-                    uc= (U8*)STRING(noper);
-                    e= uc + STR_LEN(noper);
-                }
+                if (noper_next < tail)
+                    noper= noper_next;
             }
 
-            if ( OP(noper) != NOTHING ) {
+            if ( noper < tail && ( OP(noper) == flags || ( flags == EXACTFU && OP(noper) == EXACTFU_SS ) ) ) {
+                const U8 *uc= (U8*)STRING(noper);
+                const U8 *e= uc + STR_LEN(noper);
+
                 for ( ; uc < e ; uc += len ) {
 
                     TRIE_READ_CHAR;
@@ -4188,8 +4195,8 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
                             U8 noper_trietype = TRIE_TYPE( noper_type );
 #if defined(DEBUGGING) || defined(NOJUMPTRIE)
                             regnode * const noper_next = regnext( noper );
-                           U8 noper_next_type = (noper_next && noper_next != tail) ? OP(noper_next) : 0;
-                           U8 noper_next_trietype = (noper_next && noper_next != tail) ? TRIE_TYPE( noper_next_type ) :0;
+                            U8 noper_next_type = (noper_next && noper_next < tail) ? OP(noper_next) : 0;
+                            U8 noper_next_trietype = (noper_next && noper_next < tail) ? TRIE_TYPE( noper_next_type ) :0;
 #endif
 
                             DEBUG_TRIE_COMPILE_r({
@@ -4217,7 +4224,7 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
                             if ( noper_trietype
                                   &&
                                   (
-                                        ( noper_trietype == NOTHING)
+                                        ( noper_trietype == NOTHING )
                                         || ( trietype == NOTHING )
                                         || ( trietype == noper_trietype )
                                   )
@@ -4235,7 +4242,7 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp,
                                    if ( noper_trietype == NOTHING ) {
 #if !defined(DEBUGGING) && !defined(NOJUMPTRIE)
                                        regnode * const noper_next = regnext( noper );
-                                        U8 noper_next_type = (noper_next && noper_next!=tail) ? OP(noper_next) : 0;
+                                        U8 noper_next_type = (noper_next && noper_next < tail) ? OP(noper_next) : 0;
                                        U8 noper_next_trietype = noper_next_type ? TRIE_TYPE( noper_next_type ) :0;
 #endif
 
@@ -14356,6 +14363,11 @@ S_regclass(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth,
         }
         else if (value == '\\') {
             /* Is a backslash; get the code point of the char after it */
+
+            if (RExC_parse >= RExC_end) {
+                vFAIL("Unmatched [");
+            }
+
            if (UTF && ! UTF8_IS_INVARIANT(UCHARAT(RExC_parse))) {
                value = utf8n_to_uvchr((U8*)RExC_parse,
                                   RExC_end - RExC_parse,
diff --git a/sv.h b/sv.h
index 665c330..335b874 100644 (file)
--- a/sv.h
+++ b/sv.h
@@ -831,7 +831,7 @@ Set the current length of the string which is in the SV.  See C<SvCUR>
 and C<SvIV_set>.
 
 =for apidoc Am|void|SvLEN_set|SV* sv|STRLEN len
-Set the actual length of the string which is in the SV.  See C<SvIV_set>.
+Set the size of the string buffer for the SV. See C</SvLEN>.
 
 =cut
 */
index 53ae296..2e970a7 100644 (file)
@@ -10,6 +10,8 @@ use strict;
 use warnings;
 
 skip_all('no SysV semaphores on this platform') if !$Config{d_sem};
+skip_all('SysV semaphore structures not detected')
+    if !$Config{d_semctl_semid_ds} && !$Config{d_semctl_semun};
 
 my @warnings;
 {
diff --git a/t/lib/croak/pp_sys b/t/lib/croak/pp_sys
new file mode 100644 (file)
index 0000000..739b7e9
--- /dev/null
@@ -0,0 +1,16 @@
+__END__
+# pp_sys.c
+# NAME pipe() croaks on bad left side [perl #126480]
+# SKIP ? use Config; !$Config{d_pipe} && "No pipe() available"
+my $fh;
+pipe($$5, $fh)
+EXPECT
+Bad symbol for filehandle at - line 3.
+########
+# NAME pipe() croaks on bad right side [perl #126480]
+# SKIP ? use Config; !$Config{d_pipe} && "No pipe() available"
+my $fh;
+pipe($fh, $$5)
+EXPECT
+Bad symbol for filehandle at - line 2.
+########
index db3300f..97dbea6 100644 (file)
@@ -37,6 +37,24 @@ syntax error at - line 1, near "0$#"
 Missing right curly or square bracket at - line 1, at end of line
 Execution of - aborted due to compilation errors.
 ########
+# NAME (Missing operator before @foo) [perl #123737]
+0@foo
+EXPECT
+Array found where operator expected at - line 1, near "0@foo"
+       (Missing operator before @foo?)
+syntax error at - line 1, near "0@foo
+"
+Execution of - aborted due to compilation errors.
+########
+# NAME (Missing operator before @{) [perl #123737]
+0@{
+EXPECT
+Array found where operator expected at - line 1, near "0@{"
+       (Missing operator before @{?)
+syntax error at - line 1, near "0@"
+Missing right curly or square bracket at - line 1, at end of line
+Execution of - aborted due to compilation errors.
+########
 # NAME Unterminated here-doc in string eval
 eval "<<foo"; die $@
 EXPECT
index 095adee..bad22c6 100644 (file)
@@ -458,3 +458,13 @@ use strict 'subs';
 EXPECT
 Bareword "FOO" not allowed while "strict subs" in use at - line 3.
 Execution of - aborted due to compilation errors.
+########
+# [perl #126981] Strict subs vs. multideref
+sub CONST () { 'some_key' }
+my $h;
+my $v1 = $h->{+CONST_TYPO};
+use strict 'subs';
+my $v2 = $h->{+CONST_TYPO};
+EXPECT
+Bareword "CONST_TYPO" not allowed while "strict subs" in use at - line 6.
+Execution of - aborted due to compilation errors.
index b9943a0..d99e155 100644 (file)
@@ -36,3 +36,10 @@ $a = qr/[\c,]/;
 EXPECT
 "\c," is more clearly written simply as "l" at - line 9.
 "\c," is more clearly written simply as "l" at - line 10.
+########
+# NAME [perl #126141]
+# OPTION fatal
+eval {/$_/}, print "$_ ==> ", $@ || "OK!\n" for "]]]]]]]]][\\", "]]]]][\\"
+EXPECT
+]]]]]]]]][\ ==> Unmatched [ in regex; marked by <-- HERE in m/]]]]]]]]][\ <-- HERE / at - line 2.
+]]]]][\ ==> Unmatched [ in regex; marked by <-- HERE in m/]]]]][\ <-- HERE / at - line 2.
index 16e1fce..219db03 100644 (file)
@@ -428,4 +428,23 @@ package _123817 {
     eval 'return my $x : m';
 }
 
+# [perl #126257]
+# attributed lex var as function arg caused assertion failure
+
+package P126257 {
+    sub MODIFY_SCALAR_ATTRIBUTES {}
+    sub MODIFY_ARRAY_ATTRIBUTES  {}
+    sub MODIFY_HASH_ATTRIBUTES   {}
+    sub MODIFY_CODE_ATTRIBUTES   {}
+    sub foo {}
+    eval { foo(my $x : bar); };
+    ::is $@, "", "RT 126257 scalar";
+    eval { foo(my @x : bar); };
+    ::is $@, "", "RT 126257 array";
+    eval { foo(my %x : bar); };
+    ::is $@, "", "RT 126257 hash";
+    eval { foo(sub : bar {}); };
+    ::is $@, "", "RT 126257 sub";
+}
+
 done_testing();
index fcfe675..2906499 100644 (file)
@@ -6,7 +6,7 @@ BEGIN {
     set_up_inc('../lib');
 }
 
-plan(tests => 132);
+plan(tests => 133);
 
 eval 'pass();';
 
@@ -645,3 +645,15 @@ sub _117941 { package _117941; eval '$a' }
 delete $::{"_117941::"};
 _117941();
 pass("eval in freed package does not crash");
+
+# RT #127786
+# this used to give an assertion failure
+
+{
+    package DB {
+        sub f127786 { eval q/\$s/ }
+    }
+    my $s;
+    sub { $s; DB::f127786}->();
+    pass("RT #127786");
+}
index a239e92..8fe0c0f 100644 (file)
@@ -7,7 +7,7 @@ BEGIN {
 }
 
 use strict;
-plan(tests => 39);
+plan(tests => 41);
 
 
 # heredoc without newline (#65838)
@@ -89,4 +89,21 @@ HEREDOC
         {},
         "long terminator fails correctly"
     );
+
+    # this would read freed memory
+    fresh_perl_like(
+        qq(0<<<<""0\n\n),
+        # valgrind and asan reports an error between these two lines
+        qr/^Number found where operator expected at - line 1, near "<<""0"\s+\(Missing operator/,
+        {},
+        "don't use an invalid oldoldbufptr"
+    );
+
+    # [perl #125540] this asserted or crashed
+    fresh_perl_like(
+       q(map d$#<<<<),
+       qr/Can't find string terminator "" anywhere before EOF at - line 1\./,
+       {},
+       "Don't assert parsing a here-doc if we hit EOF early"
+    );
 }
index c9f9e39..4b2a96d 100644 (file)
@@ -10,7 +10,7 @@ use strict;
 
 use Config;
 
-plan(tests => 97);
+plan(tests => 105);
 
 # Test hexfloat literals.
 
@@ -40,6 +40,11 @@ is(0x0.1p0, 0.0625);
 is(0x0.10p0, 0.0625);
 is(0x0.100p0, 0.0625);
 
+is(0x.1p0, 0.0625);
+is(0x1.1p0, 1.0625);
+is(0x1.11p0, 1.06640625);
+is(0x1.111p0, 1.066650390625);
+
 # Positive exponents.
 is(0x1p2, 4);
 is(0x1p+2, 4);
@@ -107,6 +112,15 @@ is(0xa_b.c_dp+1_2, 703696);
 # different from 3e4 cf 30e3 cf 30000.  The shifting of the hexdigits
 # makes it look stranger, though: 0xap1 == 0x5p2.
 
+# [perl #127183], try some non-canonical forms.
+SKIP: {
+    skip("nv_preserves_uv_bits is $Config{nv_preserves_uv_bits} not 53", 3)
+        unless ($Config{nv_preserves_uv_bits} == 53);
+    is(0x0.b17217f7d1cf78p0, 0x1.62e42fefa39efp-1);
+    is(0x0.58b90bfbe8e7bcp1, 0x1.62e42fefa39efp-1);
+    is(0x0.2c5c85fdf473dep2, 0x1.62e42fefa39efp-1);
+}
+
 # Needs to use within() instead of is() because of long doubles.
 within(0x1.99999999999ap-4, 0.1, 1e-9);
 within(0x3.333333333333p-5, 0.1, 1e-9);
@@ -133,11 +147,17 @@ sub get_warn() {
     eval '@a = 0x3..5';
     is("@a", "3 4 5");
 
+    undef $a;
     eval '$a = eval "0x.3"';
     is($a, '03');
 
+    undef $a;
     eval '$a = eval "0xc.3"';
     is($a, '123');
+
+    undef $a;
+    eval '$a = eval "0x.p3"';
+    is($a, undef);
 }
 
 # Test warnings.
index ffea0ae..9f2bdb0 100644 (file)
--- a/t/op/lc.t
+++ b/t/op/lc.t
@@ -1,6 +1,8 @@
 #!./perl
 
 # This file is intentionally encoded in latin-1.
+#
+# Test uc(), lc(), fc(), ucfirst(), lcfirst(), quotemeta() etc
 
 BEGIN {
     chdir 't' if -d 't';
@@ -14,7 +16,7 @@ BEGIN {
 
 use feature qw( fc );
 
-plan tests => 134 + 4 * 256;
+plan tests => 139 + 4 * 256;
 
 is(lc(undef),     "", "lc(undef) is ''");
 is(lcfirst(undef), "", "lcfirst(undef) is ''");
@@ -317,6 +319,28 @@ $h{k} = bless[], "\x{130}bcde"; # U+0130 grows with lc()
 like lc delete $h{k}, qr "^i\x{307}bcde=array\(.*\)",
     'lc(TEMP ref) does not produce a corrupt string';
 
+# List::Util::first() etc sets $_ to an SvTEMP without raising its
+# refcount.  This was causing lc() etc to unsafely modify in-place.
+# see http://nntp.perl.org/group/perl.perl5.porters/228213
+
+SKIP: {
+    skip "no List::Util on miniperl", 5, if is_miniperl;
+    require List::Util;
+    my %hl = qw(a 1 b 2 c 3);
+    my %hu = qw(A 1 B 2 C 3);
+    my $x;
+    $x = List::Util::first(sub { uc      $_ eq 'A' }, keys %hl);
+    is($x, "a", "first { uc }");
+    $x = List::Util::first(sub { ucfirst $_ eq 'A' }, keys %hl);
+    is($x, "a", "first { ucfirst }");
+    $x = List::Util::first(sub { lc      $_ eq 'a' }, keys %hu);
+    is($x, "A", "first { lc }");
+    $x = List::Util::first(sub { lcfirst $_ eq 'a' }, keys %hu);
+    is($x, "A", "first { lcfirst }");
+    $x = List::Util::first(sub { fc      $_ eq 'a' }, keys %hu);
+    is($x, "A", "first { fc }");
+}
+
 
 my $utf8_locale = find_utf8_ctype_locale();
 
index c7056d0..9fe00a4 100644 (file)
@@ -6,7 +6,7 @@ BEGIN {
     require "./test.pl";
 }
 
-plan( tests => 69 );
+plan( tests => 70 );
 
 @foo = (1, 2, 3, 4);
 cmp_ok($foo[0], '==', 1, 'first elem');
@@ -217,3 +217,6 @@ sub empty {}
 tie $t, "";
 () = (empty(), ($t)x10); # empty() since sub calls usually result in copies
 is(tied($t)->{fetched}, undef, 'assignment to empty list makes no copies');
+
+# this was passing a trash SV at the top of the stack to SvIV()
+ok(($0[()[()]],1), "[perl #126193] list slice with zero indexes");
index 1171f4a..0d7f254 100644 (file)
@@ -13,7 +13,7 @@ BEGIN {
 use strict;
 no warnings 'once';
 
-plan(tests => 147);
+plan(tests => 148);
 
 @A::ISA = 'B';
 @B::ISA = 'C';
@@ -657,6 +657,23 @@ SKIP: {
     like ($@, qr/Modification of a read-only value attempted/, 'RT #123619');
 }
 
+{
+    # RT #126042 &{1==1} * &{1==1} would crash
+
+    # pp_entersub and pp_method_named cooperate to prevent calls to an
+    # undefined import() or unimport() method from croaking.
+    # If pp_method_named can't find the method it pushes &PL_sv_yes, and
+    # pp_entersub checks for that specific SV to avoid croaking.
+    # Ideally they wouldn't use that hack but...
+    # Unfortunately pp_entersub's handling of that case is broken in scalar context.
+
+    # Rather than using the test case from the ticket, since &{1==1}
+    # isn't documented (and may not be supported in future perls) test
+    # calls to undefined import method, which also crashes.
+    fresh_perl_is('Unknown->import() * Unknown->unimport(); print "ok\n"', "ok\n", {},
+                  "check unknown import() methods don't corrupt the stack");
+}
+
 __END__
 #FF9900
 #F78C08
index 1b0fd0d..f905566 100644 (file)
@@ -12,7 +12,7 @@ my $no_endianness = $] > 5.009 ? '' :
 my $no_signedness = $] > 5.009 ? '' :
   "Signed/unsigned pack modifiers not available on this perl";
 
-plan tests => 14708;
+plan tests => 14712;
 
 use strict;
 use warnings qw(FATAL all);
@@ -2020,3 +2020,23 @@ is $o::num, 1,     'pack "c" does call num overloading';
 #[perl #123874]: argument underflow leads to corrupt length
 eval q{ pack "pi/x" };
 ok(1, "argument underflow did not crash");
+
+{
+    # [perl #126325] pack [hH] with a unicode string
+    # the hex encoders would read past the end of the string, using
+    # invalid source bytes
+    my $twenty_nuls = "\0" x 20;
+    # This is the case that failed
+    is(pack("WH40", 0x100, ""), "\x{100}$twenty_nuls",
+       "check pack H zero fills (utf8 target)");
+    my $up_nul = "\0";
+
+    utf8::upgrade($up_nul);
+    # check the other combinations too
+    is(pack("WH40", 0x100, $up_nul), "\x{100}$twenty_nuls",
+       "check pack H zero fills (utf8 target/source)");
+    is(pack("H40", ""), $twenty_nuls,
+       "check pack H zero fills (utf8 none)");
+    is(pack("H40", $up_nul), $twenty_nuls,
+       "check pack H zero fills (utf8 source)");
+}
index 094595e..8b12692 100644 (file)
@@ -247,7 +247,7 @@ if ($Config{nvsize} == 8 &&
     print "# no hexfloat tests\n";
 }
 
-plan tests => 1408 + ($Q ? 0 : 12) + @hexfloat + 9;
+plan tests => 1408 + ($Q ? 0 : 12) + @hexfloat + 12;
 
 use strict;
 use Config;
@@ -580,23 +580,27 @@ $o::count = 0;
 is $o::count,    0, 'sprintf %d string overload count is 0';
 is $o::numcount, 1, 'sprintf %d number overload count is 1';
 
-my $ppc64_linux = $Config{archname} =~ /^ppc64-linux/;
-my $irix_ld     = $Config{archname} =~ /^IP\d+-irix-ld$/;
+my $ppc_linux = $Config{archname} =~ /^(?:ppc|power(?:pc)?)(?:64)?-linux/;
+my $irix_ld   = $Config{archname} =~ /^IP\d+-irix-ld$/;
 
 for my $t (@hexfloat) {
     my ($format, $arg, $expected) = @$t;
     $arg = eval $arg;
     my $result = sprintf($format, $arg);
     my $ok = $result eq $expected;
-    if ($doubledouble && $ppc64_linux && $arg =~ /^2.71828/) {
-        # ppc64-linux has buggy exp(1).
+    # For certain platforms (all of which are currently double-double,
+    # but different implementations, GNU vs vendor, two different archs
+    # (ppc and mips), and two different libm interfaces) we have some
+    # bits-in-the-last-hexdigit differences.
+    # Patch them up as TODOs instead of deadly errors.
+    if ($doubledouble && $ppc_linux && $arg =~ /^2.71828/) {
+        # gets  '0x1.5bf0a8b1457695355fb8ac404ecp+1'
+        # wants '0x1.5bf0a8b1457695355fb8ac404e8p+1'
         local $::TODO = "$Config{archname} exp(1)";
         ok($ok, "'$format' '$arg' -> '$result' cf '$expected'");
         next;
     }
     if ($doubledouble && $irix_ld && $arg =~ /^1.41421/) {
-        # irix has buggy sqrt(2),
-        # last hexdigit one bit error:
         # gets  '0x1.6a09e667f3bcc908b2fb1366eacp+0'
         # wants '0x1.6a09e667f3bcc908b2fb1366ea8p+0'
         local $::TODO = "$Config{archname} sqrt(2)";
@@ -698,3 +702,35 @@ SKIP: {
     is(sprintf("%+a", -0.0), "-0x0p+0", "negative zero");
     is(sprintf("%.13a", -0.0), "-0x0.0000000000000p+0", "negative zero");
 }
+
+SKIP: {
+    # [perl #127183] Non-canonical hexadecimal floats are parsed prematurely
+
+    skip("nv_preserves_uv_bits is $Config{nv_preserves_uv_bits}, not 53", 3)
+        unless $Config{nv_preserves_uv_bits} == 53;
+
+    {
+        # The 0x0.b17217f7d1cf78p0 is the original LHS value
+        # from [perl #127183], its bits are 0x162e42fefa39ef << 3,
+        # resulting in a non-canonical form of hexfp, where the most
+        # significant bit is zero, instead of one.
+        is(sprintf("%a", 0x0.b17217f7d1cf78p0 - 0x1.62e42fefa39efp-1),
+           "0x0p+0",
+           "non-canonical form [perl #127183]");
+    }
+
+    {
+        no warnings 'overflow';  # Not the point here.
+
+        # The 0x058b90bfbe8e7bc is 0x162e42fefa39ef << 2,
+        # the 0x02c5c85fdf473de is 0x162e42fefa39ef << 1,
+        # see above.
+        is(sprintf("%a", 0x0.58b90bfbe8e7bcp1 - 0x1.62e42fefa39efp-1),
+           "0x0p+0",
+           "non-canonical form");
+
+        is(sprintf("%a", 0x0.2c5c85fdf473dep2 - 0x1.62e42fefa39efp-1),
+           "0x0p+0",
+           "non-canonical form");
+    }
+}
index e8a561a..cf70d73 100644 (file)
@@ -6,7 +6,7 @@ BEGIN {
     set_up_inc('../lib');
 }
 
-plan(tests => 39);
+plan(tests => 41);
 
 sub empty_sub {}
 
@@ -246,6 +246,13 @@ predeclared(); # set $x to 42
 $main::x = $main::x = "You should not see this.";
 inside_predeclared(); # run test
 
+# RT #126845: this used to fail an assertion in Perl_newATTRSUB_x()
+eval 'sub rt126845_1 (); sub rt126845_1 () :lvalue';
+pass("RT #126845: stub with prototype, then with attribute");
+
+eval 'sub rt126845_2 (); sub rt126845_2 () :lvalue {}';
+pass("RT #126845: stub with prototype, then definition with attribute");
+
 # RT #124156 death during unwinding causes crash
 # the tie allows us to trigger another die while cleaning up the stack
 # from an earlier die.
index 41fef0c..6f01f82 100644 (file)
@@ -250,12 +250,18 @@ for ([chdir=>''],[chmod=>'0,'],[chown=>'0,0,'],[utime=>'0,0,'],
     check_count "$op $args\\\$tied_glob$postargs";
 }
 
-$dummy  =   crypt $var,0; check_count 'crypt $tied, ...';
-$dummy  =   crypt 0,$var; check_count 'crypt ..., $tied';
-$var = substr(chr 256,0,0);
-$dummy  =   crypt $var,0; check_count 'crypt $tied_utf8, ...';
-$var = substr(chr 256,0,0);
-$dummy  =   crypt 0,$var; check_count 'crypt ..., $tied_utf8';
+my $can_config = eval { require Config; 1 };
+SKIP:
+{
+    skip "No Config", 4 unless $can_config;
+    skip "No crypt()", 4 unless $Config::Config{d_crypt};
+    $dummy  =   crypt $var,0; check_count 'crypt $tied, ...';
+    $dummy  =   crypt 0,$var; check_count 'crypt ..., $tied';
+    $var = substr(chr 256,0,0);
+    $dummy  =   crypt $var,0; check_count 'crypt $tied_utf8, ...';
+    $var = substr(chr 256,0,0);
+    $dummy  =   crypt 0,$var; check_count 'crypt ..., $tied_utf8';
+}
 
 SKIP:
 {
index ccba848..85ce7f4 100644 (file)
@@ -1613,6 +1613,8 @@ a(.)\4294967298   ab\o{42}94967298        ya      $1      b       \d not converted to native; \o{} is
 ^m?(\d)(.*)\1$ 5b5     y       $1      5
 ^m?(\d)(.*)\1$ aba     n       -       -
 
+^_?[^\W_0-9]\w\z       \xAA\x{100}     y       $&      \xAA\x{100}             [perl #127537]
+
 # 17F is 'Long s';  This makes sure the a's in /aa can be separate
 /s/ai  \x{17F} y       $&      \x{17F}
 /s/aia \x{17F} n       -       -
@@ -1938,6 +1940,7 @@ A+(*PRUNE)BC(?{}) AAABC   y       $&      AAABC
 (?a-x  -       c       -       Sequence (?... not terminated
 .{1}?? -       c       -       Nested quantifiers
 .{1}?+ -       c       -       Nested quantifiers
+(?:.||)(?|)000000000@  000000000@      y       $&      000000000@              #  [perl #126405]
 
 # Keep these lines at the end of the file
 # vim: softtabstop=0 noexpandtab
index 8a7cd7e..4c661a9 100644 (file)
@@ -8,7 +8,7 @@ BEGIN {
     require './charset_tools.pl';
 }
 
-plan( tests => 267 );
+plan( tests => 268 );
 
 $_ = 'david';
 $a = s/david/rules/r;
@@ -1080,3 +1080,8 @@ SKIP: {
     $s1 =~ s/.?/$s1++/ge;
     is($s1, "01","RT #123954 s1");
 }
+{
+    # RT #126602 double free if the value being modified is freed in the replacement
+    fresh_perl_is('s//*_=0;s|0||;00.y0/e; print qq(ok\n)', "ok\n", { stderr => 1 },
+                  "[perl #126602] s//*_=0;s|0||/e crashes");
+}
diff --git a/t/win32/crypt.t b/t/win32/crypt.t
new file mode 100644 (file)
index 0000000..f0e89ab
--- /dev/null
@@ -0,0 +1,41 @@
+#!./perl
+
+BEGIN {
+    chdir 't' if -d 't';
+    @INC = '../lib';
+    require "./test.pl";
+    eval 'use Errno';
+    die $@ if $@ and !is_miniperl();
+}
+
+my @bad_salts =
+   (
+    [ '',   'zero-length' ],
+    [ 'a',  'length 1' ],
+    [ '!a', 'bad first character' ],
+    [ 'a!', 'bad second character' ],
+    [ '@a', 'fencepost before A' ],
+    [ '[a', 'fencepost after Z' ],
+    [ '`a', 'fencepost before a' ],
+    [ '{a', 'fencepost after z' ],
+    [ '-a', 'fencepost before .' ],
+    [ ':a', 'fencepost after 9' ],
+   );
+
+my @good_salts = qw(aa zz AA ZZ .. 99);
+
+plan tests => 2 * @bad_salts + 1 + @good_salts;
+
+for my $bad_salt (@bad_salts) {
+    my ($salt, $what) = @$bad_salt;
+    $! = 0;
+    is(crypt("abc", $salt), undef, "bad salt ($what)");
+    is(0+$!, &Errno::EINVAL, "check errno ($what)");
+}
+
+is(crypt("abcdef", "ab"), "abDMWw5NL.afs", "sanity check result");
+
+# just to check we're not rejecting any good salts
+for my $good_salt (@good_salts) {
+    isnt(crypt("abcdef", $good_salt), undef, "good salt $good_salt");
+}
diff --git a/toke.c b/toke.c
index dd9d326..8dfc128 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -1690,7 +1690,7 @@ S_incline(pTHX_ const char *s)
     }
     else {
        t = s;
-       while (!isSPACE(*t))
+       while (*t && !isSPACE(*t))
            t++;
        e = t;
     }
@@ -6149,11 +6149,18 @@ Perl_yylex(pTHX)
        TOKEN('$');
 
     case '@':
-       if (PL_expect == XOPERATOR)
-           no_op("Array", s);
-       else if (PL_expect == XPOSTDEREF) POSTDEREF('@');
+        if (PL_expect == XPOSTDEREF)
+            POSTDEREF('@');
        PL_tokenbuf[0] = '@';
        s = scan_ident(s, PL_tokenbuf + 1, sizeof PL_tokenbuf - 1, FALSE);
+       if (PL_expect == XOPERATOR) {
+            d = s;
+            if (PL_bufptr > s) {
+                d = PL_bufptr-1;
+                PL_bufptr = PL_oldbufptr;
+            }
+           no_op("Array", d);
+        }
        pl_yylval.ival = 0;
        if (!PL_tokenbuf[1]) {
            PREREF('@');
@@ -9323,9 +9330,10 @@ S_scan_heredoc(pTHX_ char *s)
                goto streaming;
            }
          }
-       else {  /* eval */
+       else {  /* eval or we've already hit EOF */
            s = (char*)memchr((void*)s, '\n', PL_bufend - s);
-           assert(s);
+           if (!s)
+                goto interminable;
        }
        linestr = shared->ls_linestr;
        bufend = SvEND(linestr);
@@ -9379,12 +9387,14 @@ S_scan_heredoc(pTHX_ char *s)
     else
     {
       SV *linestr_save;
+      char *oldbufptr_save;
      streaming:
       sv_setpvs(tmpstr,"");   /* avoid "uninitialized" warning */
       term = PL_tokenbuf[1];
       len--;
       linestr_save = PL_linestr; /* must restore this afterwards */
       d = s;                    /* and this */
+      oldbufptr_save = PL_oldbufptr;
       PL_linestr = newSVpvs("");
       PL_bufend = SvPVX(PL_linestr);
       while (1) {
@@ -9401,6 +9411,7 @@ S_scan_heredoc(pTHX_ char *s)
               restore PL_linestr. */
            SvREFCNT_dec_NN(PL_linestr);
            PL_linestr = linestr_save;
+            PL_oldbufptr = oldbufptr_save;
            goto interminable;
        }
        CopLINE_set(PL_curcop, origline);
@@ -9435,6 +9446,7 @@ S_scan_heredoc(pTHX_ char *s)
            PL_linestr = linestr_save;
            PL_linestart = SvPVX(linestr_save);
            PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
+            PL_oldbufptr = oldbufptr_save;
            s = d;
            break;
        }
@@ -10035,6 +10047,7 @@ Perl_scan_num(pTHX_ const char *start, YYSTYPE* lvalp)
      * multiple fp operations. */
     bool hexfp = FALSE;
     int total_bits = 0;
+    int significant_bits = 0;
 #if NVSIZE == 8 && defined(HAS_QUAD) && defined(Uquad_t)
 #  define HEXFP_UQUAD
     Uquad_t hexfp_uquad = 0;
@@ -10045,6 +10058,7 @@ Perl_scan_num(pTHX_ const char *start, YYSTYPE* lvalp)
 #endif
     NV hexfp_mult = 1.0;
     UV high_non_zero = 0; /* highest digit */
+    int non_zero_integer_digits = 0;
 
     PERL_ARGS_ASSERT_SCAN_NUM;
 
@@ -10197,6 +10211,9 @@ Perl_scan_num(pTHX_ const char *start, YYSTYPE* lvalp)
                     if (high_non_zero == 0 && b > 0)
                         high_non_zero = b;
 
+                    if (high_non_zero)
+                        non_zero_integer_digits++;
+
                     /* this could be hexfp, but peek ahead
                      * to avoid matching ".." */
                     if (UNLIKELY(HEXFP_PEEK(s))) {
@@ -10223,68 +10240,103 @@ Perl_scan_num(pTHX_ const char *start, YYSTYPE* lvalp)
                  * detection will shortly be more thorough with the
                  * underbar checks. */
                 const char* h = s;
+                significant_bits = non_zero_integer_digits * shift;
 #ifdef HEXFP_UQUAD
                 hexfp_uquad = u;
 #else /* HEXFP_NV */
                 hexfp_nv = u;
 #endif
+                /* Ignore the leading zero bits of
+                 * the high (first) non-zero digit. */
+                if (high_non_zero) {
+                    if (high_non_zero < 0x8)
+                        significant_bits--;
+                    if (high_non_zero < 0x4)
+                        significant_bits--;
+                    if (high_non_zero < 0x2)
+                        significant_bits--;
+                }
+
                 if (*h == '.') {
 #ifdef HEXFP_NV
-                    NV mult = 1 / 16.0;
+                    NV nv_mult = 1.0;
 #endif
+                    bool accumulate = TRUE;
                     for (h++; (isXDIGIT(*h) || *h == '_'); h++) {
                         if (isXDIGIT(*h)) {
                             U8 b = XDIGIT_VALUE(*h);
-                            total_bits += shift;
-                            if (total_bits < NV_MANT_DIG) {
+                            significant_bits += shift;
 #ifdef HEXFP_UQUAD
-                                hexfp_uquad <<= shift;
-                                hexfp_uquad |= b;
-                                hexfp_frac_bits += shift;
-#else /* HEXFP_NV */
-                                hexfp_nv += b * mult;
-                                mult /= 16.0;
-#endif
-                            } else if (total_bits - shift < NV_MANT_DIG) {
-                                /* A hexdigit straddling the edge of
-                                 * mantissa.  We can try grabbing as
-                                 * many as possible bits. */
-                                int shift2 = 0;
-                                if (b & 1) {
-                                    shift2 = 4;
-                                } else if (b & 2) {
-                                    shift2 = 3;
-                                    total_bits--;
-                                } else if (b & 4) {
-                                    shift2 = 2;
-                                    total_bits -= 2;
-                                } else if (b & 8) {
-                                    shift2 = 1;
-                                    total_bits -= 3;
+                            if (accumulate) {
+                                if (significant_bits < NV_MANT_DIG) {
+                                    /* We are in the long "run" of xdigits,
+                                     * accumulate the full four bits. */
+                                    hexfp_uquad <<= shift;
+                                    hexfp_uquad |= b;
+                                    hexfp_frac_bits += shift;
+                                } else {
+                                    /* We are at a hexdigit either at,
+                                     * or straddling, the edge of mantissa.
+                                     * We will try grabbing as many as
+                                     * possible bits. */
+                                    int tail =
+                                      significant_bits - NV_MANT_DIG;
+                                    if (tail <= 0)
+                                       tail += shift;
+                                    hexfp_uquad <<= tail;
+                                    hexfp_uquad |= b >> (shift - tail);
+                                    hexfp_frac_bits += tail;
+
+                                    /* Ignore the trailing zero bits
+                                     * of the last non-zero xdigit.
+                                     *
+                                     * The assumption here is that if
+                                     * one has input of e.g. the xdigit
+                                     * eight (0x8), there is only one
+                                     * bit being input, not the full
+                                     * four bits.  Conversely, if one
+                                     * specifies a zero xdigit, the
+                                     * assumption is that one really
+                                     * wants all those bits to be zero. */
+                                    if (b) {
+                                        if ((b & 0x1) == 0x0) {
+                                            significant_bits--;
+                                            if ((b & 0x2) == 0x0) {
+                                                significant_bits--;
+                                                if ((b & 0x4) == 0x0) {
+                                                    significant_bits--;
+                                                }
+                                            }
+                                        }
+                                    }
+
+                                    accumulate = FALSE;
                                 }
-#ifdef HEXFP_UQUAD
-                                hexfp_uquad <<= shift2;
-                                hexfp_uquad |= b;
-                                hexfp_frac_bits += shift2;
+                            } else {
+                                /* Keep skipping the xdigits, and
+                                 * accumulating the significant bits,
+                                 * but do not shift the uquad
+                                 * (which would catastrophically drop
+                                 * high-order bits) or accumulate the
+                                 * xdigits anymore. */
+                            }
 #else /* HEXFP_NV */
-                                hexfp_nv += b * mult;
-                                mult /= 16.0;
-#endif
+                            if (accumulate) {
+                                nv_mult /= 16.0;
+                                if (nv_mult > 0.0)
+                                    hexfp_nv += b * nv_mult;
+                                else
+                                    accumulate = FALSE;
                             }
+#endif
                         }
+                        if (significant_bits >= NV_MANT_DIG)
+                            accumulate = FALSE;
                     }
                 }
 
-                if (total_bits >= 4) {
-                    if (high_non_zero < 0x8)
-                        total_bits--;
-                    if (high_non_zero < 0x4)
-                        total_bits--;
-                    if (high_non_zero < 0x2)
-                        total_bits--;
-                }
-
-                if (total_bits > 0 && (isALPHA_FOLD_EQ(*h, 'p'))) {
+                if ((total_bits > 0 || significant_bits > 0) &&
+                    isALPHA_FOLD_EQ(*h, 'p')) {
                     bool negexp = FALSE;
                     h++;
                     if (*h == '+')
@@ -10524,7 +10576,7 @@ Perl_scan_num(pTHX_ const char *start, YYSTYPE* lvalp)
            *d = '\0';
             if (UNLIKELY(hexfp)) {
 #  ifdef NV_MANT_DIG
-                if (total_bits > NV_MANT_DIG)
+                if (significant_bits > NV_MANT_DIG)
                     Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
                                    "Hexadecimal float: mantissa overflow");
 #  endif
index 1c132a3..f4f57dc 100644 (file)
--- a/uconfig.h
+++ b/uconfig.h
  *     LONG_DOUBLE_IS_IEEE_754_128_BIT_BIG_ENDIAN
  *     LONG_DOUBLE_IS_X86_80_BIT_LITTLE_ENDIAN
  *     LONG_DOUBLE_IS_X86_80_BIT_BIG_ENDIAN
- *     LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LITTLE_ENDIAN
- *     LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BIG_ENDIAN
+ *     LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LE_LE
+ *     LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BE_BE
+ *     LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LE_BE
+ *     LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BE_LE
  *     LONG_DOUBLE_IS_UNKNOWN_FORMAT
  *     It is only defined if the system supports long doubles.
  */
 #define LONG_DOUBLE_IS_IEEE_754_128_BIT_BIG_ENDIAN     2
 #define LONG_DOUBLE_IS_X86_80_BIT_LITTLE_ENDIAN                3
 #define LONG_DOUBLE_IS_X86_80_BIT_BIG_ENDIAN           4
-#define LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LITTLE_ENDIAN      5
-#define LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BIG_ENDIAN 6
+#define LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LE_LE      5
+#define LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BE_BE      6
+#define LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LE_BE      7
+#define LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BE_LE      8
 #define LONG_DOUBLE_IS_UNKNOWN_FORMAT                  -1
+/* Backward compat. */
+#define LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LITTLE_ENDIAN      LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LE_LE
+#define LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BIG_ENDIAN LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BE_BE
 #endif
 
 /* HAS_LONG_LONG:
 #endif
 
 /* Generated from:
- * 496e563499c7b715275d61ae663d25dd20d963c75f9d3ee7850dae949df14136 config_h.SH
+ * 02c4c9c3e2a7fb7b5c1d2fd7e34acd5c6706d5fd7c40544a1e714355c2f2b264 config_h.SH
  * 45fb46f69ab3d7fd8ea14fc29d490d044cbdd81e8a0111bc0b37aff4321d6182 uconfig.sh
  * ex: set ro: */
diff --git a/util.c b/util.c
index 990c083..457b013 100644 (file)
--- a/util.c
+++ b/util.c
@@ -2110,7 +2110,7 @@ Perl_my_setenv(pTHX_ const char *nam, const char *val)
        Configure doesn't test for that yet.  For Solaris, setenv() and unsetenv()
        were introduced in Solaris 9, so testing for HAS UNSETENV is sufficient.
     */
-#   if defined(__CYGWIN__)|| defined(__SYMBIAN32__) || defined(__riscos__) || (defined(__sun) && defined(HAS_UNSETENV))
+#   if defined(__CYGWIN__)|| defined(__SYMBIAN32__) || defined(__riscos__) || (defined(__sun) && defined(HAS_UNSETENV)) || defined(PERL_DARWIN)
 #       if defined(HAS_UNSETENV)
         if (val == NULL) {
             (void)unsetenv(nam);
@@ -4884,6 +4884,8 @@ Perl_mem_log_alloc(const UV n, const UV typesize, const char *type_name,
                   const char *filename, const int linenumber,
                   const char *funcname)
 {
+    PERL_ARGS_ASSERT_MEM_LOG_ALLOC;
+
     mem_log_common_if(MLT_ALLOC, n, typesize, type_name,
                      NULL, NULL, newalloc,
                      filename, linenumber, funcname);
@@ -4896,6 +4898,8 @@ Perl_mem_log_realloc(const UV n, const UV typesize, const char *type_name,
                     const char *filename, const int linenumber, 
                     const char *funcname)
 {
+    PERL_ARGS_ASSERT_MEM_LOG_REALLOC;
+
     mem_log_common_if(MLT_REALLOC, n, typesize, type_name,
                      NULL, oldalloc, newalloc, 
                      filename, linenumber, funcname);
@@ -4907,6 +4911,8 @@ Perl_mem_log_free(Malloc_t oldalloc,
                  const char *filename, const int linenumber, 
                  const char *funcname)
 {
+    PERL_ARGS_ASSERT_MEM_LOG_FREE;
+
     mem_log_common_if(MLT_FREE, 0, 0, "", NULL, oldalloc, NULL, 
                      filename, linenumber, funcname);
     return oldalloc;
@@ -6050,7 +6056,7 @@ static const char* atos_parse(const char* p,
     *source_name_size = source_name_end - p;
     if (grok_atoUV(source_number_start, &uv,  &source_line_end)
         && source_line_end == close_paren
-        && uv <= MAX_STRLEN
+        && uv <= PERL_INT_MAX
     ) {
         *source_line = (STRLEN)uv;
         return p;
@@ -6117,14 +6123,14 @@ static void atos_symbolize(atos_context* ctx,
             char out[1024];
             UV cnt = fread(out, 1, sizeof(out), fp);
             if (cnt < sizeof(out)) {
-                const char* p = atos_parse(out + cnt, out,
+                const char* p = atos_parse(out + cnt - 1, out,
                                            source_name_size,
                                            source_line);
                 if (p) {
                     Newx(*source_name,
-                         *source_name_size + 1, char);
+                         *source_name_size, char);
                     Copy(p, *source_name,
-                         *source_name_size + 1,  char);
+                         *source_name_size,  char);
                 }
             }
             pclose(fp);
@@ -6249,14 +6255,15 @@ Perl_get_c_backtrace(pTHX_ int depth, int skip)
         for (i = skip; i < try_depth; i++) {
             Dl_info* dl_info = &dl_infos[i];
 
-            total_bytes += sizeof(Perl_c_backtrace_frame);
-
+            object_name_sizes[i] = 0;
             source_names[i] = NULL;
             source_name_sizes[i] = 0;
             source_lines[i] = 0;
 
             /* Yes, zero from dladdr() is failure. */
             if (dladdr(raw_frames[i], dl_info)) {
+                total_bytes += sizeof(Perl_c_backtrace_frame);
+
                 object_name_sizes[i] =
                     dl_info->dli_fname ? strlen(dl_info->dli_fname) : 0;
                 symbol_name_sizes[i] =
index 9c0cb06..8b04f67 100644 (file)
@@ -307,7 +307,7 @@ utils : $(utils1) $(utils2) $(utils3) $(utils4) $(utils5)
 extra.pods : miniperl
        @ @extra_pods.com
 
-PERLDELTA_CURRENT = [.pod]perl5221delta.pod
+PERLDELTA_CURRENT = [.pod]perl5222delta.pod
 
 $(PERLDELTA_CURRENT) : [.pod]perldelta.pod
        Copy/NoConfirm/Log $(MMS$SOURCE) $(PERLDELTA_CURRENT)
index 953d8b8..b6c6d12 100644 (file)
--- a/vms/vms.c
+++ b/vms/vms.c
@@ -1337,7 +1337,9 @@ prime_env_iter(void)
     if (!str$case_blind_compare(env_tables[i],&crtlenv)) {
       char *start;
       int j;
-      for (j = 0; environ[j]; j++) { 
+      /* Start at the end, so if there is a duplicate we keep the first one. */
+      for (j = 0; environ[j]; j++);
+      for (j--; j >= 0; j--) {
         if (!(start = strchr(environ[j],'='))) {
           if (ckWARN(WARN_INTERNAL)) 
             Perl_warner(aTHX_ packWARN(WARN_INTERNAL),"Ill-formed CRTL environ value \"%s\"\n",environ[j]);
index 7606104..a192cf0 100644 (file)
@@ -38,7 +38,7 @@ INST_TOP      = $(INST_DRV)\perl
 # versioned installation can be obtained by setting INST_TOP above to a
 # path that includes an arbitrary version string.
 #
-#INST_VER      = \5.22.1
+#INST_VER      = \5.22.2
 
 #
 # Comment this out if you DON'T want your perl installation to have
@@ -1176,7 +1176,7 @@ utils: $(PERLEXE) ..\utils\Makefile
        copy ..\README.tw       ..\pod\perltw.pod
        copy ..\README.vos      ..\pod\perlvos.pod
        copy ..\README.win32    ..\pod\perlwin32.pod
-       copy ..\pod\perldelta.pod ..\pod\perl5221delta.pod
+       copy ..\pod\perldelta.pod ..\pod\perl5222delta.pod
        cd ..\win32
        $(PERLEXE) $(PL2BAT) $(UTILS)
        $(MINIPERL) -I..\lib ..\autodoc.pl ..
@@ -1272,7 +1272,7 @@ distclean: realclean
        -if exist $(LIBDIR)\Win32API rmdir /s /q $(LIBDIR)\Win32API
        -if exist $(LIBDIR)\XS rmdir /s /q $(LIBDIR)\XS
        -cd $(PODDIR) && del /f *.html *.bat roffitall \
-           perl5221delta.pod perlaix.pod perlamiga.pod perlandroid.pod \
+           perl5222delta.pod perlaix.pod perlamiga.pod perlandroid.pod \
            perlapi.pod perlbs2000.pod perlce.pod perlcn.pod perlcygwin.pod \
            perldos.pod perlfreebsd.pod perlhaiku.pod perlhpux.pod \
            perlhurd.pod perlintern.pod perlirix.pod perljp.pod perlko.pod \
index 40ce6c7..796eec9 100644 (file)
  *     LONG_DOUBLE_IS_IEEE_754_128_BIT_BIG_ENDIAN
  *     LONG_DOUBLE_IS_X86_80_BIT_LITTLE_ENDIAN
  *     LONG_DOUBLE_IS_X86_80_BIT_BIG_ENDIAN
- *     LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LITTLE_ENDIAN
- *     LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BIG_ENDIAN
+ *     LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LE_LE
+ *     LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BE_BE
+ *     LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LE_BE
+ *     LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BE_LE
  *     LONG_DOUBLE_IS_UNKNOWN_FORMAT
  *     It is only defined if the system supports long doubles.
  */
 #define LONG_DOUBLE_IS_IEEE_754_128_BIT_BIG_ENDIAN     2
 #define LONG_DOUBLE_IS_X86_80_BIT_LITTLE_ENDIAN                3
 #define LONG_DOUBLE_IS_X86_80_BIT_BIG_ENDIAN           4
-#define LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LITTLE_ENDIAN      5
-#define LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BIG_ENDIAN 6
+#define LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LE_LE      5
+#define LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BE_BE      6
+#define LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LE_BE      7
+#define LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BE_LE      8
 #define LONG_DOUBLE_IS_UNKNOWN_FORMAT                  -1
 #endif
 
index 1253e75..2a839ef 100644 (file)
  *     LONG_DOUBLE_IS_IEEE_754_128_BIT_BIG_ENDIAN
  *     LONG_DOUBLE_IS_X86_80_BIT_LITTLE_ENDIAN
  *     LONG_DOUBLE_IS_X86_80_BIT_BIG_ENDIAN
- *     LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LITTLE_ENDIAN
- *     LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BIG_ENDIAN
+ *     LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LE_LE
+ *     LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BE_BE
+ *     LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LE_BE
+ *     LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BE_LE
  *     LONG_DOUBLE_IS_UNKNOWN_FORMAT
  *     It is only defined if the system supports long doubles.
  */
 #define LONG_DOUBLE_IS_IEEE_754_128_BIT_BIG_ENDIAN     2
 #define LONG_DOUBLE_IS_X86_80_BIT_LITTLE_ENDIAN                3
 #define LONG_DOUBLE_IS_X86_80_BIT_BIG_ENDIAN           4
-#define LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LITTLE_ENDIAN      5
-#define LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BIG_ENDIAN 6
+#define LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LE_LE      5
+#define LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BE_BE      6
+#define LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_LE_BE      7
+#define LONG_DOUBLE_IS_DOUBLEDOUBLE_128_BIT_BE_LE      8
 #define LONG_DOUBLE_IS_UNKNOWN_FORMAT                  -1
 #endif
 
index fd42d75..4433e68 100644 (file)
@@ -1,6 +1,7 @@
 /* fcrypt.c */
 /* Copyright (C) 1993 Eric Young - see README for more details */
 #include <stdio.h>
+#include <errno.h>
 
 /* Eric Young.
  * This version of crypt has been developed from my MIT compatable
@@ -464,6 +465,14 @@ unsigned const char cov_2char[64]={
 0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A
 };
 
+/* the salt for classic DES crypt (which is all we implement here)
+   permits [./0-9A-Za-z], since '.' and '/' immediately preceed
+   '0' we don't need individual checks for '.' and '/' 
+*/
+#define good_for_salt(c) \
+    ((c) >= '.' && (c) <= '9' || (c) >= 'A' && (c) <= 'Z' ||  \
+     (c) >= 'a' && (c) <= 'z')
+
 char *
 des_fcrypt(const char *buf, const char *salt, char *buff)
        {
@@ -476,6 +485,11 @@ des_fcrypt(const char *buf, const char *salt, char *buff)
        unsigned char *b=bb;
        unsigned char c,u;
 
+        if (!good_for_salt(salt[0]) || !good_for_salt(salt[1])) {
+            errno = EINVAL;
+            return NULL;
+        }
+
        /* eay 25/08/92
         * If you call crypt("pwd","*") as often happens when you
         * have * as the pwd field in /etc/passwd, the function
index f4d7d17..5b83c8b 100644 (file)
@@ -44,7 +44,7 @@ INST_TOP      *= $(INST_DRV)\perl
 # versioned installation can be obtained by setting INST_TOP above to a
 # path that includes an arbitrary version string.
 #
-#INST_VER      *= \5.22.1
+#INST_VER      *= \5.22.2
 
 #
 # Comment this out if you DON'T want your perl installation to have
@@ -1468,7 +1468,7 @@ utils: $(PERLEXE) ..\utils\Makefile
        copy ..\README.tw       ..\pod\perltw.pod
        copy ..\README.vos      ..\pod\perlvos.pod
        copy ..\README.win32    ..\pod\perlwin32.pod
-       copy ..\pod\perldelta.pod ..\pod\perl5221delta.pod
+       copy ..\pod\perldelta.pod ..\pod\perl5222delta.pod
        $(PERLEXE) $(PL2BAT) $(UTILS)
        $(MINIPERL) -I..\lib ..\autodoc.pl ..
        $(MINIPERL) -I..\lib ..\pod\perlmodlib.PL -q ..
@@ -1563,7 +1563,7 @@ distclean: realclean
        -if exist $(LIBDIR)\Win32API rmdir /s /q $(LIBDIR)\Win32API
        -if exist $(LIBDIR)\XS rmdir /s /q $(LIBDIR)\XS
        -cd $(PODDIR) && del /f *.html *.bat roffitall \
-           perl5221delta.pod perlaix.pod perlamiga.pod perlandroid.pod \
+           perl5222delta.pod perlaix.pod perlamiga.pod perlandroid.pod \
            perlapi.pod perlbs2000.pod perlce.pod perlcn.pod perlcygwin.pod \
            perldos.pod perlfreebsd.pod perlhaiku.pod perlhpux.pod \
            perlhurd.pod perlintern.pod perlirix.pod perljp.pod perlko.pod \
index 7e081d6..cef5d1e 100644 (file)
@@ -42,6 +42,7 @@ POD = perl.pod        \
        perl5203delta.pod       \
        perl5220delta.pod       \
        perl5221delta.pod       \
+       perl5222delta.pod       \
        perl561delta.pod        \
        perl56delta.pod \
        perl581delta.pod        \
@@ -178,6 +179,7 @@ MAN = perl.man      \
        perl5203delta.man       \
        perl5220delta.man       \
        perl5221delta.man       \
+       perl5222delta.man       \
        perl561delta.man        \
        perl56delta.man \
        perl581delta.man        \
@@ -314,6 +316,7 @@ HTML = perl.html    \
        perl5203delta.html      \
        perl5220delta.html      \
        perl5221delta.html      \
+       perl5222delta.html      \
        perl561delta.html       \
        perl56delta.html        \
        perl581delta.html       \
@@ -450,6 +453,7 @@ TEX = perl.tex      \
        perl5203delta.tex       \
        perl5220delta.tex       \
        perl5221delta.tex       \
+       perl5222delta.tex       \
        perl561delta.tex        \
        perl56delta.tex \
        perl581delta.tex        \
index 42c306b..b5c6bc6 100644 (file)
@@ -15,6 +15,7 @@
  * and one additional slot for a UNC name
  */
 const int driveCount = ('Z'-'A')+1+1;
+const int driveLetterCount = ('Z'-'A')+1;
 
 class VDir
 {
@@ -383,6 +384,7 @@ char *VDir::MapPathA(const char *pInName)
      * possiblities -- relative path or absolute path with or without drive letter
      * OR UNC name
      */
+    int driveIndex;
     char szBuffer[(MAX_PATH+1)*2];
     char szlBuf[MAX_PATH+1];
     int length = strlen(pInName);
@@ -402,15 +404,18 @@ char *VDir::MapPathA(const char *pInName)
     }
     /* strlen(pInName) is now <= MAX_PATH */
 
-    if (pInName[1] == ':') {
+    if (length > 1 && pInName[1] == ':') {
        /* has drive letter */
-       if (IsPathSep(pInName[2])) {
+       if (length > 2 && IsPathSep(pInName[2])) {
            /* absolute with drive letter */
            DoGetFullPathNameA((char*)pInName, sizeof(szLocalBufferA), szLocalBufferA);
        }
        else {
            /* relative path with drive letter */
-           strcpy(szBuffer, GetDirA(DriveIndex(*pInName)));
+            driveIndex = DriveIndex(*pInName);
+            if (driveIndex < 0 || driveIndex >= driveLetterCount)
+                return (char *)pInName;
+           strcpy(szBuffer, GetDirA(driveIndex));
            strcat(szBuffer, &pInName[2]);
            if(strlen(szBuffer) > MAX_PATH)
                szBuffer[MAX_PATH] = '\0';
@@ -420,7 +425,7 @@ char *VDir::MapPathA(const char *pInName)
     }
     else {
        /* no drive letter */
-       if (IsPathSep(pInName[1]) && IsPathSep(pInName[0])) {
+       if (length > 1 && IsPathSep(pInName[1]) && IsPathSep(pInName[0])) {
            /* UNC name */
            DoGetFullPathNameA((char*)pInName, sizeof(szLocalBufferA), szLocalBufferA);
        }
@@ -611,6 +616,7 @@ WCHAR* VDir::MapPathW(const WCHAR *pInName)
      * possiblities -- relative path or absolute path with or without drive letter
      * OR UNC name
      */
+    int driveIndex;
     WCHAR szBuffer[(MAX_PATH+1)*2];
     WCHAR szlBuf[MAX_PATH+1];
     int length = wcslen(pInName);
@@ -630,7 +636,7 @@ WCHAR* VDir::MapPathW(const WCHAR *pInName)
     }
     /* strlen(pInName) is now <= MAX_PATH */
 
-    if (pInName[1] == ':') {
+    if (length > 1 && pInName[1] == ':') {
        /* has drive letter */
        if (IsPathSep(pInName[2])) {
            /* absolute with drive letter */
@@ -638,7 +644,10 @@ WCHAR* VDir::MapPathW(const WCHAR *pInName)
        }
        else {
            /* relative path with drive letter */
-           wcscpy(szBuffer, GetDirW(DriveIndex((char)*pInName)));
+            driveIndex = DriveIndex(*pInName);
+            if (driveIndex < 0 || driveIndex >= driveLetterCount)
+                return (WCHAR *)pInName;
+           wcscpy(szBuffer, GetDirW(driveIndex));
            wcscat(szBuffer, &pInName[2]);
            if(wcslen(szBuffer) > MAX_PATH)
                szBuffer[MAX_PATH] = '\0';
@@ -648,7 +657,7 @@ WCHAR* VDir::MapPathW(const WCHAR *pInName)
     }
     else {
        /* no drive letter */
-       if (IsPathSep(pInName[1]) && IsPathSep(pInName[0])) {
+       if (length > 1 && IsPathSep(pInName[1]) && IsPathSep(pInName[0])) {
            /* UNC name */
            DoGetFullPathNameW((WCHAR*)pInName, (sizeof(szLocalBufferW)/sizeof(WCHAR)), szLocalBufferW);
        }