diff options
author | Alan Modra <amodra@gmail.com> | 2022-06-17 09:13:38 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2022-06-17 21:09:06 +0930 |
commit | d6e1d48c83b165c129cb0aa78905f7ca80a1f682 (patch) | |
tree | 9cf022945a33f5a5d958e80eced8b129ebf93b6f | |
parent | 0ebc886149c22aceaf8ed74267821a59ca9d03eb (diff) | |
download | gdb-d6e1d48c83b165c129cb0aa78905f7ca80a1f682.zip gdb-d6e1d48c83b165c129cb0aa78905f7ca80a1f682.tar.gz gdb-d6e1d48c83b165c129cb0aa78905f7ca80a1f682.tar.bz2 |
PR29255, memory leak in make_tempdir
PR 29255
* bucomm.c (make_tempdir, make_tempname): Free template on all
failure paths.
-rw-r--r-- | binutils/bucomm.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/binutils/bucomm.c b/binutils/bucomm.c index fdc2209..4395cb9 100644 --- a/binutils/bucomm.c +++ b/binutils/bucomm.c @@ -537,8 +537,9 @@ make_tempname (const char *filename, int *ofd) #else tmpname = mktemp (tmpname); if (tmpname == NULL) - return NULL; - fd = open (tmpname, O_RDWR | O_CREAT | O_EXCL, 0600); + fd = -1; + else + fd = open (tmpname, O_RDWR | O_CREAT | O_EXCL, 0600); #endif if (fd == -1) { @@ -556,22 +557,23 @@ char * make_tempdir (const char *filename) { char *tmpname = template_in_dir (filename); + char *ret; #ifdef HAVE_MKDTEMP - return mkdtemp (tmpname); + ret = mkdtemp (tmpname); #else - tmpname = mktemp (tmpname); - if (tmpname == NULL) - return NULL; + ret = mktemp (tmpname); #if defined (_WIN32) && !defined (__CYGWIN32__) if (mkdir (tmpname) != 0) - return NULL; + ret = NULL; #else if (mkdir (tmpname, 0700) != 0) - return NULL; + ret = NULL; #endif - return tmpname; #endif + if (ret == NULL) + free (tmpname); + return ret; } /* Parse a string into a VMA, with a fatal error if it can't be |