X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/f65c46436087a59a6fcfba576d923faf162b0239..41d3adbbfed77605e4a397ce199c5751c35bf94b:/sftp.c diff --git a/sftp.c b/sftp.c index 9ef69c27..9ffd19c9 100644 --- a/sftp.c +++ b/sftp.c @@ -62,7 +62,6 @@ static struct sftp_packet *sftp_pkt_init(int pkt_type) pkt->length = 0; pkt->maxlen = 0; sftp_pkt_addbyte(pkt, (unsigned char) pkt_type); - fxp_error_message = NULL; return pkt; } static void sftp_pkt_addbool(struct sftp_packet *pkt, unsigned char value) @@ -337,12 +336,14 @@ int fxp_init(void) } if (pktin->type != SSH_FXP_VERSION) { fxp_internal_error("did not receive FXP_VERSION"); + sftp_pkt_free(pktin); return 0; } remotever = sftp_pkt_getuint32(pktin); if (remotever > SFTP_PROTO_VERSION) { fxp_internal_error ("remote protocol is more advanced than we support"); + sftp_pkt_free(pktin); return 0; } /* @@ -377,6 +378,7 @@ char *fxp_realpath(char *path) id = sftp_pkt_getuint32(pktin); if (id != 0x123) { fxp_internal_error("request ID mismatch\n"); + sftp_pkt_free(pktin); return NULL; } if (pktin->type == SSH_FXP_NAME) { @@ -387,11 +389,13 @@ char *fxp_realpath(char *path) count = sftp_pkt_getuint32(pktin); if (count != 1) { fxp_internal_error("REALPATH returned name count != 1\n"); + sftp_pkt_free(pktin); return NULL; } sftp_pkt_getstring(pktin, &path, &len); if (!path) { fxp_internal_error("REALPATH returned malformed FXP_NAME\n"); + sftp_pkt_free(pktin); return NULL; } path = mkstr(path, len); @@ -399,6 +403,7 @@ char *fxp_realpath(char *path) return path; } else { fxp_got_status(pktin); + sftp_pkt_free(pktin); return NULL; } } @@ -425,6 +430,7 @@ struct fxp_handle *fxp_open(char *path, int type) id = sftp_pkt_getuint32(pktin); if (id != 0x567) { fxp_internal_error("request ID mismatch\n"); + sftp_pkt_free(pktin); return NULL; } if (pktin->type == SSH_FXP_HANDLE) { @@ -435,6 +441,7 @@ struct fxp_handle *fxp_open(char *path, int type) sftp_pkt_getstring(pktin, &hstring, &len); if (!hstring) { fxp_internal_error("OPEN returned malformed FXP_HANDLE\n"); + sftp_pkt_free(pktin); return NULL; } handle = smalloc(sizeof(struct fxp_handle)); @@ -444,6 +451,7 @@ struct fxp_handle *fxp_open(char *path, int type) return handle; } else { fxp_got_status(pktin); + sftp_pkt_free(pktin); return NULL; } } @@ -468,6 +476,7 @@ struct fxp_handle *fxp_opendir(char *path) id = sftp_pkt_getuint32(pktin); if (id != 0x456) { fxp_internal_error("request ID mismatch\n"); + sftp_pkt_free(pktin); return NULL; } if (pktin->type == SSH_FXP_HANDLE) { @@ -478,6 +487,7 @@ struct fxp_handle *fxp_opendir(char *path) sftp_pkt_getstring(pktin, &hstring, &len); if (!hstring) { fxp_internal_error("OPENDIR returned malformed FXP_HANDLE\n"); + sftp_pkt_free(pktin); return NULL; } handle = smalloc(sizeof(struct fxp_handle)); @@ -487,6 +497,7 @@ struct fxp_handle *fxp_opendir(char *path) return handle; } else { fxp_got_status(pktin); + sftp_pkt_free(pktin); return NULL; } } @@ -512,9 +523,11 @@ void fxp_close(struct fxp_handle *handle) id = sftp_pkt_getuint32(pktin); if (id != 0x789) { fxp_internal_error("request ID mismatch\n"); + sftp_pkt_free(pktin); return; } fxp_got_status(pktin); + sftp_pkt_free(pktin); sfree(handle->hstring); sfree(handle); } @@ -537,9 +550,11 @@ int fxp_mkdir(char *path) id = sftp_pkt_getuint32(pktin); if (id != 0x234) { fxp_internal_error("request ID mismatch\n"); + sftp_pkt_free(pktin); return 0; } id = fxp_got_status(pktin); + sftp_pkt_free(pktin); if (id != 1) { return 0; } @@ -563,9 +578,11 @@ int fxp_rmdir(char *path) id = sftp_pkt_getuint32(pktin); if (id != 0x345) { fxp_internal_error("request ID mismatch\n"); + sftp_pkt_free(pktin); return 0; } id = fxp_got_status(pktin); + sftp_pkt_free(pktin); if (id != 1) { return 0; } @@ -589,9 +606,11 @@ int fxp_remove(char *fname) id = sftp_pkt_getuint32(pktin); if (id != 0x678) { fxp_internal_error("request ID mismatch\n"); + sftp_pkt_free(pktin); return 0; } id = fxp_got_status(pktin); + sftp_pkt_free(pktin); if (id != 1) { return 0; } @@ -616,9 +635,11 @@ int fxp_rename(char *srcfname, char *dstfname) id = sftp_pkt_getuint32(pktin); if (id != 0x678) { fxp_internal_error("request ID mismatch\n"); + sftp_pkt_free(pktin); return 0; } id = fxp_got_status(pktin); + sftp_pkt_free(pktin); if (id != 1) { return 0; } @@ -646,14 +667,17 @@ int fxp_stat(char *fname, struct fxp_attrs *attrs) id = sftp_pkt_getuint32(pktin); if (id != 0x678) { fxp_internal_error("request ID mismatch\n"); + sftp_pkt_free(pktin); return 0; } if (pktin->type == SSH_FXP_ATTRS) { *attrs = sftp_pkt_getattrs(pktin); + sftp_pkt_free(pktin); return 1; } else { fxp_got_status(pktin); + sftp_pkt_free(pktin); return 0; } } @@ -676,14 +700,17 @@ int fxp_fstat(struct fxp_handle *handle, struct fxp_attrs *attrs) id = sftp_pkt_getuint32(pktin); if (id != 0x678) { fxp_internal_error("request ID mismatch\n"); + sftp_pkt_free(pktin); return 0; } if (pktin->type == SSH_FXP_ATTRS) { *attrs = sftp_pkt_getattrs(pktin); + sftp_pkt_free(pktin); return 1; } else { fxp_got_status(pktin); + sftp_pkt_free(pktin); return 0; } } @@ -709,9 +736,11 @@ int fxp_setstat(char *fname, struct fxp_attrs attrs) id = sftp_pkt_getuint32(pktin); if (id != 0x678) { fxp_internal_error("request ID mismatch\n"); + sftp_pkt_free(pktin); return 0; } id = fxp_got_status(pktin); + sftp_pkt_free(pktin); if (id != 1) { return 0; } @@ -736,9 +765,11 @@ int fxp_fsetstat(struct fxp_handle *handle, struct fxp_attrs attrs) id = sftp_pkt_getuint32(pktin); if (id != 0x678) { fxp_internal_error("request ID mismatch\n"); + sftp_pkt_free(pktin); return 0; } id = fxp_got_status(pktin); + sftp_pkt_free(pktin); if (id != 1) { return 0; } @@ -772,6 +803,7 @@ int fxp_read(struct fxp_handle *handle, char *buffer, uint64 offset, id = sftp_pkt_getuint32(pktin); if (id != 0xBCD) { fxp_internal_error("request ID mismatch"); + sftp_pkt_free(pktin); return -1; } if (pktin->type == SSH_FXP_DATA) { @@ -782,14 +814,16 @@ int fxp_read(struct fxp_handle *handle, char *buffer, uint64 offset, if (rlen > len || rlen < 0) { fxp_internal_error("READ returned more bytes than requested"); + sftp_pkt_free(pktin); return -1; } memcpy(buffer, str, rlen); - sfree(pktin); + sftp_pkt_free(pktin); return rlen; } else { fxp_got_status(pktin); + sftp_pkt_free(pktin); return -1; } } @@ -815,6 +849,7 @@ struct fxp_names *fxp_readdir(struct fxp_handle *handle) id = sftp_pkt_getuint32(pktin); if (id != 0xABC) { fxp_internal_error("request ID mismatch\n"); + sftp_pkt_free(pktin); return NULL; } if (pktin->type == SSH_FXP_NAME) { @@ -832,9 +867,11 @@ struct fxp_names *fxp_readdir(struct fxp_handle *handle) ret->names[i].longname = mkstr(str, len); ret->names[i].attrs = sftp_pkt_getattrs(pktin); } + sftp_pkt_free(pktin); return ret; } else { fxp_got_status(pktin); + sftp_pkt_free(pktin); return NULL; } } @@ -864,9 +901,11 @@ int fxp_write(struct fxp_handle *handle, char *buffer, uint64 offset, id = sftp_pkt_getuint32(pktin); if (id != 0xDCB) { fxp_internal_error("request ID mismatch\n"); + sftp_pkt_free(pktin); return 0; } fxp_got_status(pktin); + sftp_pkt_free(pktin); return fxp_errtype == SSH_FX_OK; }