diff options
-rw-r--r-- | CHANGES | 2 | ||||
-rw-r--r-- | RELEASE-NOTES | 3 | ||||
-rw-r--r-- | lib/tftp.c | 72 |
3 files changed, 43 insertions, 34 deletions
@@ -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. diff --git a/RELEASE-NOTES b/RELEASE-NOTES index d6c58692a..b6e2b4ea3 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -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) diff --git a/lib/tftp.c b/lib/tftp.c index cbf6dc842..2c6da5a9a 100644 --- a/lib/tftp.c +++ b/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); - - 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; + 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; + } + /* 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; } |