mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-06-30 19:12:48 -05:00
Use strbuf to store results in prompts_t.
UBsan pointed out another memcpy from NULL (again with length 0) in
the prompts_t system. When I looked at it, I realised that firstly
prompt_ensure_result_size was an early not-so-good implementation of
sgrowarray_nm that would benefit from being replaced with a call to
the real one, and secondly, the whole system for storing prompt
results should really have been replaced with strbufs with the no-move
option, because that's doing all the same jobs better.
So, now each prompt_t holds a strbuf in place of its previous manually
managed string. prompt_ensure_result_size is gone (the console
prompt-reading functions use strbuf_append, and everything else just
adds to the strbuf in the usual marshal.c way). New functions exist to
retrieve a prompt_t's result, either by reference or copied.
(cherry picked from commit cd6bc14f04
)
This commit is contained in:
18
putty.h
18
putty.h
@ -636,19 +636,7 @@ GLOBAL char *cmdline_session_name;
|
||||
typedef struct {
|
||||
char *prompt;
|
||||
bool echo;
|
||||
/*
|
||||
* 'result' must be a dynamically allocated array of exactly
|
||||
* 'resultsize' chars. The code for actually reading input may
|
||||
* realloc it bigger (and adjust resultsize accordingly) if it has
|
||||
* to. The caller should free it again when finished with it.
|
||||
*
|
||||
* If resultsize==0, then result may be NULL. When setting up a
|
||||
* prompt_t, it's therefore easiest to initialise them this way,
|
||||
* which means all actual allocation is done by the callee. This
|
||||
* is what add_prompt does.
|
||||
*/
|
||||
char *result;
|
||||
size_t resultsize;
|
||||
strbuf *result;
|
||||
} prompt_t;
|
||||
typedef struct {
|
||||
/*
|
||||
@ -682,8 +670,8 @@ typedef struct {
|
||||
prompts_t *new_prompts();
|
||||
void add_prompt(prompts_t *p, char *promptstr, bool echo);
|
||||
void prompt_set_result(prompt_t *pr, const char *newstr);
|
||||
void prompt_ensure_result_size(prompt_t *pr, int len);
|
||||
/* Burn the evidence. (Assumes _all_ strings want free()ing.) */
|
||||
char *prompt_get_result(prompt_t *pr);
|
||||
const char *prompt_get_result_ref(prompt_t *pr);
|
||||
void free_prompts(prompts_t *p);
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user