summaryrefslogtreecommitdiff
path: root/dev-lang/perl/files
diff options
context:
space:
mode:
authorV3n3RiX <venerix@redcorelinux.org>2019-04-28 09:54:45 +0100
committerV3n3RiX <venerix@redcorelinux.org>2019-04-28 09:54:45 +0100
commitb7ebc951da8800f711142f69d9d958bde67a112d (patch)
treee318514216845acb8f2e49fff7a5cba4027e9d91 /dev-lang/perl/files
parentdc7cbdfa65fd814b3b9aa3c56257da201109e807 (diff)
gentoo resync : 28.04.2019
Diffstat (limited to 'dev-lang/perl/files')
-rw-r--r--dev-lang/perl/files/perl-5.28.0-dirhandle.patch99
1 files changed, 99 insertions, 0 deletions
diff --git a/dev-lang/perl/files/perl-5.28.0-dirhandle.patch b/dev-lang/perl/files/perl-5.28.0-dirhandle.patch
new file mode 100644
index 000000000000..02debe5ac2b6
--- /dev/null
+++ b/dev-lang/perl/files/perl-5.28.0-dirhandle.patch
@@ -0,0 +1,99 @@
+From e0eae03760cafde89463c4d3d238be9a629f7fca Mon Sep 17 00:00:00 2001
+From: Tony Cook <tony@develop-help.com>
+Date: Mon, 2 Jul 2018 10:43:19 +1000
+Subject: [PATCH] (perl #133314) always close the directory handle on clean up
+
+Previously the directory handle was only closed if the rest of the
+magic free clean up is done, but in most success cases that code
+doesn't run, leaking the directory handle.
+
+So always close the directory if our AV is available.
+
+(cherry picked from commit 3d5e9c119db6b727684fe75dfcfe5831c4351bec)
+---
+ doio.c | 56 +++++++++++++++++++++++++++++++-------------------------
+ 1 file changed, 31 insertions(+), 25 deletions(-)
+
+diff --git a/doio.c b/doio.c
+index 4b8923f77c..16daf9fd11 100644
+--- a/doio.c
++++ b/doio.c
+@@ -1163,44 +1163,50 @@ S_argvout_free(pTHX_ SV *io, MAGIC *mg) {
+
+ /* mg_obj can be NULL if a thread is created with the handle open, in which
+ case we leave any clean up to the parent thread */
+- if (mg->mg_obj && IoIFP(io)) {
+- SV **pid_psv;
++ if (mg->mg_obj) {
+ #ifdef ARGV_USE_ATFUNCTIONS
+ SV **dir_psv;
+ DIR *dir;
++
++ dir_psv = av_fetch((AV*)mg->mg_obj, ARGVMG_ORIG_DIRP, FALSE);
++ assert(dir_psv && *dir_psv && SvIOK(*dir_psv));
++ dir = INT2PTR(DIR *, SvIV(*dir_psv));
+ #endif
+- PerlIO *iop = IoIFP(io);
++ if (IoIFP(io)) {
++ SV **pid_psv;
++ PerlIO *iop = IoIFP(io);
+
+- assert(SvTYPE(mg->mg_obj) == SVt_PVAV);
++ assert(SvTYPE(mg->mg_obj) == SVt_PVAV);
+
+- pid_psv = av_fetch((AV*)mg->mg_obj, ARGVMG_ORIG_PID, FALSE);
++ pid_psv = av_fetch((AV*)mg->mg_obj, ARGVMG_ORIG_PID, FALSE);
+
+- assert(pid_psv && *pid_psv);
++ assert(pid_psv && *pid_psv);
+
+- if (SvIV(*pid_psv) == (IV)PerlProc_getpid()) {
+- /* if we get here the file hasn't been closed explicitly by the
+- user and hadn't been closed implicitly by nextargv(), so
+- abandon the edit */
+- SV **temp_psv = av_fetch((AV*)mg->mg_obj, ARGVMG_TEMP_NAME, FALSE);
+- const char *temp_pv = SvPVX(*temp_psv);
++ if (SvIV(*pid_psv) == (IV)PerlProc_getpid()) {
++ /* if we get here the file hasn't been closed explicitly by the
++ user and hadn't been closed implicitly by nextargv(), so
++ abandon the edit */
++ SV **temp_psv = av_fetch((AV*)mg->mg_obj, ARGVMG_TEMP_NAME, FALSE);
++ const char *temp_pv = SvPVX(*temp_psv);
+
+- assert(temp_psv && *temp_psv && SvPOK(*temp_psv));
+- (void)PerlIO_close(iop);
+- IoIFP(io) = IoOFP(io) = NULL;
++ assert(temp_psv && *temp_psv && SvPOK(*temp_psv));
++ (void)PerlIO_close(iop);
++ IoIFP(io) = IoOFP(io) = NULL;
+ #ifdef ARGV_USE_ATFUNCTIONS
+- dir_psv = av_fetch((AV*)mg->mg_obj, ARGVMG_ORIG_DIRP, FALSE);
+- assert(dir_psv && *dir_psv && SvIOK(*dir_psv));
+- dir = INT2PTR(DIR *, SvIV(*dir_psv));
+- if (dir) {
+- if (unlinkat(my_dirfd(dir), temp_pv, 0) < 0 &&
+- NotSupported(errno))
+- (void)UNLINK(temp_pv);
+- closedir(dir);
+- }
++ if (dir) {
++ if (unlinkat(my_dirfd(dir), temp_pv, 0) < 0 &&
++ NotSupported(errno))
++ (void)UNLINK(temp_pv);
++ }
+ #else
+- (void)UNLINK(temp_pv);
++ (void)UNLINK(temp_pv);
+ #endif
++ }
+ }
++#ifdef ARGV_USE_ATFUNCTIONS
++ if (dir)
++ closedir(dir);
++#endif
+ }
+
+ return 0;
+--
+2.21.0
+