mirror of https://github.com/ipxe/ipxe.git
[rndis] Clean up error handling path in register_rndis()
Avoid calling rndis_halt() and rndis->op->close() twice if the call to register_netdev() fails. Reported-by: Roman Kagan <rkagan@virtuozzo.com> Signed-off-by: Michael Brown <mcb30@ipxe.org>pull/76/head
parent
1c47eb186e
commit
05b979146d
102
src/net/rndis.c
102
src/net/rndis.c
|
@ -650,6 +650,63 @@ static int rndis_oid ( struct rndis_device *rndis, unsigned int oid,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Describe RNDIS device
|
||||||
|
*
|
||||||
|
* @v rndis RNDIS device
|
||||||
|
* @ret rc Return status code
|
||||||
|
*/
|
||||||
|
static int rndis_describe ( struct rndis_device *rndis ) {
|
||||||
|
struct net_device *netdev = rndis->netdev;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
/* Assign device name (for debugging) */
|
||||||
|
rndis->name = netdev->dev->name;
|
||||||
|
|
||||||
|
/* Open RNDIS device to read MAC addresses */
|
||||||
|
if ( ( rc = rndis->op->open ( rndis ) ) != 0 ) {
|
||||||
|
DBGC ( rndis, "RNDIS %s could not open: %s\n",
|
||||||
|
rndis->name, strerror ( rc ) );
|
||||||
|
goto err_open;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Initialise RNDIS */
|
||||||
|
if ( ( rc = rndis_initialise ( rndis ) ) != 0 )
|
||||||
|
goto err_initialise;
|
||||||
|
|
||||||
|
/* Query permanent MAC address */
|
||||||
|
if ( ( rc = rndis_oid ( rndis, RNDIS_OID_802_3_PERMANENT_ADDRESS,
|
||||||
|
NULL, 0 ) ) != 0 )
|
||||||
|
goto err_query_permanent;
|
||||||
|
|
||||||
|
/* Query current MAC address */
|
||||||
|
if ( ( rc = rndis_oid ( rndis, RNDIS_OID_802_3_CURRENT_ADDRESS,
|
||||||
|
NULL, 0 ) ) != 0 )
|
||||||
|
goto err_query_current;
|
||||||
|
|
||||||
|
/* Get link status */
|
||||||
|
if ( ( rc = rndis_oid ( rndis, RNDIS_OID_GEN_MEDIA_CONNECT_STATUS,
|
||||||
|
NULL, 0 ) ) != 0 )
|
||||||
|
goto err_query_link;
|
||||||
|
|
||||||
|
/* Halt RNDIS device */
|
||||||
|
rndis_halt ( rndis );
|
||||||
|
|
||||||
|
/* Close RNDIS device */
|
||||||
|
rndis->op->close ( rndis );
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
err_query_link:
|
||||||
|
err_query_current:
|
||||||
|
err_query_permanent:
|
||||||
|
rndis_halt ( rndis );
|
||||||
|
err_initialise:
|
||||||
|
rndis->op->close ( rndis );
|
||||||
|
err_open:
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Receive indicate status message
|
* Receive indicate status message
|
||||||
*
|
*
|
||||||
|
@ -970,40 +1027,9 @@ int register_rndis ( struct rndis_device *rndis ) {
|
||||||
struct net_device *netdev = rndis->netdev;
|
struct net_device *netdev = rndis->netdev;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
/* Assign device name (for debugging) */
|
/* Describe RNDIS device */
|
||||||
rndis->name = netdev->dev->name;
|
if ( ( rc = rndis_describe ( rndis ) ) != 0 )
|
||||||
|
goto err_describe;
|
||||||
/* Open RNDIS device to read MAC addresses */
|
|
||||||
if ( ( rc = rndis->op->open ( rndis ) ) != 0 ) {
|
|
||||||
DBGC ( rndis, "RNDIS %s could not open: %s\n",
|
|
||||||
rndis->name, strerror ( rc ) );
|
|
||||||
goto err_open;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Initialise RNDIS */
|
|
||||||
if ( ( rc = rndis_initialise ( rndis ) ) != 0 )
|
|
||||||
goto err_initialise;
|
|
||||||
|
|
||||||
/* Query permanent MAC address */
|
|
||||||
if ( ( rc = rndis_oid ( rndis, RNDIS_OID_802_3_PERMANENT_ADDRESS,
|
|
||||||
NULL, 0 ) ) != 0 )
|
|
||||||
goto err_query_permanent;
|
|
||||||
|
|
||||||
/* Query current MAC address */
|
|
||||||
if ( ( rc = rndis_oid ( rndis, RNDIS_OID_802_3_CURRENT_ADDRESS,
|
|
||||||
NULL, 0 ) ) != 0 )
|
|
||||||
goto err_query_current;
|
|
||||||
|
|
||||||
/* Get link status */
|
|
||||||
if ( ( rc = rndis_oid ( rndis, RNDIS_OID_GEN_MEDIA_CONNECT_STATUS,
|
|
||||||
NULL, 0 ) ) != 0 )
|
|
||||||
goto err_query_link;
|
|
||||||
|
|
||||||
/* Halt RNDIS device */
|
|
||||||
rndis_halt ( rndis );
|
|
||||||
|
|
||||||
/* Close RNDIS device */
|
|
||||||
rndis->op->close ( rndis );
|
|
||||||
|
|
||||||
/* Register network device */
|
/* Register network device */
|
||||||
if ( ( rc = register_netdev ( netdev ) ) != 0 ) {
|
if ( ( rc = register_netdev ( netdev ) ) != 0 ) {
|
||||||
|
@ -1016,13 +1042,7 @@ int register_rndis ( struct rndis_device *rndis ) {
|
||||||
|
|
||||||
unregister_netdev ( netdev );
|
unregister_netdev ( netdev );
|
||||||
err_register:
|
err_register:
|
||||||
err_query_link:
|
err_describe:
|
||||||
err_query_current:
|
|
||||||
err_query_permanent:
|
|
||||||
rndis_halt ( rndis );
|
|
||||||
err_initialise:
|
|
||||||
rndis->op->close ( rndis );
|
|
||||||
err_open:
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue