diff options
Diffstat (limited to 'src/net/udp/slam.c')
-rw-r--r-- | src/net/udp/slam.c | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/src/net/udp/slam.c b/src/net/udp/slam.c index c165b4fb9..d9e91dd1c 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; } /** |