From 698e87277ff3af1849d3173496631dfb5caa36e3 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Wed, 1 Jun 2005 19:13:06 +0000 Subject: [PATCH] Don't try to fetch another packet once we've reached EOF. --- src/proto/tftp.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/proto/tftp.c b/src/proto/tftp.c index 9231c516..3f6bf35a 100644 --- a/src/proto/tftp.c +++ b/src/proto/tftp.c @@ -35,7 +35,7 @@ * False return value always indicates an error that should abort the * transfer. */ -static inline int process_tftp_data ( struct tftp_state *state, +static inline int tftp_process_data ( struct tftp_state *state, struct tftp_data *data, struct buffer *buffer, int *eof ) { @@ -97,18 +97,18 @@ static int tftp ( char *url __unused, struct sockaddr_in *server, char *file, state.server = *server; /* Open the file */ - if ( ! tftp_open ( &state, file, &reply ) ) { + if ( ! tftp_open ( &state, file, &reply, 0 ) ) { DBG ( "TFTP: could not open %@:%d/%s : %m\n", server->sin_addr.s_addr, server->sin_port, file ); return 0; } /* Fetch file, a block at a time */ - do { + while ( 1 ) { twiddle(); switch ( ntohs ( reply->common.opcode ) ) { case TFTP_DATA: - if ( ! process_tftp_data ( &state, &reply->data, + if ( ! tftp_process_data ( &state, &reply->data, buffer, &eof ) ) { tftp_error ( &state, TFTP_ERR_ILLEGAL_OP, NULL ); @@ -138,13 +138,19 @@ static int tftp ( char *url __unused, struct sockaddr_in *server, char *file, tftp_error ( &state, TFTP_ERR_ILLEGAL_OP, NULL ); return 0; } + /* If we have reached EOF, stop here */ + if ( eof ) + break; /* Fetch the next data block */ if ( ! tftp_ack ( &state, &reply ) ) { DBG ( "TFTP: could not get next block: %m\n" ); - tftp_error ( &state, TFTP_ERR_ILLEGAL_OP, NULL ); + if ( ! reply ) { + tftp_error ( &state, TFTP_ERR_ILLEGAL_OP, + NULL ); + } return 0; } - } while ( ! eof ); + } /* ACK the final packet, as a courtesy to the server */ tftp_ack_nowait ( &state );