- Ben Greear provided an update for TFTP that fixes upload.
This commit is contained in:
2
CHANGES
2
CHANGES
@@ -7,6 +7,8 @@
|
|||||||
Changelog
|
Changelog
|
||||||
|
|
||||||
Daniel Stenberg (1 Mar 2010)
|
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
|
- Wesley Miaw reported bug #2958179 which identified a case of looping during
|
||||||
OpenSSL based SSL handshaking even though the multi interface was used and
|
OpenSSL based SSL handshaking even though the multi interface was used and
|
||||||
there was no good reason for it.
|
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 curl --trace-time not using local time
|
||||||
o off-by-one in the chunked encoding trailer parser
|
o off-by-one in the chunked encoding trailer parser
|
||||||
o superfluous blocking for OpenSSL-based SSL connects and multi interface
|
o superfluous blocking for OpenSSL-based SSL connects and multi interface
|
||||||
|
o TFTP upload
|
||||||
|
|
||||||
This release includes the following known bugs:
|
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:
|
advice from friends like these:
|
||||||
|
|
||||||
Steven M. Schweda, Yang Tse, Jack Zhang, Tom Donovan, Martin Hager,
|
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)
|
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 );
|
tsize = strtol( value, NULL, 10 );
|
||||||
if(!tsize) {
|
if(!tsize) {
|
||||||
failf(data, "invalid tsize value in OACK packet");
|
failf(data, "invalid tsize -:%s:- value in OACK packet", value);
|
||||||
return CURLE_TFTP_ILLEGAL;
|
return CURLE_TFTP_ILLEGAL;
|
||||||
}
|
}
|
||||||
Curl_pgrsSetDownloadSize(data, tsize);
|
Curl_pgrsSetDownloadSize(data, tsize);
|
||||||
@@ -701,38 +701,44 @@ static CURLcode tftp_tx(tftp_state_data_t *state, tftp_event_t event)
|
|||||||
switch(event) {
|
switch(event) {
|
||||||
|
|
||||||
case TFTP_EVENT_ACK:
|
case TFTP_EVENT_ACK:
|
||||||
/* Ack the packet */
|
case TFTP_EVENT_OACK:
|
||||||
rblock = getrpacketblock(&state->rpacket);
|
if (event == TFTP_EVENT_ACK) {
|
||||||
|
/* Ack the packet */
|
||||||
|
rblock = getrpacketblock(&state->rpacket);
|
||||||
|
|
||||||
if(rblock != state->block) {
|
if(rblock != state->block) {
|
||||||
/* This isn't the expected block. Log it and up the retry counter */
|
/* This isn't the expected block. Log it and up the retry counter */
|
||||||
infof(data, "Received ACK for block %d, expecting %d\n",
|
infof(data, "Received ACK for block %d, expecting %d\n",
|
||||||
rblock, state->block);
|
rblock, state->block);
|
||||||
state->retries++;
|
state->retries++;
|
||||||
/* Bail out if over the maximum */
|
/* Bail out if over the maximum */
|
||||||
if(state->retries>state->retry_max) {
|
if(state->retries>state->retry_max) {
|
||||||
failf(data, "tftp_tx: giving up waiting for block %d ack",
|
failf(data, "tftp_tx: giving up waiting for block %d ack",
|
||||||
state->block);
|
state->block);
|
||||||
res = CURLE_SEND_ERROR;
|
res = CURLE_SEND_ERROR;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* Re-send the data packet */
|
/* Re-send the data packet */
|
||||||
sbytes = sendto(state->sockfd, (void *)&state->spacket,
|
sbytes = sendto(state->sockfd, (void *)&state->spacket,
|
||||||
4+state->sbytes, SEND_4TH_ARG,
|
4+state->sbytes, SEND_4TH_ARG,
|
||||||
(struct sockaddr *)&state->remote_addr,
|
(struct sockaddr *)&state->remote_addr,
|
||||||
state->remote_addrlen);
|
state->remote_addrlen);
|
||||||
/* Check all sbytes were sent */
|
/* Check all sbytes were sent */
|
||||||
if(sbytes<0) {
|
if(sbytes<0) {
|
||||||
failf(data, "%s", Curl_strerror(state->conn, SOCKERRNO));
|
failf(data, "%s", Curl_strerror(state->conn, SOCKERRNO));
|
||||||
res = CURLE_SEND_ERROR;
|
res = CURLE_SEND_ERROR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return res;
|
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;
|
state->retries = 0;
|
||||||
setpacketevent(&state->spacket, TFTP_EVENT_DATA);
|
setpacketevent(&state->spacket, TFTP_EVENT_DATA);
|
||||||
setpacketblock(&state->spacket, state->block);
|
setpacketblock(&state->spacket, state->block);
|
||||||
@@ -798,7 +804,7 @@ static CURLcode tftp_tx(tftp_state_data_t *state, tftp_event_t event)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
failf(data, "%s", "tftp_tx: internal error");
|
failf(data, "tftp_tx: internal error, event: %i", (int)(event));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user