From 74ed7186f86c70c56b6a2786246f82585cc897c7 Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Mon, 25 Jan 2016 19:10:40 +1100 Subject: [PATCH] Revert "Allow large messages on trusted remote clients" This reverts commit 438b7c5831cdf1a008bdde7a2477511b60f8c275. Broken, needs further review. --- src/connector.c | 36 ++++++++++++++---------------------- 1 file changed, 14 insertions(+), 22 deletions(-) diff --git a/src/connector.c b/src/connector.c index fd673011..d0135854 100644 --- a/src/connector.c +++ b/src/connector.c @@ -55,7 +55,7 @@ struct client_instance { /* Which serverurl is this instance connected to */ int server; - char *buf; + char buf[PAGESIZE]; unsigned long bufofs; /* Are we currently sending a blocked message from this client */ @@ -205,10 +205,6 @@ static client_instance_t *recruit_client(cdata_t *cdata) client = ckzalloc(sizeof(client_instance_t)); } else LOGDEBUG("Connector recycled client instance"); - - client->buf = realloc(client->buf, PAGESIZE); - client->buf[0] = '\0'; - return client; } @@ -461,46 +457,42 @@ static void parse_redirector_share(client_instance_t *client, const json_t *val) static void parse_client_msg(cdata_t *cdata, client_instance_t *client) { ckpool_t *ckp = cdata->ckp; - int buflen, ret, ofs; - char *msg, *eol; + char msg[PAGESIZE], *eol; + int buflen, ret; json_t *val; retry: - ofs = client->bufofs; - if (unlikely(ofs > MAX_MSGSIZE)) { - if (!client->remote) { - LOGNOTICE("Client id %"PRId64" fd %d overloaded buffer without EOL, disconnecting", - client->id, client->fd); - invalidate_client(ckp, cdata, client); - return; - } - client->buf = realloc(client->buf, round_up_page(ofs + MAX_MSGSIZE + 1)); + if (unlikely(client->bufofs > MAX_MSGSIZE)) { + LOGNOTICE("Client id %"PRId64" fd %d overloaded buffer without EOL, disconnecting", + client->id, client->fd); + invalidate_client(ckp, cdata, client); + return; } + buflen = PAGESIZE - client->bufofs; /* This read call is non-blocking since the socket is set to O_NOBLOCK */ - ret = read(client->fd, client->buf + ofs, MAX_MSGSIZE); + ret = read(client->fd, client->buf + client->bufofs, buflen); if (ret < 1) { if (likely(errno == EAGAIN || errno == EWOULDBLOCK || !ret)) return; - LOGINFO("Client id %"PRId64" fd %d disconnected - recv fail with bufofs %d ret %d errno %d %s", - client->id, client->fd, ofs, ret, errno, ret && errno ? strerror(errno) : ""); + LOGINFO("Client id %"PRId64" fd %d disconnected - recv fail with bufofs %lu ret %d errno %d %s", + client->id, client->fd, client->bufofs, ret, errno, ret && errno ? strerror(errno) : ""); invalidate_client(ckp, cdata, client); return; } client->bufofs += ret; reparse: - eol = memchr(client->buf + ofs, '\n', client->bufofs); + eol = memchr(client->buf, '\n', client->bufofs); if (!eol) goto retry; /* Do something useful with this message now */ buflen = eol - client->buf + 1; - if (unlikely(buflen > MAX_MSGSIZE && !client->remote)) { + if (unlikely(buflen > MAX_MSGSIZE)) { LOGNOTICE("Client id %"PRId64" fd %d message oversize, disconnecting", client->id, client->fd); invalidate_client(ckp, cdata, client); return; } - msg = alloca(round_up_page(buflen + 1)); memcpy(msg, client->buf, buflen); msg[buflen] = '\0'; client->bufofs -= buflen;