@@ -479,6 +479,7 @@ int run_qrexec_to_dom0(const struct service_params *svc_params,
479
479
if (qubes_wait_for_vchan_connection_with_timeout (
480
480
data_vchan , wait_fd , false, connection_timeout ) < 0 ) {
481
481
LOG (ERROR , "qrexec connection timeout" );
482
+ libvchan_close (data_vchan );
482
483
return QREXEC_EXIT_PROBLEM ;
483
484
}
484
485
@@ -496,23 +497,25 @@ int run_qrexec_to_dom0(const struct service_params *svc_params,
496
497
497
498
int handshake_and_go (struct handshake_params * params )
498
499
{
500
+ int rc = QREXEC_EXIT_PROBLEM ;
499
501
if (params -> data_vchan == NULL || !libvchan_is_open (params -> data_vchan )) {
500
502
LOG (ERROR , "Failed to open data vchan connection" );
501
- return QREXEC_EXIT_PROBLEM ;
503
+ goto cleanup ;
502
504
}
503
- int rc ;
504
505
int data_protocol_version = handle_agent_handshake (params -> data_vchan ,
505
506
params -> remote_send_first );
506
- if (data_protocol_version < 0 ) {
507
- rc = QREXEC_EXIT_PROBLEM ;
508
- } else if ( params -> prepare_ret != 0 ) {
509
- rc = params -> prepare_ret == -1 ? QREXEC_EXIT_SERVICE_NOT_FOUND : QREXEC_EXIT_PROBLEM ;
510
- handle_failed_exec ( params -> data_vchan , params -> remote_send_first , rc );
511
- } else {
512
- params -> data_protocol_version = data_protocol_version ;
513
- rc = select_loop ( params );
507
+ if (data_protocol_version >= 0 ) {
508
+ if ( params -> prepare_ret != 0 ) {
509
+ rc = params -> prepare_ret == -1 ? QREXEC_EXIT_SERVICE_NOT_FOUND : QREXEC_EXIT_PROBLEM ;
510
+ handle_failed_exec ( params -> data_vchan , params -> remote_send_first , rc ) ;
511
+ } else {
512
+ params -> data_protocol_version = data_protocol_version ;
513
+ rc = select_loop ( params ) ;
514
+ }
514
515
}
515
- libvchan_close (params -> data_vchan );
516
+ cleanup :
517
+ if (params -> data_vchan != NULL )
518
+ libvchan_close (params -> data_vchan );
516
519
params -> data_vchan = NULL ;
517
520
return rc ;
518
521
}
0 commit comments