Skip to content
Snippets Groups Projects
Commit 339264bd authored by Deucе's avatar Deucе :ok_hand_tone4:
Browse files

Fixups from first testing

Various bits were wrong... now less wrong.
parent a39191ba
No related branches found
No related tags found
1 merge request!455Update branch with changes from master
...@@ -65,8 +65,9 @@ typedef struct sftp_rx_pkt { ...@@ -65,8 +65,9 @@ typedef struct sftp_rx_pkt {
uint32_t cur; uint32_t cur;
uint32_t sz; uint32_t sz;
uint32_t used; uint32_t used;
uint32_t len;
uint8_t type; uint8_t type;
uint8_t *data; uint8_t data[];
} *sftp_rx_pkt_t; } *sftp_rx_pkt_t;
typedef struct sftp_string { typedef struct sftp_string {
...@@ -91,7 +92,7 @@ struct sftp_file_attributes { ...@@ -91,7 +92,7 @@ struct sftp_file_attributes {
}; };
typedef struct sftp_client_state { typedef struct sftp_client_state {
bool (*send_cb)(sftp_tx_pkt_t *pkt, void *cb_data); bool (*send_cb)(uint8_t *buf, size_t len, void *cb_data);
xpevent_t recv_event; xpevent_t recv_event;
sftp_rx_pkt_t rxp; sftp_rx_pkt_t rxp;
sftp_tx_pkt_t txp; sftp_tx_pkt_t txp;
...@@ -111,12 +112,14 @@ uint32_t sftp_get32(sftp_rx_pkt_t pkt); ...@@ -111,12 +112,14 @@ uint32_t sftp_get32(sftp_rx_pkt_t pkt);
uint32_t sftp_get64(sftp_rx_pkt_t pkt); uint32_t sftp_get64(sftp_rx_pkt_t pkt);
sftp_str_t sftp_getstring(sftp_rx_pkt_t pkt, uint8_t **str); sftp_str_t sftp_getstring(sftp_rx_pkt_t pkt, uint8_t **str);
bool sftp_rx_pkt_append(sftp_rx_pkt_t *pkt, uint8_t *inbuf, uint32_t len); bool sftp_rx_pkt_append(sftp_rx_pkt_t *pkt, uint8_t *inbuf, uint32_t len);
bool sftp_tx_pkt_reset(sftp_tx_pkt_t *pktp);
bool sftp_appendbyte(sftp_tx_pkt_t *pktp, uint8_t u8); bool sftp_appendbyte(sftp_tx_pkt_t *pktp, uint8_t u8);
bool sftp_append32(sftp_tx_pkt_t *pktp, uint32_t u32); bool sftp_append32(sftp_tx_pkt_t *pktp, uint32_t u32);
bool sftp_append64(sftp_tx_pkt_t *pktp, uint64_t u); bool sftp_append64(sftp_tx_pkt_t *pktp, uint64_t u);
bool sftp_appendstring(sftp_tx_pkt_t *pktp, sftp_str_t s); bool sftp_appendstring(sftp_tx_pkt_t *pktp, sftp_str_t s);
void sftp_free_tx_pkt(sftp_tx_pkt_t pkt); void sftp_free_tx_pkt(sftp_tx_pkt_t pkt);
void sftp_free_rx_pkt(sftp_rx_pkt_t pkt); void sftp_free_rx_pkt(sftp_rx_pkt_t pkt);
bool sftp_prep_tx_packet(sftp_tx_pkt_t pkt, uint8_t **buf, size_t *sz);
/* sftp_str.c */ /* sftp_str.c */
sftp_str_t sftp_strdup(const char *str); sftp_str_t sftp_strdup(const char *str);
...@@ -126,7 +129,7 @@ void free_sftp_str(sftp_str_t str); ...@@ -126,7 +129,7 @@ void free_sftp_str(sftp_str_t str);
/* sftp_client.c */ /* sftp_client.c */
void sftpc_finish(sftpc_state_t state); void sftpc_finish(sftpc_state_t state);
sftpc_state_t sftpc_begin(bool (*send_cb)(sftp_tx_pkt_t *pkt, void *cb_data), void *cb_data); sftpc_state_t sftpc_begin(bool (*send_cb)(uint8_t *buf, size_t len, void *cb_data), void *cb_data);
bool sftpc_init(sftpc_state_t state); bool sftpc_init(sftpc_state_t state);
bool sftpc_recv(sftpc_state_t state, uint8_t *buf, uint32_t sz); bool sftpc_recv(sftpc_state_t state, uint8_t *buf, uint32_t sz);
......
...@@ -23,7 +23,7 @@ sftpc_finish(sftpc_state_t state) ...@@ -23,7 +23,7 @@ sftpc_finish(sftpc_state_t state)
} }
sftpc_state_t sftpc_state_t
sftpc_begin(bool (*send_cb)(sftp_tx_pkt_t *pkt, void *cb_data), void *cb_data) sftpc_begin(bool (*send_cb)(uint8_t *buf, size_t len, void *cb_data), void *cb_data)
{ {
sftpc_state_t ret = (sftpc_state_t)malloc(sizeof(sftpc_state_t)); sftpc_state_t ret = (sftpc_state_t)malloc(sizeof(sftpc_state_t));
if (ret == NULL) if (ret == NULL)
...@@ -46,24 +46,34 @@ sftpc_init(sftpc_state_t state) ...@@ -46,24 +46,34 @@ sftpc_init(sftpc_state_t state)
{ {
assert(state); assert(state);
if (!state) if (!state)
return false; goto fail;
assert(state->thread == pthread_self()); assert(state->thread == pthread_self());
if (state->thread != pthread_self()) if (state->thread != pthread_self())
return false; goto fail;
if (!sftp_appendbyte(&state->txp, SSH_FXP_INIT)) if (!sftp_appendbyte(&state->txp, SSH_FXP_INIT))
return false; goto fail;
if (!sftp_append32(&state->txp, SFTP_VERSION)) if (!sftp_append32(&state->txp, SFTP_VERSION))
return false; goto fail;
uint8_t *txbuf;
size_t txsz;
if (!sftp_prep_tx_packet(state->txp, &txbuf, &txsz))
goto fail;
if (!state->send_cb(txbuf, txsz, state->cb_data))
goto fail;
sftp_tx_pkt_reset(&state->txp);
if (WaitForEvent(state->recv_event, INFINITE) != WAIT_OBJECT_0) if (WaitForEvent(state->recv_event, INFINITE) != WAIT_OBJECT_0)
return false; goto fail;
if (state->rxp->type != SSH_FXP_VERSION) if (state->rxp->type != SSH_FXP_VERSION)
return false; goto fail;
if (sftp_get32(state->rxp) != SFTP_VERSION) if (sftp_get32(state->rxp) != SFTP_VERSION)
return false; goto fail;
sftp_remove_packet(state->rxp); sftp_remove_packet(state->rxp);
if (!sftp_have_full_pkt(state->rxp)) if (!sftp_have_full_pkt(state->rxp))
ResetEvent(state->recv_event); ResetEvent(state->recv_event);
return true; return true;
fail:
sftp_tx_pkt_reset(&state->txp);
return false;
} }
bool bool
......
...@@ -81,7 +81,7 @@ sftp_pkt_sz(sftp_rx_pkt_t pkt) ...@@ -81,7 +81,7 @@ sftp_pkt_sz(sftp_rx_pkt_t pkt)
if (!pkt) if (!pkt)
return false; return false;
assert(sftp_have_pkt_sz(pkt)); assert(sftp_have_pkt_sz(pkt));
return BE_INT32(pkt->used); return BE_INT32(pkt->len);
} }
uint8_t uint8_t
...@@ -114,12 +114,12 @@ sftp_remove_packet(sftp_rx_pkt_t pkt) ...@@ -114,12 +114,12 @@ sftp_remove_packet(sftp_rx_pkt_t pkt)
if (!pkt) if (!pkt)
return; return;
uint32_t sz = sftp_pkt_sz(pkt); uint32_t sz = sftp_pkt_sz(pkt);
assert(pkt->sz <= pkt->used); assert(sz <= pkt->used);
uint32_t newsz = pkt->used - sz - sizeof(uint32_t); uint32_t newsz = pkt->used - sz - sizeof(uint32_t);
uint8_t *src = (uint8_t *)&pkt->sz; uint8_t *src = (uint8_t *)&pkt->len;
src += sizeof(uint32_t); src += sizeof(uint32_t);
src += pkt->used; src += sz;
memmove(&pkt->sz, src, newsz); memmove(&pkt->len, src, newsz);
pkt->used = newsz; pkt->used = newsz;
// TODO: realloc() smaller? // TODO: realloc() smaller?
return; return;
...@@ -182,23 +182,22 @@ bool ...@@ -182,23 +182,22 @@ bool
sftp_rx_pkt_append(sftp_rx_pkt_t *pktp, uint8_t *inbuf, uint32_t len) sftp_rx_pkt_append(sftp_rx_pkt_t *pktp, uint8_t *inbuf, uint32_t len)
{ {
assert(pktp); assert(pktp);
if (!pktp)
return false;
size_t old_sz; size_t old_sz;
size_t new_sz; size_t new_sz;
uint32_t old_used; uint32_t old_used;
assert(pktp);
if (!pktp)
return false;
sftp_rx_pkt_t pkt = *pktp; sftp_rx_pkt_t pkt = *pktp;
if (pkt == NULL) { if (pkt == NULL) {
old_sz = 0; old_sz = 0;
old_used = 0; old_used = 0;
new_sz = offsetof(struct sftp_rx_pkt, used) + len; new_sz = offsetof(struct sftp_rx_pkt, len) + len;
} }
else { else {
old_used = pkt->used; old_used = pkt->used;
old_sz = pkt->sz; old_sz = pkt->sz;
new_sz = offsetof(struct sftp_rx_pkt, used) + pkt->used + len; new_sz = offsetof(struct sftp_rx_pkt, len) + pkt->used + len;
} }
if (new_sz > old_sz) { if (new_sz > old_sz) {
if (new_sz % SFTP_MIN_PACKET_ALLOC) if (new_sz % SFTP_MIN_PACKET_ALLOC)
...@@ -211,9 +210,10 @@ sftp_rx_pkt_append(sftp_rx_pkt_t *pktp, uint8_t *inbuf, uint32_t len) ...@@ -211,9 +210,10 @@ sftp_rx_pkt_append(sftp_rx_pkt_t *pktp, uint8_t *inbuf, uint32_t len)
} }
*pktp = new_buf; *pktp = new_buf;
pkt = *pktp; pkt = *pktp;
pkt->sz = new_sz;
} }
memcpy(&((uint8_t *)&(pkt->used))[old_used], inbuf, len); memcpy(&((uint8_t *)&(pkt->len))[old_used], inbuf, len);
pkt->used += len; pkt->used = old_used + len;
return true; return true;
} }
...@@ -230,7 +230,6 @@ grow_tx(sftp_tx_pkt_t *pktp, uint32_t need) ...@@ -230,7 +230,6 @@ grow_tx(sftp_tx_pkt_t *pktp, uint32_t need)
if (pktp == NULL) if (pktp == NULL)
return false; return false;
sftp_tx_pkt_t pkt = *pktp; sftp_tx_pkt_t pkt = *pktp;
assert(pkt->sz >= pkt->used);
size_t newsz; size_t newsz;
uint32_t oldsz; uint32_t oldsz;
uint32_t oldused; uint32_t oldused;
...@@ -255,6 +254,26 @@ grow_tx(sftp_tx_pkt_t *pktp, uint32_t need) ...@@ -255,6 +254,26 @@ grow_tx(sftp_tx_pkt_t *pktp, uint32_t need)
pkt->sz = newsz; pkt->sz = newsz;
pkt->used = oldused; pkt->used = oldused;
} }
assert(pkt->sz >= pkt->used);
return true;
}
bool
sftp_tx_pkt_reset(sftp_tx_pkt_t *pktp)
{
assert(pktp);
if (pktp == NULL)
return false;
sftp_tx_pkt_t pkt = *pktp;
pkt->used = 0;
if (pkt->sz == SFTP_MIN_PACKET_ALLOC)
return true;
void *newbuf = realloc(pkt, SFTP_MIN_PACKET_ALLOC);
if (newbuf != NULL) {
*pktp = newbuf;
pkt = *pktp;
pkt->sz = SFTP_MIN_PACKET_ALLOC;
}
return true; return true;
} }
...@@ -297,6 +316,20 @@ sftp_appendstring(sftp_tx_pkt_t *pktp, sftp_str_t s) ...@@ -297,6 +316,20 @@ sftp_appendstring(sftp_tx_pkt_t *pktp, sftp_str_t s)
return true; return true;
} }
bool
sftp_prep_tx_packet(sftp_tx_pkt_t pkt, uint8_t **buf, size_t *sz)
{
assert(pkt);
assert(buf);
assert(sz);
if (pkt == NULL || buf == NULL || sz == NULL)
return false;
*sz = pkt->used + sizeof(pkt->used);
pkt->used = BE_INT32(pkt->used);
*buf = (uint8_t *)&pkt->used;
return true;
}
void void
sftp_free_tx_pkt(sftp_tx_pkt_t pkt) sftp_free_tx_pkt(sftp_tx_pkt_t pkt)
{ {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment