client: Simplify rogue redirection and execute protection further

recv_input() passes full lines to save_input().  Pass characters
instead.  Simpler, and doesn't truncate long lines.

Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
This commit is contained in:
Markus Armbruster 2017-06-18 18:57:28 +02:00
parent 5cb14f508e
commit cf7d52fc10
3 changed files with 8 additions and 23 deletions

View file

@ -404,21 +404,13 @@ recv_output(int sock)
static int
recv_input(int fd, struct ring *inbuf)
{
static struct lbuf cmdbuf;
int n, i, ch;
char *line;
int res = 1;
n = ring_from_file(inbuf, fd);
if (n < 0)
return -1;
if (n == 0) {
/* EOF on input */
if (lbuf_len(&cmdbuf)) {
/* incomplete line */
ring_putc(inbuf, '\n');
n++;
}
/*
* Can't put EOF cookie into INBUF here, it may not fit.
* Leave it to caller.
@ -430,11 +422,8 @@ recv_input(int fd, struct ring *inbuf)
for (i = -n; i < 0; i++) {
ch = ring_peek(inbuf, i);
assert(ch != EOF);
if (ch != '\r' && lbuf_putc(&cmdbuf, ch) > 0) {
line = lbuf_line(&cmdbuf);
save_input(line);
lbuf_init(&cmdbuf);
}
if (ch != '\r')
save_input(ch);
if (auxfp)
putc(ch, auxfp);
}

View file

@ -27,7 +27,7 @@
* secure.c: Check redir etc. to protect against tampering deity
*
* Known contributors to this file:
* Markus Armbruster, 2007-2015
* Markus Armbruster, 2007-2017
*/
#include <config.h>
@ -42,18 +42,14 @@
static struct ring recent_input;
/*
* Remember line of input @inp for a while.
* It must end with a newline.
* Remember input @inp for a while.
*/
void
save_input(char *inp)
save_input(char inp)
{
size_t len = strlen(inp);
int eol;
assert(len && inp[len - 1] == '\n');
while (ring_putm(&recent_input, inp, len) < 0) {
while (ring_putc(&recent_input, inp) < 0) {
eol = ring_search(&recent_input, "\n", 0);
assert(eol >= 0);
ring_discard(&recent_input, eol + 1);

View file

@ -27,7 +27,7 @@
* secure.h: Check redir etc. to protect against tampering deity
*
* Known contributors to this file:
* Markus Armbruster, 2007-2009
* Markus Armbruster, 2007-2017
*/
#ifndef SECURE_H
@ -35,7 +35,7 @@
#include <stddef.h>
extern void save_input(char *);
extern void save_input(char);
extern int seen_input(char *);
extern int seen_exec_input(char *);