[tftp] Eliminate unnecessary variable-length stack allocation

Eliminate an unnecessary variable-length stack allocation and memory
copy by allowing TFTP option processors to modify the option string
in-place.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
pull/106/head
Michael Brown 2020-02-16 20:08:20 +00:00
parent 18dc73d27e
commit c625681ca1
1 changed files with 6 additions and 11 deletions

View File

@ -545,8 +545,7 @@ static void tftp_timer_expired ( struct retry_timer *timer, int fail ) {
* @v value Option value * @v value Option value
* @ret rc Return status code * @ret rc Return status code
*/ */
static int tftp_process_blksize ( struct tftp_request *tftp, static int tftp_process_blksize ( struct tftp_request *tftp, char *value ) {
const char *value ) {
char *end; char *end;
tftp->blksize = strtoul ( value, &end, 10 ); tftp->blksize = strtoul ( value, &end, 10 );
@ -567,8 +566,7 @@ static int tftp_process_blksize ( struct tftp_request *tftp,
* @v value Option value * @v value Option value
* @ret rc Return status code * @ret rc Return status code
*/ */
static int tftp_process_tsize ( struct tftp_request *tftp, static int tftp_process_tsize ( struct tftp_request *tftp, char *value ) {
const char *value ) {
char *end; char *end;
tftp->tsize = strtoul ( value, &end, 10 ); tftp->tsize = strtoul ( value, &end, 10 );
@ -589,13 +587,11 @@ static int tftp_process_tsize ( struct tftp_request *tftp,
* @v value Option value * @v value Option value
* @ret rc Return status code * @ret rc Return status code
*/ */
static int tftp_process_multicast ( struct tftp_request *tftp, static int tftp_process_multicast ( struct tftp_request *tftp, char *value ) {
const char *value ) {
union { union {
struct sockaddr sa; struct sockaddr sa;
struct sockaddr_in sin; struct sockaddr_in sin;
} socket; } socket;
char buf[ strlen ( value ) + 1 ];
char *addr; char *addr;
char *port; char *port;
char *port_end; char *port_end;
@ -604,8 +600,7 @@ static int tftp_process_multicast ( struct tftp_request *tftp,
int rc; int rc;
/* Split value into "addr,port,mc" fields */ /* Split value into "addr,port,mc" fields */
memcpy ( buf, value, sizeof ( buf ) ); addr = value;
addr = buf;
port = strchr ( addr, ',' ); port = strchr ( addr, ',' );
if ( ! port ) { if ( ! port ) {
DBGC ( tftp, "TFTP %p multicast missing port,mc\n", tftp ); DBGC ( tftp, "TFTP %p multicast missing port,mc\n", tftp );
@ -662,7 +657,7 @@ struct tftp_option {
* @v value Option value * @v value Option value
* @ret rc Return status code * @ret rc Return status code
*/ */
int ( * process ) ( struct tftp_request *tftp, const char *value ); int ( * process ) ( struct tftp_request *tftp, char *value );
}; };
/** Recognised TFTP options */ /** Recognised TFTP options */
@ -682,7 +677,7 @@ static struct tftp_option tftp_options[] = {
* @ret rc Return status code * @ret rc Return status code
*/ */
static int tftp_process_option ( struct tftp_request *tftp, static int tftp_process_option ( struct tftp_request *tftp,
const char *name, const char *value ) { const char *name, char *value ) {
struct tftp_option *option; struct tftp_option *option;
for ( option = tftp_options ; option->name ; option++ ) { for ( option = tftp_options ; option->name ; option++ ) {