diff options
author | Rob Austein <sra@hactrn.net> | 2016-08-16 18:52:47 -0400 |
---|---|---|
committer | Rob Austein <sra@hactrn.net> | 2016-08-16 18:52:47 -0400 |
commit | 0166b1b370862ab34335af3d5710304dc3546499 (patch) | |
tree | d417e792573c6cc120a81119564e6a4188762b77 /rpc_serial.c | |
parent | 3822886e6e945d45b3c5b0a3d6fa4758dad07487 (diff) |
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.
Diffstat (limited to 'rpc_serial.c')
-rw-r--r-- | rpc_serial.c | 15 |
1 files 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 <stdio.h> #include <sys/types.h> #include <sys/socket.h> +#include <sys/file.h> #include <netinet/in.h> #include <termios.h> #include <unistd.h> @@ -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; |