From 5b05b96ec0cbef6ed10adb1423cdedde09ee868e Mon Sep 17 00:00:00 2001 From: Přemysl Janouch Date: Fri, 30 Dec 2016 08:30:59 +0100 Subject: Backport TERMKEY_FLAG_NOSTART and fix two leaks ...that are notably still present in the original library. --- README.adoc | 2 +- termo.c | 21 ++++++++++----------- termo.h | 4 +++- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/README.adoc b/README.adoc index 136f893..3252c4e 100644 --- a/README.adoc +++ b/README.adoc @@ -39,7 +39,7 @@ statically linked against the library, and hence they can be run as they are: What's Different From the Original termkey? ------------------------------------------- -The main change is throwing away any UTF-8 dependent code, making the library +The main change is throwing out any UTF-8 dependent code, making the library capable of handling all unibyte and multibyte encodings supported by iconv on your system. The characters are still presented as Unicode in the end, however, as the other sensible option is wchar_t and that doesn't really work well, see diff --git a/termo.c b/termo.c index 469af1d..d72a4f5 100644 --- a/termo.c +++ b/termo.c @@ -425,12 +425,12 @@ termo_new (int fd, const char *encoding, int flags) termo_set_flags (tk, flags); const char *term = getenv ("TERM"); - if (termo_init (tk, term, encoding) - && termo_start (tk)) + if (!termo_init (tk, term, encoding)) + free (tk); + else if (!(flags & TERMO_FLAG_NOSTART) && !termo_start (tk)) + termo_free (tk); + else return tk; - - // FIXME: resource leak on termo_start() failure - free (tk); return NULL; } @@ -445,13 +445,12 @@ termo_new_abstract (const char *term, const char *encoding, int flags) termo_set_flags (tk, flags); if (!termo_init (tk, term, encoding)) - { free (tk); - return NULL; - } - - termo_start (tk); - return tk; + else if (!(flags & TERMO_FLAG_NOSTART) && !termo_start (tk)) + termo_free (tk); + else + return tk; + return NULL; } void diff --git a/termo.h b/termo.h index f32d5f8..32eda4f 100644 --- a/termo.h +++ b/termo.h @@ -192,7 +192,9 @@ enum // Allow Ctrl-C to be read as normal, disabling SIGINT TERMO_FLAG_CTRLC = 1 << 6, // Return ERROR on signal (EINTR) rather than retry - TERMO_FLAG_EINTR = 1 << 7 + TERMO_FLAG_EINTR = 1 << 7, + // Do not call termkey_start() in constructor + TERMO_FLAG_NOSTART = 1 << 8 }; enum -- cgit v1.2.3-70-g09d2