Go to:
Gentoo Home
Documentation
Forums
Lists
Bugs
Planet
Store
Wiki
Get Gentoo!
Gentoo's Bugzilla – Attachment 233163 Details for
Bug 321705
atftp 0.7-r1 client fails for large files
Home
|
New
–
[Ex]
|
Browse
|
Search
|
Privacy Policy
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch to fix bug that occurs in atftp 0.7-r1 when block number wraps
atftp-0.7-blocknumwrap.patch (text/plain), 5.55 KB, created by
Grant Edwards
on 2010-05-27 18:20:24 UTC
(
hide
)
Description:
Patch to fix bug that occurs in atftp 0.7-r1 when block number wraps
Filename:
MIME Type:
Creator:
Grant Edwards
Created:
2010-05-27 18:20:24 UTC
Size:
5.55 KB
patch
obsolete
>--- atftp-0.7/tftp_file.c~ 2010-05-27 13:05:12.000000000 -0500 >+++ atftp-0.7/tftp_file.c 2010-05-27 12:50:05.000000000 -0500 >@@ -133,19 +133,21 @@ > int mcast_sockfd = 0; > struct sockaddr_in sa_mcast; > struct ip_mreq mreq; > struct hostent *host; > int master_client = 0; > unsigned int file_bitmap[NB_BLOCK]; > int prev_bitmap_hole = -1; /* the previous hole found in the bitmap */ > char string[MAXLEN]; >+ int rx_block_number; > > int prev_block_number = 0; /* needed to support netascii convertion */ > int temp = 0; >+ size_t ignore; > > data->file_size = 0; > tftp_cancel = 0; > from.sin_addr.s_addr = 0; > > memset(&sa_mcast, 0, sizeof(struct sockaddr_in)); > memset(&file_bitmap, 0, sizeof(file_bitmap)); > >@@ -300,17 +302,17 @@ > { > connect(sockfd, (struct sockaddr *)&sa, sizeof(sa)); > connected = 1; > } > state = S_OACK_RECEIVED; > break; > case GET_ERROR: > fprintf(stderr, "tftp: error received from server <"); >- fwrite(tftphdr->th_msg, 1, data_size - 4 - 1, stderr); >+ ignore = fwrite(tftphdr->th_msg, 1, data_size - 4 - 1, stderr); > fprintf(stderr, ">\n"); > state = S_ABORT; > break; > case GET_DATA: > number_of_timeout = 0; > /* if the socket if not connected, connect it */ > if (!connected) > { >@@ -513,21 +515,24 @@ > state = S_WAIT_PACKET; > break; > case S_DATA_RECEIVED: > if ((multicast && master_client) || (!multicast)) > timeout_state = S_SEND_ACK; > else > timeout_state = S_WAIT_PACKET; > >- block_number = ntohs(tftphdr->th_block); >+ rx_block_number = ntohs(tftphdr->th_block); > if (data->trace) > fprintf(stderr, "received DATA <block: %d, size: %d>\n", > ntohs(tftphdr->th_block), data_size - 4); > >+ if ((uint16_t)rx_block_number == (uint16_t)(block_number+1)) >+ ++block_number; >+ > if (tftp_file_write(fp, tftphdr->th_data, data->data_buffer_size - 4, block_number, > data_size - 4, convert, &prev_block_number, &temp) > != data_size - 4) > { > > fprintf(stderr, "tftp: error writing to file %s\n", > data->local_file); > tftp_send_error(sockfd, &sa, ENOSPACE, data->data_buffer, >@@ -613,19 +618,21 @@ > int connected; /* 1 when sockfd is connected */ > struct tftphdr *tftphdr = (struct tftphdr *)data->data_buffer; > FILE *fp; /* the local file pointer */ > int number_of_timeout = 0; > struct stat file_stat; > int convert = 0; /* if true, do netascii convertion */ > char string[MAXLEN]; > >+ int ack_block_number; > int prev_block_number = 0; /* needed to support netascii convertion */ > int prev_file_pos = 0; > int temp = 0; >+ size_t ignore; > > data->file_size = 0; > tftp_cancel = 0; > from.sin_addr.s_addr = 0; > > /* make sure the socket is not connected */ > sa.sin_family = AF_UNSPEC; > connect(sockfd, (struct sockaddr *)&sa, sizeof(sa)); >@@ -759,20 +766,23 @@ > case GET_ACK: > number_of_timeout = 0; > /* if the socket if not connected, connect it */ > if (!connected) > { > //connect(sockfd, (struct sockaddr *)&sa, sizeof(sa)); > connected = 1; > } >- block_number = ntohs(tftphdr->th_block); >+ ack_block_number = ntohs(tftphdr->th_block); >+ if ((uint16_t)(block_number+1) == ack_block_number) >+ ++block_number; > if (data->trace) > fprintf(stderr, "received ACK <block: %d>\n", >- block_number); >+ ack_block_number); >+ > if ((last_block != -1) && (block_number > last_block)) > { > state = S_END; > break; > } > state = S_SEND_DATA; > break; > case GET_OACK: >@@ -782,17 +792,17 @@ > { > //connect(sockfd, (struct sockaddr *)&sa, sizeof(sa)); > connected = 1; > } > state = S_OACK_RECEIVED; > break; > case GET_ERROR: > fprintf(stderr, "tftp: error received from server <"); >- fwrite(tftphdr->th_msg, 1, data_size - 4 - 1, stderr); >+ ignore = fwrite(tftphdr->th_msg, 1, data_size - 4 - 1, stderr); > fprintf(stderr, ">\n"); > state = S_ABORT; > break; > case GET_DISCARD: > /* consider discarded packet as timeout to make sure when don't lock up > if routing is broken */ > number_of_timeout++; > fprintf(stderr, "tftp: packet discard <%s:%d>.\n",
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 321705
: 233163