aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2020-02-16 21:55:59 +0000
committerMichael Brown <mcb30@ipxe.org>2020-02-16 21:55:59 +0000
commitc5306bcfa5ca477a88c921d03c2301f7393ba480 (patch)
tree25217b97ed75fdb0d6855d39903db2ede6ad4910
parent6248ac396aaf9ccff7cda91080305ad2dc08d8cc (diff)
downloadipxe-c5306bcfa5ca477a88c921d03c2301f7393ba480.zip
ipxe-c5306bcfa5ca477a88c921d03c2301f7393ba480.tar.gz
ipxe-c5306bcfa5ca477a88c921d03c2301f7393ba480.tar.bz2
[slam] Eliminate variable-length stack allocation
Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r--src/net/udp/slam.c24
1 files changed, 19 insertions, 5 deletions
diff --git a/src/net/udp/slam.c b/src/net/udp/slam.c
index c165b4f..d9e91dd 100644
--- a/src/net/udp/slam.c
+++ b/src/net/udp/slam.c
@@ -656,13 +656,18 @@ static struct interface_descriptor slam_xfer_desc =
static int slam_parse_multicast_address ( struct slam_request *slam,
const char *path,
struct sockaddr_in *address ) {
- char path_dup[ strlen ( path ) /* no +1 */ ];
+ char *path_dup;
char *sep;
char *end;
+ int rc;
/* Create temporary copy of path, minus the leading '/' */
assert ( *path == '/' );
- memcpy ( path_dup, ( path + 1 ) , sizeof ( path_dup ) );
+ path_dup = strdup ( path + 1 );
+ if ( ! path_dup ) {
+ rc = -ENOMEM;
+ goto err_strdup;
+ }
/* Parse port, if present */
sep = strchr ( path_dup, ':' );
@@ -672,7 +677,8 @@ static int slam_parse_multicast_address ( struct slam_request *slam,
if ( *end != '\0' ) {
DBGC ( slam, "SLAM %p invalid multicast port "
"\"%s\"\n", slam, sep );
- return -EINVAL;
+ rc = -EINVAL;
+ goto err_port;
}
}
@@ -680,10 +686,18 @@ static int slam_parse_multicast_address ( struct slam_request *slam,
if ( inet_aton ( path_dup, &address->sin_addr ) == 0 ) {
DBGC ( slam, "SLAM %p invalid multicast address \"%s\"\n",
slam, path_dup );
- return -EINVAL;
+ rc = -EINVAL;
+ goto err_addr;
}
- return 0;
+ /* Success */
+ rc = 0;
+
+ err_addr:
+ err_port:
+ free ( path_dup );
+ err_strdup:
+ return rc;
}
/**