This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
[PATCH 1 of 2] readline rl_prompt corruption fix
- To: gdb-patches at sourceware dot cygnus dot com
- Subject: [PATCH 1 of 2] readline rl_prompt corruption fix
- From: Jimmy Guo <guo at cup dot hp dot com>
- Date: Fri, 28 Jul 2000 10:16:25 -0700 (PDT)
This is part 1 of 2 patches to fix readline rl_prompt string corruption
problem. This patch is for the readline library that readline will
store a copy of the passed in prompt string. The next patch is for
gdb/event-top.c to plug a mem leak due to this change.
- Jimmy
Fri Jul 28 09:58:55 Jimmy Guo <guo@cup.hp.com>
* readline.c: Initalize globals rl_initialized rl_prompt.
(readline): Use a copy of prompt instead of itself when
assigning to rl_prompt in readline ().
* callback.c (rl_callback_handler_install): Use a copy of
prompt instead of itself when assigning to rl_prompt.
* display.c: Initialize local_prompt and local_prompt_prefix.
Index: readline.c
/usr/local/bin/diff -c -w -L readline.c readline.c@@/main/cygnus/6 readline.c
*** readline.c
--- readline.c Fri Jul 28 09:57:29 2000
***************
*** 119,125 ****
int rl_arg_sign = 1;
/* Non-zero means we have been called at least once before. */
! static int rl_initialized;
/* If non-zero, this program is running in an EMACS buffer. */
static int running_in_emacs;
--- 119,125 ----
int rl_arg_sign = 1;
/* Non-zero means we have been called at least once before. */
! static int rl_initialized = 0;
/* If non-zero, this program is running in an EMACS buffer. */
static int running_in_emacs;
***************
*** 153,159 ****
int readline_echoing_p = 1;
/* Current prompt. */
! char *rl_prompt;
int rl_visible_prompt_length = 0;
/* Set to non-zero by calling application if it has already printed rl_prompt
--- 153,159 ----
int readline_echoing_p = 1;
/* Current prompt. */
! char *rl_prompt = NULL;
int rl_visible_prompt_length = 0;
/* Set to non-zero by calling application if it has already printed rl_prompt
***************
*** 251,257 ****
{
char *value;
! rl_prompt = prompt;
/* If we are at EOF return a NULL string. */
if (rl_pending_input == EOF)
--- 251,259 ----
{
char *value;
! if (rl_prompt)
! free (rl_prompt);
! rl_prompt = prompt ? strdup (prompt) : 0;
/* If we are at EOF return a NULL string. */
if (rl_pending_input == EOF)
***************
*** 260,266 ****
return ((char *)NULL);
}
! rl_visible_prompt_length = rl_expand_prompt (rl_prompt);
rl_initialize ();
(*rl_prep_term_function) (_rl_meta_flag);
--- 262,269 ----
return ((char *)NULL);
}
! rl_visible_prompt_length = (rl_prompt && *rl_prompt) ?
! rl_expand_prompt (rl_prompt) : 0;
rl_initialize ();
(*rl_prep_term_function) (_rl_meta_flag);
Index: callback.c
/usr/local/bin/diff -c -w -L callback.c callback.c@@/main/cygnus/2 callback.c
*** callback.c
--- callback.c Fri Jul 28 09:55:11 2000
***************
*** 81,88 ****
char *prompt;
VFunction *linefunc;
{
! rl_prompt = prompt;
! rl_visible_prompt_length = rl_prompt ? rl_expand_prompt (rl_prompt) : 0;
rl_linefunc = linefunc;
_rl_callback_newline ();
}
--- 81,91 ----
char *prompt;
VFunction *linefunc;
{
! if (rl_prompt)
! free (rl_prompt);
! rl_prompt = prompt ? strdup (prompt) : 0;
! rl_visible_prompt_length = (rl_prompt && *rl_prompt) ?
! rl_expand_prompt (rl_prompt) : 0;
rl_linefunc = linefunc;
_rl_callback_newline ();
}
Index: display.c
/usr/local/bin/diff -c -w -L display.c display.c@@/main/cygnus/7 display.c
*** display.c
--- display.c Fri Jul 28 09:56:05 2000
***************
*** 146,152 ****
/* Default and initial buffer size. Can grow. */
static int line_size = 1024;
! static char *local_prompt, *local_prompt_prefix;
static int visible_length, prefix_length;
/* The number of invisible characters in the line currently being
--- 146,152 ----
/* Default and initial buffer size. Can grow. */
static int line_size = 1024;
! static char *local_prompt = NULL, *local_prompt_prefix = NULL;
static int visible_length, prefix_length;
/* The number of invisible characters in the line currently being