Use sideband also for challenge response.
[paraslash.git] / command.c
index 5790f11d278f95d4ad09964ab76af5d0ebf9e772..5e13df66bce15a7e759ce1dd85347b9a176a5417 100644 (file)
--- a/command.c
+++ b/command.c
@@ -934,22 +934,28 @@ __noreturn void handle_connect(int fd, const char *peername)
        PARA_DEBUG_LOG("sending %u byte challenge + rc4 keys (%zu bytes)\n",
                CHALLENGE_SIZE, numbytes);
        if (cc->use_sideband) {
+               struct iovec iov;
                ret = send_sb(&cc->scc, buf, numbytes, SBD_CHALLENGE, false);
                buf = NULL;
                if (ret < 0)
                        goto net_err;
-               buf = para_malloc(HANDSHAKE_BUFSIZE);
+               ret = recv_sb(&cc->scc, SBD_CHALLENGE_RESPONSE,
+                       HANDSHAKE_BUFSIZE, &iov);
+               if (ret < 0)
+                       goto net_err;
+               buf = iov.iov_base;
+               numbytes = iov.iov_len;
        } else {
                ret = write_all(fd, buf, numbytes);
                if (ret < 0)
                        goto net_err;
+               /* recv challenge response */
+               ret = recv_bin_buffer(fd, buf, HASH_SIZE);
+               if (ret < 0)
+                       goto net_err;
+               numbytes = ret;
        }
-       /* recv challenge response */
-       ret = recv_bin_buffer(fd, buf, HASH_SIZE);
-       if (ret < 0)
-               goto net_err;
-       numbytes = ret;
-       PARA_DEBUG_LOG("received %d bytes challenge response\n", ret);
+       PARA_DEBUG_LOG("received %zu bytes challenge response\n", numbytes);
        ret = -E_BAD_USER;
        if (!cc->u)
                goto net_err;