diff options
author | Damien Miller <djm@cvs.openbsd.org> | 2021-08-07 00:14:18 +0000 |
---|---|---|
committer | Damien Miller <djm@cvs.openbsd.org> | 2021-08-07 00:14:18 +0000 |
commit | 933cc4d3a882fd4e17342c39df42a42089a76343 (patch) | |
tree | c617e08c17f2f08622dcc9723c109c118707828c | |
parent | acdcf31cdd76553d7ee8dd25282815738b279ab6 (diff) |
do_upload() used a near-identical structure for tracking
expected status replies from the server to what do_download()
was using.
Refactor it to use the same structure and factor out some common
code into helper functions.
-rw-r--r-- | usr.bin/ssh/sftp-client.c | 81 |
1 files changed, 39 insertions, 42 deletions
diff --git a/usr.bin/ssh/sftp-client.c b/usr.bin/ssh/sftp-client.c index 8a075aee308..ce132196b9b 100644 --- a/usr.bin/ssh/sftp-client.c +++ b/usr.bin/ssh/sftp-client.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp-client.c,v 1.150 2021/08/07 00:12:09 djm Exp $ */ +/* $OpenBSD: sftp-client.c,v 1.151 2021/08/07 00:14:17 djm Exp $ */ /* * Copyright (c) 2001-2004 Damien Miller <djm@openbsd.org> * @@ -99,6 +99,32 @@ static u_char * get_handle(struct sftp_conn *conn, u_int expected_id, size_t *len, const char *errfmt, ...) __attribute__((format(printf, 4, 5))); +static struct request * +request_enqueue(struct requests *requests, u_int id, size_t len, + uint64_t offset) +{ + struct request *req; + + req = xcalloc(1, sizeof(*req)); + req->id = id; + req->len = len; + req->offset = offset; + TAILQ_INSERT_TAIL(requests, req, tq); + return req; +} + +static struct request * +request_find(struct requests *requests, u_int id) +{ + struct request *req; + + for (req = TAILQ_FIRST(requests); + req != NULL && req->id != id; + req = TAILQ_NEXT(req, tq)) + ; + return req; +} + /* ARGSUSED */ static int sftpio(void *_bwlimit, size_t amount) @@ -1432,13 +1458,10 @@ do_download(struct sftp_conn *conn, const char *remote_path, (unsigned long long)offset, (unsigned long long)offset + buflen - 1, num_req, max_req); - req = xcalloc(1, sizeof(*req)); - req->id = conn->msg_id++; - req->len = buflen; - req->offset = offset; + req = request_enqueue(&requests, conn->msg_id++, + buflen, offset); offset += buflen; num_req++; - TAILQ_INSERT_TAIL(&requests, req, tq); send_read_request(conn, req->id, req->offset, req->len, handle, handle_len); } @@ -1451,11 +1474,7 @@ do_download(struct sftp_conn *conn, const char *remote_path, debug3("Received reply T:%u I:%u R:%d", type, id, max_req); /* Find the request in our queue */ - for (req = TAILQ_FIRST(&requests); - req != NULL && req->id != id; - req = TAILQ_NEXT(req, tq)) - ; - if (req == NULL) + if ((req = request_find(&requests, id)) == NULL) fatal("Unexpected reply %u", id); switch (type) { @@ -1736,14 +1755,8 @@ do_upload(struct sftp_conn *conn, const char *local_path, Attrib a, *c = NULL; u_int32_t startid; u_int32_t ackid; - struct outstanding_ack { - u_int id; - u_int len; - off_t offset; - TAILQ_ENTRY(outstanding_ack) tq; - }; - TAILQ_HEAD(ackhead, outstanding_ack) acks; - struct outstanding_ack *ack = NULL; + struct request *ack = NULL; + struct requests acks; size_t handle_len; TAILQ_INIT(&acks); @@ -1832,12 +1845,7 @@ do_upload(struct sftp_conn *conn, const char *local_path, strerror(errno)); if (len != 0) { - ack = xcalloc(1, sizeof(*ack)); - ack->id = ++id; - ack->offset = offset; - ack->len = len; - TAILQ_INSERT_TAIL(&acks, ack, tq); - + ack = request_enqueue(&acks, ++id, len, offset); sshbuf_reset(msg); if ((r = sshbuf_put_u8(msg, SSH2_FXP_WRITE)) != 0 || (r = sshbuf_put_u32(msg, ack->id)) != 0 || @@ -1874,15 +1882,11 @@ do_upload(struct sftp_conn *conn, const char *local_path, debug3("SSH2_FXP_STATUS %u", status); /* Find the request in our queue */ - for (ack = TAILQ_FIRST(&acks); - ack != NULL && ack->id != rid; - ack = TAILQ_NEXT(ack, tq)) - ; - if (ack == NULL) + if ((ack = request_find(&acks, rid)) == NULL) fatal("Can't find request for ID %u", rid); TAILQ_REMOVE(&acks, ack, tq); - debug3("In write loop, ack for %u %u bytes at %lld", - ack->id, ack->len, (long long)ack->offset); + debug3("In write loop, ack for %u %zu bytes at %lld", + ack->id, ack->len, (unsigned long long)ack->offset); ++ackid; progress_counter += ack->len; free(ack); @@ -2197,13 +2201,10 @@ do_crossload(struct sftp_conn *from, struct sftp_conn *to, (unsigned long long)offset, (unsigned long long)offset + buflen - 1, num_req, max_req); - req = xcalloc(1, sizeof(*req)); - req->id = from->msg_id++; - req->len = buflen; - req->offset = offset; + req = request_enqueue(&requests, from->msg_id++, + buflen, offset); offset += buflen; num_req++; - TAILQ_INSERT_TAIL(&requests, req, tq); send_read_request(from, req->id, req->offset, req->len, from_handle, from_handle_len); } @@ -2221,11 +2222,7 @@ do_crossload(struct sftp_conn *from, struct sftp_conn *to, type, id, max_req); /* Find the request in our queue */ - for (req = TAILQ_FIRST(&requests); - req != NULL && req->id != id; - req = TAILQ_NEXT(req, tq)) - ; - if (req == NULL) + if ((req = request_find(&requests, id)) == NULL) fatal("Unexpected reply %u", id); switch (type) { |