diff --git a/src/serve.c b/src/serve.c index c7ec0b7..cd4b0c0 100644 --- a/src/serve.c +++ b/src/serve.c @@ -512,10 +512,13 @@ int server_accept( struct server * params ) union mysockaddr client_address; fd_set fds; socklen_t socklen=sizeof(client_address); + /* We select on this fd to receive OS signals (only a few of + * which we're interested in, see flexnbd.c */ + int signal_fd = flexnbd_signal_fd( params->flexnbd ); FD_ZERO(&fds); FD_SET(params->server_fd, &fds); - FD_SET(flexnbd_signal_fd( params->flexnbd ), &fds); + if( 0 < signal_fd ) { FD_SET(signal_fd, &fds); } self_pipe_fd_set( params->close_signal, &fds ); self_pipe_fd_set( params->acl_updated_signal, &fds ); @@ -527,7 +530,7 @@ int server_accept( struct server * params ) return 0; } - if ( FD_ISSET( flexnbd_signal_fd( params->flexnbd ), &fds ) ){ + if ( 0 < signal_fd && FD_ISSET( signal_fd, &fds ) ){ debug( "Stop signal received." ); server_close_clients( params ); return 0; diff --git a/tests/check_serve.c b/tests/check_serve.c index e58073d..18a8325 100644 --- a/tests/check_serve.c +++ b/tests/check_serve.c @@ -145,6 +145,7 @@ START_TEST( test_acl_update_closes_bad_client ) * a client socket. */ struct flexnbd flexnbd; + flexnbd.signal_fd = -1; struct server * s = server_create( &flexnbd, "127.0.0.7", "0", dummy_file, 0, 0, NULL, 1, 1 ); struct acl * new_acl = acl_create( 0, NULL, 1 ); struct client * c;