From 0166b1b370862ab34335af3d5710304dc3546499 Mon Sep 17 00:00:00 2001 From: Rob Austein Date: Tue, 16 Aug 2016 18:52:47 -0400 Subject: Lock RPC device after opening it. Current design of the RPC protocol assumes that there is exactly one client speaking directly to the HSM via the RPC channel, whether that single client really is single or is a multiplexing daemon. PKCS #11 mutexes won't help here, so using flock(2) to grab an exclusive "advisory" lock on the RPC file descriptor is the simplest solution. --- rpc_serial.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/rpc_serial.c b/rpc_serial.c index 728bbd8..0e0e6ff 100644 --- a/rpc_serial.c +++ b/rpc_serial.c @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -66,11 +67,17 @@ hal_error_t hal_serial_init(const char * const device, const uint32_t speed) struct termios tty; speed_t termios_speed; + /* + * Apparently Linux is too cool to need an atomic mechanism for + * locking an existing file, so we can't uses O_EXLOCK. Sigh. + */ + fd = open(device, O_RDWR | O_NOCTTY | O_SYNC); - if (fd == -1) { - fprintf(stderr, "open %s: ", device); - return perror(""), HAL_ERROR_RPC_TRANSPORT; - } + if (fd == -1) + return perror(device), HAL_ERROR_RPC_TRANSPORT; + + if (flock(fd, LOCK_EX) < 0) + return perror(device), HAL_ERROR_RPC_TRANSPORT; if (tcgetattr (fd, &tty) != 0) return perror("tcgetattr"), HAL_ERROR_RPC_TRANSPORT; -- cgit v1.2.3