summaryrefslogtreecommitdiff
path: root/lib/Support/Unix
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2013-08-18 01:20:32 +0000
committerChandler Carruth <chandlerc@gmail.com>2013-08-18 01:20:32 +0000
commitd485e7bd7639cd6b39c6113a30fbc3cdc8c41c4c (patch)
treee9fb335916a6a45bf6940cc9e82701ec5cc5c81a /lib/Support/Unix
parent19046ec19c4931f025cd4730eb43e9203ada6bb7 (diff)
downloadllvm-d485e7bd7639cd6b39c6113a30fbc3cdc8c41c4c.tar.gz
llvm-d485e7bd7639cd6b39c6113a30fbc3cdc8c41c4c.tar.bz2
llvm-d485e7bd7639cd6b39c6113a30fbc3cdc8c41c4c.tar.xz
Go through the really awkward dance required to delete the memory
allocated by setupterm. Without this, some folks are seeing leaked memory whenever this routine is called more than once. Thanks to Craig Topper for the report. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@188615 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Support/Unix')
-rw-r--r--lib/Support/Unix/Process.inc14
1 files changed, 12 insertions, 2 deletions
diff --git a/lib/Support/Unix/Process.inc b/lib/Support/Unix/Process.inc
index 538f05f980..8bc8d91eb5 100644
--- a/lib/Support/Unix/Process.inc
+++ b/lib/Support/Unix/Process.inc
@@ -240,10 +240,12 @@ unsigned Process::StandardErrColumns() {
}
#ifdef HAVE_TERMINFO
-// We manually declare these two extern functions because finding the correct
+// We manually declare these extern functions because finding the correct
// headers from various terminfo, curses, or other sources is harder than
// writing their specs down.
extern "C" int setupterm(char *term, int filedes, int *errret);
+extern "C" struct term *set_curterm(struct term *termp);
+extern "C" int del_curterm(struct term *termp);
extern "C" int tigetnum(char *capname);
#endif
@@ -272,7 +274,15 @@ static bool terminalHasColors(int fd) {
//
// The 'tigetnum' routine returns -2 or -1 on errors, and might return 0 if
// the terminfo says that no colors are supported.
- if (tigetnum(const_cast<char *>("colors")) > 0)
+ bool HasColors = tigetnum(const_cast<char *>("colors")) > 0;
+
+ // Now extract the structure allocated by setupterm and free its memory
+ // through a really silly dance.
+ struct term *termp = set_curterm((struct term *)0);
+ (void)del_curterm(termp); // Drop any errors here.
+
+ // Return true if we found a color capabilities for the current terminal.
+ if (HasColors)
return true;
#endif