mirror of
https://github.com/moparisthebest/curl
synced 2025-02-28 17:31:46 -05:00
- Ben Greear provided an update for TFTP that fixes upload.
This commit is contained in:
parent
7842704ee7
commit
53aa6b21fe
2
CHANGES
2
CHANGES
@ -7,6 +7,8 @@
|
||||
Changelog
|
||||
|
||||
Daniel Stenberg (1 Mar 2010)
|
||||
- Ben Greear provided an update for TFTP that fixes upload.
|
||||
|
||||
- Wesley Miaw reported bug #2958179 which identified a case of looping during
|
||||
OpenSSL based SSL handshaking even though the multi interface was used and
|
||||
there was no good reason for it.
|
||||
|
@ -22,6 +22,7 @@ This release includes the following bugfixes:
|
||||
o curl --trace-time not using local time
|
||||
o off-by-one in the chunked encoding trailer parser
|
||||
o superfluous blocking for OpenSSL-based SSL connects and multi interface
|
||||
o TFTP upload
|
||||
|
||||
This release includes the following known bugs:
|
||||
|
||||
@ -31,6 +32,6 @@ This release would not have looked like this without help, code, reports and
|
||||
advice from friends like these:
|
||||
|
||||
Steven M. Schweda, Yang Tse, Jack Zhang, Tom Donovan, Martin Hager,
|
||||
Daniel Fandrich, Patrick Monnerat, Pat Ray, Wesley Miaw
|
||||
Daniel Fandrich, Patrick Monnerat, Pat Ray, Wesley Miaw, Ben Greear
|
||||
|
||||
Thanks! (and sorry if I forgot to mention someone)
|
||||
|
70
lib/tftp.c
70
lib/tftp.c
@ -399,7 +399,7 @@ static CURLcode tftp_parse_option_ack(tftp_state_data_t *state,
|
||||
|
||||
tsize = strtol( value, NULL, 10 );
|
||||
if(!tsize) {
|
||||
failf(data, "invalid tsize value in OACK packet");
|
||||
failf(data, "invalid tsize -:%s:- value in OACK packet", value);
|
||||
return CURLE_TFTP_ILLEGAL;
|
||||
}
|
||||
Curl_pgrsSetDownloadSize(data, tsize);
|
||||
@ -701,38 +701,44 @@ static CURLcode tftp_tx(tftp_state_data_t *state, tftp_event_t event)
|
||||
switch(event) {
|
||||
|
||||
case TFTP_EVENT_ACK:
|
||||
/* Ack the packet */
|
||||
rblock = getrpacketblock(&state->rpacket);
|
||||
case TFTP_EVENT_OACK:
|
||||
if (event == TFTP_EVENT_ACK) {
|
||||
/* Ack the packet */
|
||||
rblock = getrpacketblock(&state->rpacket);
|
||||
|
||||
if(rblock != state->block) {
|
||||
/* This isn't the expected block. Log it and up the retry counter */
|
||||
infof(data, "Received ACK for block %d, expecting %d\n",
|
||||
rblock, state->block);
|
||||
state->retries++;
|
||||
/* Bail out if over the maximum */
|
||||
if(state->retries>state->retry_max) {
|
||||
failf(data, "tftp_tx: giving up waiting for block %d ack",
|
||||
state->block);
|
||||
res = CURLE_SEND_ERROR;
|
||||
}
|
||||
else {
|
||||
/* Re-send the data packet */
|
||||
sbytes = sendto(state->sockfd, (void *)&state->spacket,
|
||||
4+state->sbytes, SEND_4TH_ARG,
|
||||
(struct sockaddr *)&state->remote_addr,
|
||||
state->remote_addrlen);
|
||||
/* Check all sbytes were sent */
|
||||
if(sbytes<0) {
|
||||
failf(data, "%s", Curl_strerror(state->conn, SOCKERRNO));
|
||||
res = CURLE_SEND_ERROR;
|
||||
}
|
||||
}
|
||||
return res;
|
||||
if(rblock != state->block) {
|
||||
/* This isn't the expected block. Log it and up the retry counter */
|
||||
infof(data, "Received ACK for block %d, expecting %d\n",
|
||||
rblock, state->block);
|
||||
state->retries++;
|
||||
/* Bail out if over the maximum */
|
||||
if(state->retries>state->retry_max) {
|
||||
failf(data, "tftp_tx: giving up waiting for block %d ack",
|
||||
state->block);
|
||||
res = CURLE_SEND_ERROR;
|
||||
}
|
||||
else {
|
||||
/* Re-send the data packet */
|
||||
sbytes = sendto(state->sockfd, (void *)&state->spacket,
|
||||
4+state->sbytes, SEND_4TH_ARG,
|
||||
(struct sockaddr *)&state->remote_addr,
|
||||
state->remote_addrlen);
|
||||
/* Check all sbytes were sent */
|
||||
if(sbytes<0) {
|
||||
failf(data, "%s", Curl_strerror(state->conn, SOCKERRNO));
|
||||
res = CURLE_SEND_ERROR;
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
/* This is the expected packet. Reset the counters and send the next
|
||||
block */
|
||||
time(&state->rx_time);
|
||||
state->block++;
|
||||
}
|
||||
else {
|
||||
state->block = 1; /* first data block is 1 when using OACK */
|
||||
}
|
||||
/* This is the expected packet. Reset the counters and send the next
|
||||
block */
|
||||
time(&state->rx_time);
|
||||
state->block++;
|
||||
state->retries = 0;
|
||||
setpacketevent(&state->spacket, TFTP_EVENT_DATA);
|
||||
setpacketblock(&state->spacket, state->block);
|
||||
@ -798,7 +804,7 @@ static CURLcode tftp_tx(tftp_state_data_t *state, tftp_event_t event)
|
||||
break;
|
||||
|
||||
default:
|
||||
failf(data, "%s", "tftp_tx: internal error");
|
||||
failf(data, "tftp_tx: internal error, event: %i", (int)(event));
|
||||
break;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user