1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-09 17:38:00 +00:00

Introduce and use strbuf_chomp.

Those chomp operations in wincons.c and uxcons.c looked ugly, and I'm
not totally convinced they couldn't underrun the buffer by 1 byte in
weird circumstances. strbuf_chomp is neater.

(cherry picked from commit 7590d0625b)
This commit is contained in:
Simon Tatham 2020-01-22 22:24:41 +00:00
parent 697cfa5b7f
commit 0021ad352d
5 changed files with 14 additions and 8 deletions

1
misc.h
View File

@ -79,6 +79,7 @@ char *strbuf_to_str(strbuf *buf); /* does free buf, but you must free result */
void strbuf_catf(strbuf *buf, const char *fmt, ...);
void strbuf_catfv(strbuf *buf, const char *fmt, va_list ap);
static inline void strbuf_clear(strbuf *buf) { strbuf_shrink_to(buf, 0); }
bool strbuf_chomp(strbuf *buf, char char_to_remove);
strbuf *strbuf_new_for_agent_query(void);
void strbuf_finalise_agent_query(strbuf *buf);

View File

@ -1095,7 +1095,7 @@ static void scp_sink_coroutine(ScpSink *scp)
/*
* Parse the command.
*/
strbuf_shrink_by(scp->command, 1); /* chomp the newline */
strbuf_chomp(scp->command, '\n');
scp->command_chr = scp->command->len > 0 ? scp->command->s[0] : '\0';
if (scp->command_chr == 'T') {
unsigned long dummy1, dummy2;

View File

@ -592,10 +592,8 @@ int console_get_userpass_input(prompts_t *p)
}
strbuf_shrink_to(pr->result, prev_result_len + ret);
if (pr->result->s[pr->result->len - 1] == '\n') {
strbuf_shrink_by(pr->result, 1);
if (strbuf_chomp(pr->result, '\n'))
break;
}
}
tcsetattr(infd, TCSANOW, &oldmode);

View File

@ -443,6 +443,15 @@ void strbuf_shrink_by(strbuf *buf, size_t amount_to_remove)
buf->s[buf->len] = '\0';
}
bool strbuf_chomp(strbuf *buf, char char_to_remove)
{
if (buf->len > 0 && buf->s[buf->len-1] == char_to_remove) {
strbuf_shrink_by(buf, 1);
return true;
}
return false;
}
static void strbuf_BinarySink_write(
BinarySink *bs, const void *data, size_t len)
{

View File

@ -515,10 +515,8 @@ int console_get_userpass_input(prompts_t *p)
}
strbuf_shrink_to(pr->result, prev_result_len + ret);
if (pr->result->s[pr->result->len - 1] == '\n') {
strbuf_shrink_by(pr->result, 1);
if (pr->result->s[pr->result->len - 1] == '\r')
strbuf_shrink_by(pr->result, 1);
if (strbuf_chomp(pr->result, '\n')) {
strbuf_chomp(pr->result, '\r');
break;
}
}