mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-07-15 01:57:40 -05:00
Clean up handling of the return value from sftp_find_request. In many
places we simply enforce by assertion that it will match the request we sent out a moment ago: in fact it can also return NULL, so it makes more sense to report a proper error message if it doesn't return the expected value, and while we're at it, have that error message whatever message was helpfully left in fxp_error() by sftp_find_request when it failed. To do this, I've written a centralised function in psftp.c called sftp_wait_for_reply, which is handed a request that's just been sent out and deals with the mechanics of waiting for its reply, returning the reply when it arrives, and aborting with a sensible error if anything else arrives instead. The numerous sites in psftp.c which called sftp_find_request have all been rewritten to do this instead, and as a side effect they now look more sensible. The only other uses of sftp_find_request were in xfer_*load_gotpkt, which had to be tweaked in its own way. While I'm here, also fix memory management in sftp_find_request, which was freeing its input packet on some but not all error return paths. [originally from svn r9894]
This commit is contained in:
5
sftp.c
5
sftp.c
@ -366,7 +366,6 @@ struct sftp_request *sftp_find_request(struct sftp_packet *pktin)
|
||||
|
||||
if (!req || !req->registered) {
|
||||
fxp_internal_error("request ID mismatch\n");
|
||||
sftp_pkt_free(pktin);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -1203,6 +1202,8 @@ int xfer_download_gotpkt(struct fxp_xfer *xfer, struct sftp_packet *pktin)
|
||||
struct req *rr;
|
||||
|
||||
rreq = sftp_find_request(pktin);
|
||||
if (!rreq)
|
||||
return 0; /* this packet doesn't even make sense */
|
||||
rr = (struct req *)fxp_get_userdata(rreq);
|
||||
if (!rr)
|
||||
return 0; /* this packet isn't ours */
|
||||
@ -1383,6 +1384,8 @@ int xfer_upload_gotpkt(struct fxp_xfer *xfer, struct sftp_packet *pktin)
|
||||
int ret;
|
||||
|
||||
rreq = sftp_find_request(pktin);
|
||||
if (!rreq)
|
||||
return 0; /* this packet doesn't even make sense */
|
||||
rr = (struct req *)fxp_get_userdata(rreq);
|
||||
if (!rr)
|
||||
return 0; /* this packet isn't ours */
|
||||
|
Reference in New Issue
Block a user