projects
/
u
/
mdw
/
putty
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Don't forget to check the return values of setuid and friends.
[u/mdw/putty]
/
sftp.c
diff --git
a/sftp.c
b/sftp.c
index
58b8e3e
..
19bb61a
100644
(file)
--- a/
sftp.c
+++ b/
sftp.c
@@
-30,7
+30,7
@@
static void fxp_internal_error(char *msg);
*/
static void sftp_pkt_ensure(struct sftp_packet *pkt, int length)
{
*/
static void sftp_pkt_ensure(struct sftp_packet *pkt, int length)
{
- if (pkt->maxlen < length) {
+ if (
(int)
pkt->maxlen < length) {
pkt->maxlen = length + 256;
pkt->data = sresize(pkt->data, pkt->maxlen, char);
}
pkt->maxlen = length + 256;
pkt->data = sresize(pkt->data, pkt->maxlen, char);
}
@@
-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];
@@
-151,7
+152,7
@@
static int sftp_pkt_getstring(struct sftp_packet *pkt,
return 0;
*length = GET_32BIT(pkt->data + pkt->savedpos);
pkt->savedpos += 4;
return 0;
*length = GET_32BIT(pkt->data + pkt->savedpos);
pkt->savedpos += 4;
- if (
pkt->length - pkt->savedpos
< *length || *length < 0) {
+ if (
(int)(pkt->length - pkt->savedpos)
< *length || *length < 0) {
*length = 0;
return 0;
}
*length = 0;
return 0;
}
@@
-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;
}
@@
-548,7
+548,8
@@
char *fxp_realpath_recv(struct sftp_packet *pktin, struct sftp_request *req)
/*
* Open a file.
*/
/*
* Open a file.
*/
-struct sftp_request *fxp_open_send(char *path, int type)
+struct sftp_request *fxp_open_send(char *path, int type,
+ struct fxp_attrs *attrs)
{
struct sftp_request *req = sftp_alloc_request();
struct sftp_packet *pktout;
{
struct sftp_request *req = sftp_alloc_request();
struct sftp_packet *pktout;
@@
-557,7
+558,10
@@
struct sftp_request *fxp_open_send(char *path, int type)
sftp_pkt_adduint32(pktout, req->id);
sftp_pkt_addstring(pktout, path);
sftp_pkt_adduint32(pktout, type);
sftp_pkt_adduint32(pktout, req->id);
sftp_pkt_addstring(pktout, path);
sftp_pkt_adduint32(pktout, type);
- sftp_pkt_adduint32(pktout, 0); /* (FIXME) empty ATTRS structure */
+ if (attrs)
+ sftp_pkt_addattrs(pktout, *attrs);
+ else
+ sftp_pkt_adduint32(pktout, 0); /* empty ATTRS structure */
sftp_send(pktout);
return req;
sftp_send(pktout);
return req;
@@
-994,7
+998,7
@@
struct fxp_names *fxp_readdir_recv(struct sftp_packet *pktin,
ret = snew(struct fxp_names);
ret->nnames = i;
ret->names = snewn(ret->nnames, struct fxp_name);
ret = snew(struct fxp_names);
ret->nnames = i;
ret->names = snewn(ret->nnames, struct fxp_name);
- for (i = 0; i < ret->nnames; i++) {
+ for (i = 0; i <
(unsigned long)
ret->nnames; i++) {
char *str1, *str2;
int len1, len2;
if (!sftp_pkt_getstring(pktin, &str1, &len1) ||
char *str1, *str2;
int len1, len2;
if (!sftp_pkt_getstring(pktin, &str1, &len1) ||