aboutsummaryrefslogtreecommitdiff
path: root/rpc_serial.c
diff options
context:
space:
mode:
authorRob Austein <sra@hactrn.net>2016-08-16 18:52:47 -0400
committerRob Austein <sra@hactrn.net>2016-08-16 18:52:47 -0400
commit0166b1b370862ab34335af3d5710304dc3546499 (patch)
treed417e792573c6cc120a81119564e6a4188762b77 /rpc_serial.c
parent3822886e6e945d45b3c5b0a3d6fa4758dad07487 (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.c15
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;