From edd2ffb1a109bcd69249430172428f2977a91d58 Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Wed, 29 Jun 2011 21:46:43 +0000 Subject: [PATCH] readline/ Avoid free from a signal handler. * Makefile.in (xmalloc.o): Add readline.h. * xmalloc.c: Include readline.h. (xmalloc, xrealloc): Disable them by #if 0. (xfree): Return on RL_STATE_SIGHANDLER, #undef free. * xmalloc.h (xfree, free): New definition. --- readline/ChangeLog.gdb | 9 +++++++++ readline/Makefile.in | 2 +- readline/xmalloc.c | 12 ++++++++++++ readline/xmalloc.h | 6 ++++++ 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/readline/ChangeLog.gdb b/readline/ChangeLog.gdb index 4a09ea5fc40..47629251175 100644 --- a/readline/ChangeLog.gdb +++ b/readline/ChangeLog.gdb @@ -1,3 +1,12 @@ +2011-06-27 Jan Kratochvil + + Avoid free from a signal handler. + * Makefile.in (xmalloc.o): Add readline.h. + * xmalloc.c: Include readline.h. + (xmalloc, xrealloc): Disable them by #if 0. + (xfree): Return on RL_STATE_SIGHANDLER, #undef free. + * xmalloc.h (xfree, free): New definition. + 2011-03-04 Michael Snyder * bind.c (rl_function_dumper): Free allocated memory. diff --git a/readline/Makefile.in b/readline/Makefile.in index 4423b237b48..0f5607b77ad 100644 --- a/readline/Makefile.in +++ b/readline/Makefile.in @@ -417,7 +417,7 @@ vi_mode.o: rldefs.h ${BUILD_DIR}/config.h rlconf.h vi_mode.o: readline.h keymaps.h rltypedefs.h chardefs.h tilde.h vi_mode.o: history.h ansi_stdlib.h rlstdc.h xmalloc.o: ${BUILD_DIR}/config.h -xmalloc.o: ansi_stdlib.h +xmalloc.o: ansi_stdlib.h readline.h bind.o: rlshell.h histfile.o: rlshell.h diff --git a/readline/xmalloc.c b/readline/xmalloc.c index 8985d340d39..2087d3df63b 100644 --- a/readline/xmalloc.c +++ b/readline/xmalloc.c @@ -33,6 +33,7 @@ #endif /* HAVE_STDLIB_H */ #include "xmalloc.h" +#include "readline.h" /* **************************************************************** */ /* */ @@ -40,6 +41,9 @@ /* */ /* **************************************************************** */ +/* xmalloc and xrealloc are provided by GDB. */ +#if 0 + static void memory_error_and_abort (fname) char *fname; @@ -77,12 +81,20 @@ xrealloc (pointer, bytes) return (temp); } +/* xmalloc and xrealloc are provided by GDB. */ +#endif /* 0 */ + /* Use this as the function to call when adding unwind protects so we don't need to know what free() returns. */ void xfree (string) PTR_T string; { + /* Leak a bit. */ + if (RL_ISSTATE(RL_STATE_SIGHANDLER)) + return; + +#undef free if (string) free (string); } diff --git a/readline/xmalloc.h b/readline/xmalloc.h index 9cb08ba21f1..1703920874e 100644 --- a/readline/xmalloc.h +++ b/readline/xmalloc.h @@ -39,6 +39,12 @@ #endif /* !PTR_T */ +/* xmalloc and xrealloc should be also protected from RL_STATE_SIGHANDLER. */ +#define xfree xfree_readline + +/* readline-5.1 backport. */ +#define free xfree + extern PTR_T xmalloc PARAMS((size_t)); extern PTR_T xrealloc PARAMS((void *, size_t)); extern void xfree PARAMS((void *)); -- 2.47.2