This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
fixup Perl_magic_freemglob()
authorDavid Mitchell <davem@iabyn.com>
Mon, 22 Feb 2021 10:00:27 +0000 (10:00 +0000)
committerDavid Mitchell <davem@iabyn.com>
Mon, 22 Feb 2021 10:00:27 +0000 (10:00 +0000)
In v5.33.3-24-g02a48966c3 I added the Perl_magic_freemglob() function,
which allowed special-case handling of the pos() magic type to be
removed from S_mg_free_struct().

However, I got it wrong, by more or less copying the same code from
another such function I had just created. So I made
Perl_magic_freemglob() free mg_ptr(), but in the case of pos magic, this
doesn't point to a buffer which needs freeing. In fact its currently
always NULL so attempting to free it is harmless - but this commit
removes the free() for logical soundness and future robustness.

mg.c

diff --git a/mg.c b/mg.c
index 4461b6d..3f09bb4 100644 (file)
--- a/mg.c
+++ b/mg.c
@@ -2600,11 +2600,10 @@ Perl_magic_freemglob(pTHX_ SV *sv, MAGIC *mg)
     PERL_ARGS_ASSERT_MAGIC_FREEMGLOB;
     PERL_UNUSED_ARG(sv);
 
-    /* glob magic uses mg_len as a string length rather than a buffer
-     * length, so we need to free even with mg_len == 0: hence we can't
-     * rely on standard magic free handling */
+    /* pos() magic uses mg_len as a string position rather than a buffer
+     * length, and mg_ptr is currently unused, so skip freeing.
+     */
     assert(mg->mg_type == PERL_MAGIC_regex_global && mg->mg_len >= -1);
-    Safefree(mg->mg_ptr);
     mg->mg_ptr = NULL;
     return 0;
 }