]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[slam] Eliminate variable-length stack allocation
authorMichael Brown <mcb30@ipxe.org>
Sun, 16 Feb 2020 21:55:59 +0000 (21:55 +0000)
committerMichael Brown <mcb30@ipxe.org>
Sun, 16 Feb 2020 21:55:59 +0000 (21:55 +0000)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/net/udp/slam.c

index c165b4fb9671ddb2e52f8dff1fb6924a8e69dd0f..d9e91dd1ceecf72cb55de8c3339c47f0322f1484 100644 (file)
@@ -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;
 }
 
 /**