From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12350 invoked by alias); 7 Jan 2018 14:10:01 -0000 Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Workers List List-Post: List-Help: List-Unsubscribe: X-Seq: 42243 Received: (qmail 28604 invoked by uid 1010); 7 Jan 2018 14:10:01 -0000 X-Qmail-Scanner-Diagnostics: from mail-lf0-f51.google.com by f.primenet.com.au (envelope-from , uid 7791) with qmail-scanner-2.11 (clamdscan: 0.99.2/21882. spamassassin: 3.4.1. Clear:RC:0(209.85.215.51):SA:0(-1.9/5.0):. Processed in 4.537762 secs); 07 Jan 2018 14:10:01 -0000 X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_PASS, T_DKIM_INVALID autolearn=ham autolearn_force=no version=3.4.1 X-Envelope-From: mikachu@gmail.com X-Qmail-Scanner-Mime-Attachments: | X-Qmail-Scanner-Zip-Files: | DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id; bh=TXtIqo/R8zt/qEk4dWcaICTbhRwYStpQQWRmwmQdGus=; b=IKAC4cTFq38w3ffTlJj2SNnqW21DolSOu5Mj6EB4/OBg7GveCLrKorZpwCq9CVFpfm e1wyjNgIKeM1/wSH8L1E1dV6ZNy8rhsPMZ2AhN5XwWFqDyPzE0gOoZzrRBqX7s5fI52t 0KMFalSo+6rIzCudFjugbGuGyUvELbERyIoVHPyIHWn+vQNfun4AjkJ45WgbP90oragN gYHh/AoZ95aevuBvS3aQrbG84U5eZj4tEuq/mBf/fiDGHZ/Ul23FWNHPK53VX1r+sQHz A1SqF9BncyuHFGvBSa3mmSgItHsZWCmsKbrsWLJ/tsu/PxBWncd7au7CnLlt48HHTq3I YQVQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id; bh=TXtIqo/R8zt/qEk4dWcaICTbhRwYStpQQWRmwmQdGus=; b=ACIvuDzTWlqMNJkFBvmqE3g0V2WCq+T9VPw4VGfrVZVGBaqP0MCWNqBzpXqeq7dNDY LXtikoxCucGXMD6iEzOJpiu61yKuPUAbHmr1PVKffbziJFO1F+og5tRMMEit6o+uvSSg 7/nCSQsG9APZiE6c3QtWltl/igQbZKvkPxLa0RHV60s1UxhM1vPxktzNpMMDPpqgBZnz uwPa/DRKwBSzpOD3Pbjlh0yX30Ve6btKXLny1ATuab8EfNLeU6WBO8AdUfLsh720f5Kr RvmTDh9cSvZrAsDi702j8/J6zjdNybHvvni6uAQZ4Dzkl1DggNDZdD6GutGTGskOz/1S FATQ== X-Gm-Message-State: AKwxytdzfWqLck6yxiiw6EDohY+KC7/LKXVjY297/aUIcoJwsKfGVpdf zXDtnA6DuAKxQxhUSMsrmksBew== X-Google-Smtp-Source: ACJfBovu8pFOpz5mxvx6rLyXLzdHXil5TJ5cw/9sE1yWVhNAUnsI79V0asRFcsw+AFp3hpwIeL6txA== X-Received: by 10.25.229.137 with SMTP id i9mr4661090lfk.66.1515334191904; Sun, 07 Jan 2018 06:09:51 -0800 (PST) From: Mikael Magnusson To: zsh-workers@zsh.org Subject: PATCH: Free stuff properly in zsh/pcre module Date: Sun, 7 Jan 2018 15:09:39 +0100 Message-Id: <20180107140939.6930-1-mikachu@gmail.com> X-Mailer: git-send-email 2.15.1 Fix a few memleaks of the hints structure, also make sure to free all the allocated stuff when the module is unloaded. --- If you run % zmodload zsh/pcre; pcre_compile hey; repeat 1000000; do pcre_study; done then zsh mem usage goes up by about 100MB each time. Src/Modules/pcre.c | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/Src/Modules/pcre.c b/Src/Modules/pcre.c index 659fd22d59..15ee34bc8f 100644 --- a/Src/Modules/pcre.c +++ b/Src/Modules/pcre.c @@ -88,10 +88,19 @@ bin_pcre_compile(char *nam, char **args, Options ops, UNUSED(int func)) if (zpcre_utf8_enabled()) pcre_opts |= PCRE_UTF8; - pcre_hints = NULL; /* Is this necessary? */ +#ifdef HAVE_PCRE_STUDY + if (pcre_hints) +#ifdef PCRE_CONFIG_JIT + pcre_free_study(pcre_hints); +#else + pcre_free(pcre_hints); +#endif + pcre_hints = NULL; +#endif if (pcre_pattern) pcre_free(pcre_pattern); + pcre_pattern = NULL; target = ztrdup(*args); unmetafy(target, &target_len); @@ -128,6 +137,14 @@ bin_pcre_study(char *nam, UNUSED(char **args), UNUSED(Options ops), UNUSED(int f return 1; } + if (pcre_hints) +#ifdef PCRE_CONFIG_JIT + pcre_free_study(pcre_hints); +#else + pcre_free(pcre_hints); +#endif + pcre_hints = NULL; + pcre_hints = pcre_study(pcre_pattern, 0, &pcre_error); if (pcre_error != NULL) { @@ -528,5 +545,21 @@ cleanup_(Module m) int finish_(UNUSED(Module m)) { +#if defined(HAVE_PCRE_COMPILE) && defined(HAVE_PCRE_EXEC) +#ifdef HAVE_PCRE_STUDY + if (pcre_hints) +#ifdef PCRE_CONFIG_JIT + pcre_free_study(pcre_hints); +#else + pcre_free(pcre_hints); +#endif + pcre_hints = NULL; +#endif + + if (pcre_pattern) + pcre_free(pcre_pattern); + pcre_pattern = NULL; +#endif + return 0; } -- 2.15.1