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