mirror of
https://github.com/MidnightCommander/mc
synced 2024-12-23 04:46:55 +03:00
* subshell.c (read_subshell_prompt): Remove argument "how", it's
never set to VISIBLY. Adjust all dependencies. Eliminate hack with "clear_now" - it causes invalid memory access and hides the real problem. * util.c (strip_ctrl_codes): Fix possible invalid memory access if the escape sequence ends unexpectedly.
This commit is contained in:
parent
786c75b683
commit
f0dbdeb72e
@ -1,3 +1,12 @@
|
|||||||
|
2002-08-15 Pavel Roskin <proski@gnu.org>
|
||||||
|
|
||||||
|
* subshell.c (read_subshell_prompt): Remove argument "how", it's
|
||||||
|
never set to VISIBLY. Adjust all dependencies. Eliminate hack
|
||||||
|
with "clear_now" - it causes invalid memory access and hides the
|
||||||
|
real problem.
|
||||||
|
* util.c (strip_ctrl_codes): Fix possible invalid memory access
|
||||||
|
if the escape sequence ends unexpectedly.
|
||||||
|
|
||||||
2002-08-14 Pavel Roskin <proski@gnu.org>
|
2002-08-14 Pavel Roskin <proski@gnu.org>
|
||||||
|
|
||||||
* dir.c (do_load_dir): Fix leaking of file descriptors - always
|
* dir.c (do_load_dir): Fix leaking of file descriptors - always
|
||||||
|
@ -1006,7 +1006,7 @@ directory_history_list (WPanel * panel)
|
|||||||
int
|
int
|
||||||
load_prompt (int fd, void *unused)
|
load_prompt (int fd, void *unused)
|
||||||
{
|
{
|
||||||
if (!read_subshell_prompt (QUIETLY))
|
if (!read_subshell_prompt ())
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* Don't actually change the prompt if it's invisible */
|
/* Don't actually change the prompt if it's invisible */
|
||||||
|
@ -610,11 +610,10 @@ int invoke_subshell (const char *command, int how, char **new_dir)
|
|||||||
/* }}} */
|
/* }}} */
|
||||||
/* {{{ read_subshell_prompt */
|
/* {{{ read_subshell_prompt */
|
||||||
|
|
||||||
int read_subshell_prompt (int how)
|
int read_subshell_prompt (void)
|
||||||
{
|
{
|
||||||
/* {{{ Local variables */
|
/* {{{ Local variables */
|
||||||
|
|
||||||
int clear_now = FALSE;
|
|
||||||
static int prompt_size = INITIAL_PROMPT_SIZE;
|
static int prompt_size = INITIAL_PROMPT_SIZE;
|
||||||
int bytes = 0, i, rc = 0;
|
int bytes = 0, i, rc = 0;
|
||||||
struct timeval timeleft = {0, 0};
|
struct timeval timeleft = {0, 0};
|
||||||
@ -650,17 +649,13 @@ int read_subshell_prompt (int how)
|
|||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
bytes = read (subshell_pty, pty_buffer, pty_buffer_size);
|
bytes = read (subshell_pty, pty_buffer, pty_buffer_size);
|
||||||
if (how == VISIBLY)
|
|
||||||
write (STDOUT_FILENO, pty_buffer, bytes);
|
|
||||||
|
|
||||||
/* {{{ Extract the prompt from the shell output */
|
/* {{{ Extract the prompt from the shell output */
|
||||||
|
|
||||||
for (i=0; i<bytes; ++i)
|
for (i=0; i<bytes; ++i)
|
||||||
if (pty_buffer[i] == '\n' || pty_buffer[i] == '\r'){
|
if (pty_buffer[i] == '\n' || pty_buffer[i] == '\r'){
|
||||||
prompt_pos = 0;
|
prompt_pos = 0;
|
||||||
clear_now = FALSE;
|
|
||||||
} else {
|
} else {
|
||||||
clear_now = TRUE;
|
|
||||||
if (!pty_buffer [i])
|
if (!pty_buffer [i])
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -670,9 +665,6 @@ int read_subshell_prompt (int how)
|
|||||||
prompt_size *= 2);
|
prompt_size *= 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Sometimes we get an empty new line and then nothing,
|
|
||||||
* we better just keep the old prompt instead. */
|
|
||||||
if (clear_now)
|
|
||||||
subshell_prompt[prompt_pos] = '\0';
|
subshell_prompt[prompt_pos] = '\0';
|
||||||
|
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
@ -29,7 +29,7 @@ enum {QUIETLY, VISIBLY};
|
|||||||
/* Exported functions */
|
/* Exported functions */
|
||||||
void init_subshell (void);
|
void init_subshell (void);
|
||||||
int invoke_subshell (const char *command, int how, char **new_dir);
|
int invoke_subshell (const char *command, int how, char **new_dir);
|
||||||
int read_subshell_prompt (int how);
|
int read_subshell_prompt (void);
|
||||||
void resize_subshell (void);
|
void resize_subshell (void);
|
||||||
int exit_subshell (void);
|
int exit_subshell (void);
|
||||||
void do_subshell_chdir (const char *directory, int update_prompt, int reset_prompt);
|
void do_subshell_chdir (const char *directory, int update_prompt, int reset_prompt);
|
||||||
|
25
src/util.c
25
src/util.c
@ -789,15 +789,26 @@ char *strip_ctrl_codes (char *s)
|
|||||||
if (!s)
|
if (!s)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
for (w = s, r = s; *r; ++r)
|
for (w = s, r = s; *r; ) {
|
||||||
if (*r != ESC_CHAR){
|
if (*r == ESC_CHAR) {
|
||||||
|
/* Skip the control sequence's arguments */ ;
|
||||||
|
if (*(++r) == '[') {
|
||||||
|
/* strchr() matches trailing binary 0 */
|
||||||
|
while (*(++r) && strchr ("0123456789;?", *r));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Now we are at the last character of the sequence.
|
||||||
|
* Skip it unless it's binary 0.
|
||||||
|
*/
|
||||||
|
if (*r)
|
||||||
|
r++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (is_printable(*r))
|
if (is_printable(*r))
|
||||||
*w++ = *r;
|
*w++ = *r;
|
||||||
} else {
|
++r;
|
||||||
if (*(++r) == '[') {
|
|
||||||
while (strchr ("0123456789;?", *(++r)))
|
|
||||||
/* Skip the control sequence's arguments */ ;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
*w = 0;
|
*w = 0;
|
||||||
return s;
|
return s;
|
||||||
|
Loading…
Reference in New Issue
Block a user