2022年11月20日(日) 23:07 Ralf Oehler <r...@oehler-privat.de>:
> Bash Version: 5.2
> Patch Level: 2
> Release Status: release
>
> Description:
>         [Detailed description of the problem, suggestion, or
>         complaint.]
>         I want to read an associative array. Like so: y="${aa[$i]}"
>         If aa contains the element queried, then everything works as
>         expected
>         If aa does not contain such an element, the result is the
>         empty string, which is expected, but the query permanently
>         increases the memory consumption of the executing bash,
>         which is not expected. The program below demonstrates this
>         behaviour. When run, the bash process increases its memory
>         indefinitely.

I also noticed a memory leak early this month in testing my new
extglob implementation and was planning to submit a patch later. I now
checked this report and confirmed that this is actually caused by the
same part of the code. Here, I attach my patch
[r0037.parameter_brace_expand_word.memleak.patch], though I haven't
yet carefully tested it because I originally planned to submit it
sometime later.

--
Koichi
From 4183e204ea0f954de42dea6ba2ec0f47a061f7f3 Mon Sep 17 00:00:00 2001
From: Koichi Murase <myoga.mur...@gmail.com>
Date: Thu, 3 Nov 2022 14:01:41 +0900
Subject: [PATCH 1/2] fix memleak in parameter_brace_expand_word

---
 subst.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/subst.c b/subst.c
index 7ec8f8e9..a018b1b1 100644
--- a/subst.c
+++ b/subst.c
@@ -7507,8 +7507,6 @@ expand_arrayref:
                    ? quote_string (temp)
                    : quote_escapes (temp);
          rflags |= W_ARRAYIND;
-         if (estatep)
-           *estatep = es;      /* structure copy */
        }
       /* Note that array[*] and array[@] expanded to a quoted null string by
         returning the W_HASQUOTEDNULL flag to the caller in addition to TEMP. 
*/
@@ -7517,7 +7515,9 @@ expand_arrayref:
       else if (es.subtype == 2 && temp && QUOTED_NULL (temp) && (quoted & 
(Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)))
        rflags |= W_HASQUOTEDNULL;
 
-      if (estatep == 0)
+      if (etastep)
+       *estatep = es;  /* structure copy */
+      else
        flush_eltstate (&es);
     }
 #endif
-- 
2.37.2

Reply via email to