Skip to content

Commit

Permalink
Go through the really awkward dance required to delete the memory
Browse files Browse the repository at this point in the history
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
  • Loading branch information
chandlerc committed Aug 18, 2013
1 parent 19046ec commit d485e7b
Showing 1 changed file with 12 additions and 2 deletions.
14 changes: 12 additions & 2 deletions lib/Support/Unix/Process.inc
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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

Expand Down

0 comments on commit d485e7b

Please sign in to comment.