~mdw
/
sgt
/
putty
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix a mishandling of error returns from makekey() in the SSH-1 private
[sgt/putty]
/
sftp.c
diff --git
a/sftp.c
b/sftp.c
index
793f72a
..
4c05182
100644
(file)
--- a/
sftp.c
+++ b/
sftp.c
@@
-45,6
+45,13
@@
static void sftp_pkt_addbyte(struct sftp_packet *pkt, unsigned char byte)
{
sftp_pkt_adddata(pkt, &byte, 1);
}
{
sftp_pkt_adddata(pkt, &byte, 1);
}
+static void sftp_pkt_adduint32(struct sftp_packet *pkt,
+ unsigned long value)
+{
+ unsigned char x[4];
+ PUT_32BIT(x, value);
+ sftp_pkt_adddata(pkt, x, 4);
+}
static struct sftp_packet *sftp_pkt_init(int pkt_type)
{
struct sftp_packet *pkt;
static struct sftp_packet *sftp_pkt_init(int pkt_type)
{
struct sftp_packet *pkt;
@@
-53,6
+60,7
@@
static struct sftp_packet *sftp_pkt_init(int pkt_type)
pkt->savedpos = -1;
pkt->length = 0;
pkt->maxlen = 0;
pkt->savedpos = -1;
pkt->length = 0;
pkt->maxlen = 0;
+ sftp_pkt_adduint32(pkt, 0); /* length field will be filled in later */
sftp_pkt_addbyte(pkt, (unsigned char) pkt_type);
return pkt;
}
sftp_pkt_addbyte(pkt, (unsigned char) pkt_type);
return pkt;
}
@@
-62,13
+70,6
@@
static void sftp_pkt_addbool(struct sftp_packet *pkt, unsigned char value)
sftp_pkt_adddata(pkt, &value, 1);
}
*/
sftp_pkt_adddata(pkt, &value, 1);
}
*/
-static void sftp_pkt_adduint32(struct sftp_packet *pkt,
- unsigned long value)
-{
- unsigned char x[4];
- PUT_32BIT(x, value);
- sftp_pkt_adddata(pkt, x, 4);
-}
static void sftp_pkt_adduint64(struct sftp_packet *pkt, uint64 value)
{
unsigned char x[8];
static void sftp_pkt_adduint64(struct sftp_packet *pkt, uint64 value)
{
unsigned char x[8];
@@
-215,9
+216,8
@@
static void sftp_pkt_free(struct sftp_packet *pkt)
int sftp_send(struct sftp_packet *pkt)
{
int ret;
int sftp_send(struct sftp_packet *pkt)
{
int ret;
- char x[4];
- PUT_32BIT(x, pkt->length);
- ret = (sftp_senddata(x, 4) && sftp_senddata(pkt->data, pkt->length));
+ PUT_32BIT(pkt->data, pkt->length - 4);
+ ret = sftp_senddata(pkt->data, pkt->length);
sftp_pkt_free(pkt);
return ret;
}
sftp_pkt_free(pkt);
return ret;
}
@@
-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");
if (!req || !req->registered) {
fxp_internal_error("request ID mismatch\n");
- sftp_pkt_free(pktin);
return NULL;
}
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);
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 */
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);
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 */
rr = (struct req *)fxp_get_userdata(rreq);
if (!rr)
return 0; /* this packet isn't ours */