diff options
author | Přemysl Janouch <p.janouch@gmail.com> | 2016-12-30 08:30:59 +0100 |
---|---|---|
committer | Přemysl Janouch <p.janouch@gmail.com> | 2016-12-30 08:30:59 +0100 |
commit | 5b05b96ec0cbef6ed10adb1423cdedde09ee868e (patch) | |
tree | 69e15ab41f5367d07c2d1cff8d06d1022c7c0d7a | |
parent | a9b41e41b7789924465a7e5596a463ed93d8fc26 (diff) | |
download | termo-5b05b96ec0cbef6ed10adb1423cdedde09ee868e.tar.gz termo-5b05b96ec0cbef6ed10adb1423cdedde09ee868e.tar.xz termo-5b05b96ec0cbef6ed10adb1423cdedde09ee868e.zip |
Backport TERMKEY_FLAG_NOSTART and fix two leaks
...that are notably still present in the original library.
-rw-r--r-- | README.adoc | 2 | ||||
-rw-r--r-- | termo.c | 21 | ||||
-rw-r--r-- | 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 @@ -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 @@ -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 |