Commit 91ddedbe authored by Petr Vandrovec's avatar Petr Vandrovec Committed by Linus Torvalds

[PATCH] ncpfs data corruption when using large TCP transfers

ncpfs was forgetting to update iovec's iov_base field whenever partial
transmission occured. This was causing data corruption during large
(60kB) writes.

The code now also passes copy of iovec to the sock_sendmsg, so it does
not rely on network stack updating (or not updating) passed iovec in
case of success (or failure).
parent cd19fd0f
...@@ -205,6 +205,7 @@ static void __ncptcp_try_send(struct ncp_server *server) { ...@@ -205,6 +205,7 @@ static void __ncptcp_try_send(struct ncp_server *server) {
struct ncp_request_reply *rq; struct ncp_request_reply *rq;
struct msghdr msg; struct msghdr msg;
struct iovec* iov; struct iovec* iov;
struct iovec iovc[3];
int result; int result;
rq = server->tx.creq; rq = server->tx.creq;
...@@ -212,10 +213,12 @@ static void __ncptcp_try_send(struct ncp_server *server) { ...@@ -212,10 +213,12 @@ static void __ncptcp_try_send(struct ncp_server *server) {
return; return;
} }
/* sock_sendmsg updates iov pointers for us :-( */
memcpy(iovc, rq->tx_ciov, rq->tx_iovlen * sizeof(iov[0]));
msg.msg_name = NULL; msg.msg_name = NULL;
msg.msg_namelen = 0; msg.msg_namelen = 0;
msg.msg_control = NULL; msg.msg_control = NULL;
msg.msg_iov = rq->tx_ciov; msg.msg_iov = iovc;
msg.msg_iovlen = rq->tx_iovlen; msg.msg_iovlen = rq->tx_iovlen;
msg.msg_flags = MSG_NOSIGNAL | MSG_DONTWAIT; msg.msg_flags = MSG_NOSIGNAL | MSG_DONTWAIT;
result = sock_sendmsg(server->ncp_sock, &msg, rq->tx_totallen); result = sock_sendmsg(server->ncp_sock, &msg, rq->tx_totallen);
...@@ -239,6 +242,7 @@ static void __ncptcp_try_send(struct ncp_server *server) { ...@@ -239,6 +242,7 @@ static void __ncptcp_try_send(struct ncp_server *server) {
iov++; iov++;
rq->tx_iovlen--; rq->tx_iovlen--;
} }
iov->iov_base += result;
iov->iov_len -= result; iov->iov_len -= result;
rq->tx_ciov = iov; rq->tx_ciov = iov;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment