Skip to content

Commit

Permalink
- Ben Greear provided an update for TFTP that fixes upload.
Browse files Browse the repository at this point in the history
  • Loading branch information
bagder committed Mar 1, 2010
1 parent 7842704 commit 53aa6b2
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 34 deletions.
2 changes: 2 additions & 0 deletions CHANGES
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
3 changes: 2 additions & 1 deletion RELEASE-NOTES
Original file line number Diff line number Diff line change
Expand Up @@ -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:

Expand All @@ -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)
72 changes: 39 additions & 33 deletions lib/tftp.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
}

Expand Down

0 comments on commit 53aa6b2

Please sign in to comment.