X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/f65c46436087a59a6fcfba576d923faf162b0239..811453cbc32f1f0f14cfef25f54eabf2e3b28bd9:/sftp.c diff --git a/sftp.c b/sftp.c index 9ef69c27..b49e2750 100644 --- a/sftp.c +++ b/sftp.c @@ -40,7 +40,7 @@ static void sftp_pkt_ensure(struct sftp_packet *pkt, int length) { if (pkt->maxlen < length) { pkt->maxlen = length + 256; - pkt->data = srealloc(pkt->data, pkt->maxlen); + pkt->data = sresize(pkt->data, pkt->maxlen, char); } } static void sftp_pkt_adddata(struct sftp_packet *pkt, void *data, int len) @@ -56,13 +56,12 @@ static void sftp_pkt_addbyte(struct sftp_packet *pkt, unsigned char byte) static struct sftp_packet *sftp_pkt_init(int pkt_type) { struct sftp_packet *pkt; - pkt = smalloc(sizeof(struct sftp_packet)); + pkt = snew(struct sftp_packet); pkt->data = NULL; pkt->savedpos = -1; 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) @@ -229,10 +228,10 @@ struct sftp_packet *sftp_recv(void) if (!sftp_recvdata(x, 4)) return NULL; - pkt = smalloc(sizeof(struct sftp_packet)); + pkt = snew(struct sftp_packet); pkt->savedpos = 0; pkt->length = pkt->maxlen = GET_32BIT(x); - pkt->data = smalloc(pkt->length); + pkt->data = snewn(pkt->length, char); if (!sftp_recvdata(pkt->data, pkt->length)) { sftp_pkt_free(pkt); @@ -250,7 +249,7 @@ struct sftp_packet *sftp_recv(void) static char *mkstr(char *s, int len) { - char *p = smalloc(len + 1); + char *p = snewn(len + 1, char); memcpy(p, s, len); p[len] = '\0'; return p; @@ -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,15 +441,17 @@ 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)); + handle = snew(struct fxp_handle); handle->hstring = mkstr(hstring, len); handle->hlen = len; sftp_pkt_free(pktin); 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,15 +487,17 @@ 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)); + handle = snew(struct fxp_handle); handle->hstring = mkstr(hstring, len); handle->hlen = len; sftp_pkt_free(pktin); 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,14 +849,15 @@ 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) { struct fxp_names *ret; int i; - ret = smalloc(sizeof(struct fxp_names)); + ret = snew(struct fxp_names); ret->nnames = sftp_pkt_getuint32(pktin); - ret->names = smalloc(ret->nnames * sizeof(struct fxp_name)); + ret->names = snewn(ret->nnames, struct fxp_name); for (i = 0; i < ret->nnames; i++) { char *str; int len; @@ -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; } @@ -884,3 +923,26 @@ void fxp_free_names(struct fxp_names *names) sfree(names->names); sfree(names); } + +/* + * Duplicate an fxp_name structure. + */ +struct fxp_name *fxp_dup_name(struct fxp_name *name) +{ + struct fxp_name *ret; + ret = snew(struct fxp_name); + ret->filename = dupstr(name->filename); + ret->longname = dupstr(name->longname); + ret->attrs = name->attrs; /* structure copy */ + return ret; +} + +/* + * Free up an fxp_name structure. + */ +void fxp_free_name(struct fxp_name *name) +{ + sfree(name->filename); + sfree(name->longname); + sfree(name); +}