1+ From d6e1d48c83b165c129cb0aa78905f7ca80a1f682 Mon Sep 17 00:00:00 2001
2+ From: Alan Modra <
[email protected] >
3+ Date: Fri, 17 Jun 2022 09:13:38 +0930
4+ Subject: [PATCH] PR29255, memory leak in make_tempdir
5+
6+ PR 29255
7+ * bucomm.c (make_tempdir, make_tempname): Free template on all
8+ failure paths.
9+ ---
10+ binutils/bucomm.c | 20 +++++++++++---------
11+ 1 file changed, 11 insertions(+), 9 deletions(-)
12+
13+ diff --git a/binutils/bucomm.c b/binutils/bucomm.c
14+ index fdc2209df9c..4395cb9f7f5 100644
15+ --- a/binutils/bucomm.c
16+ +++ b/binutils/bucomm.c
17+ @@ -537,8 +537,9 @@ make_tempname (const char *filename, int *ofd)
18+ #else
19+ tmpname = mktemp (tmpname);
20+ if (tmpname == NULL)
21+ - return NULL;
22+ - fd = open (tmpname, O_RDWR | O_CREAT | O_EXCL, 0600);
23+ + fd = -1;
24+ + else
25+ + fd = open (tmpname, O_RDWR | O_CREAT | O_EXCL, 0600);
26+ #endif
27+ if (fd == -1)
28+ {
29+ @@ -556,22 +557,23 @@ char *
30+ make_tempdir (const char *filename)
31+ {
32+ char *tmpname = template_in_dir (filename);
33+ + char *ret;
34+
35+ #ifdef HAVE_MKDTEMP
36+ - return mkdtemp (tmpname);
37+ + ret = mkdtemp (tmpname);
38+ #else
39+ - tmpname = mktemp (tmpname);
40+ - if (tmpname == NULL)
41+ - return NULL;
42+ + ret = mktemp (tmpname);
43+ #if defined (_WIN32) && !defined (__CYGWIN32__)
44+ if (mkdir (tmpname) != 0)
45+ - return NULL;
46+ + ret = NULL;
47+ #else
48+ if (mkdir (tmpname, 0700) != 0)
49+ - return NULL;
50+ + ret = NULL;
51+ #endif
52+ - return tmpname;
53+ #endif
54+ + if (ret == NULL)
55+ + free (tmpname);
56+ + return ret;
57+ }
58+
59+ /* Parse a string into a VMA, with a fatal error if it can't be
60+ - -
61+ 2.43.5
0 commit comments