Mercurial > dropbear
diff netio.c @ 1077:26c1f9b8f82e coverity
merge main
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Tue, 14 Apr 2015 20:44:30 +0800 |
parents | d92597ef089e |
children | b3b772646974 |
line wrap: on
line diff
--- a/netio.c Mon Mar 02 21:17:41 2015 +0800 +++ b/netio.c Tue Apr 14 20:44:30 2015 +0800 @@ -76,7 +76,7 @@ for (r = c->res_iter; r; r = r->ai_next) { - assert(c->sock == -1); + dropbear_assert(c->sock == -1); c->sock = socket(c->res_iter->ai_family, c->res_iter->ai_socktype, c->res_iter->ai_protocol); if (c->sock < 0) { @@ -99,11 +99,16 @@ message.msg_namelen = r->ai_addrlen; if (c->writequeue) { - int iovlen; /* Linux msg_iovlen is a size_t */ - message.msg_iov = packet_queue_to_iovec(c->writequeue, &iovlen); + /* 6 is arbitrary, enough to hold initial packets */ + int iovlen = 6; /* Linux msg_iovlen is a size_t */ + struct iovec iov[6]; + packet_queue_to_iovec(c->writequeue, iov, &iovlen); + message.msg_iov = iov; message.msg_iovlen = iovlen; res = sendmsg(c->sock, &message, MSG_FASTOPEN); if (res < 0 && errno != EINPROGRESS) { + m_free(c->errstring); + c->errstring = m_strdup(strerror(errno)); /* Not entirely sure which kind of errors are normal - 2.6.32 seems to return EPIPE for any (nonblocking?) sendmsg(). just fall back */ TRACE(("sendmsg tcp_fastopen failed, falling back. %s", strerror(errno))); @@ -112,7 +117,6 @@ /* Set to NULL to avoid trying again */ c->writequeue = NULL; } - m_free(message.msg_iov); packet_queue_consume(c->writequeue, res); } #endif @@ -124,6 +128,8 @@ if (res < 0 && errno != EINPROGRESS) { /* failure */ + m_free(c->errstring); + c->errstring = m_strdup(strerror(errno)); close(c->sock); c->sock = -1; continue; @@ -237,7 +243,7 @@ c->sock = -1; m_free(c->errstring); - c->errstring = strerror(val); + c->errstring = m_strdup(strerror(val)); } else { /* New connection has been established */ c->cb(DROPBEAR_SUCCESS, c->sock, c->cb_data, NULL); @@ -254,8 +260,7 @@ c->writequeue = writequeue; } -struct iovec * packet_queue_to_iovec(struct Queue *queue, int *ret_iov_count) { - struct iovec *iov = NULL; +void packet_queue_to_iovec(struct Queue *queue, struct iovec *iov, unsigned int *iov_count) { struct Link *l; unsigned int i; int len; @@ -265,10 +270,9 @@ #define IOV_MAX UIO_MAXIOV #endif - *ret_iov_count = MIN(queue->count, IOV_MAX); + *iov_count = MIN(MIN(queue->count, IOV_MAX), *iov_count); - iov = m_malloc(sizeof(*iov) * *ret_iov_count); - for (l = queue->head, i = 0; l; l = l->link, i++) + for (l = queue->head, i = 0; i < *iov_count; l = l->link, i++) { writebuf = (buffer*)l->item; len = writebuf->len - 1 - writebuf->pos; @@ -278,8 +282,6 @@ iov[i].iov_base = buf_getptr(writebuf, len); iov[i].iov_len = len; } - - return iov; } void packet_queue_consume(struct Queue *queue, ssize_t written) {