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)
}
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;
}
/*
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) {
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);
return path;
} else {
fxp_got_status(pktin);
+ sftp_pkt_free(pktin);
return NULL;
}
}
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) {
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));
return handle;
} else {
fxp_got_status(pktin);
+ sftp_pkt_free(pktin);
return NULL;
}
}
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) {
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));
return handle;
} else {
fxp_got_status(pktin);
+ sftp_pkt_free(pktin);
return NULL;
}
}
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);
}
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;
}
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;
}
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;
}
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;
}
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;
}
}
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;
}
}
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;
}
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;
}
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) {
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;
}
}
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) {
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;
}
}
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;
}
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 = smalloc(sizeof(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);
+}