Blame SOURCES/opencryptoki-3.16.0-e9548127edae313da7840bcb87fd0afd04549c2e.patch

9c2944
commit e9548127edae313da7840bcb87fd0afd04549c2e
9c2944
Author: Ingo Franzki <ifranzki@linux.ibm.com>
9c2944
Date:   Mon Feb 8 15:26:23 2021 +0100
9c2944
9c2944
    pkcsslotd: Refactoring in preparation for event support
9c2944
    
9c2944
    No functional change so far, just making things a bit bore clearer.
9c2944
    
9c2944
    Signed-off-by: Ingo Franzki <ifranzki@linux.ibm.com>
9c2944
9c2944
diff --git a/usr/include/slotmgr.h b/usr/include/slotmgr.h
9c2944
index 3950a9a3..4d038435 100644
9c2944
--- a/usr/include/slotmgr.h
9c2944
+++ b/usr/include/slotmgr.h
9c2944
@@ -30,7 +30,7 @@
9c2944
 #define TOK_PATH  SBIN_PATH "/pkcsslotd"
9c2944
 #define OCK_API_LOCK_FILE LOCKDIR_PATH "/LCK..APIlock"
9c2944
 
9c2944
-#define SOCKET_FILE_PATH "/var/run/pkcsslotd.socket"
9c2944
+#define PROC_SOCKET_FILE_PATH "/var/run/pkcsslotd.socket"
9c2944
 
9c2944
 #define PID_FILE_PATH "/var/run/pkcsslotd.pid"
9c2944
 #define OCK_CONFIG OCK_CONFDIR "/opencryptoki.conf"
9c2944
diff --git a/usr/lib/api/api_interface.c b/usr/lib/api/api_interface.c
9c2944
index b74b763f..2873a20a 100644
9c2944
--- a/usr/lib/api/api_interface.c
9c2944
+++ b/usr/lib/api/api_interface.c
9c2944
@@ -2831,7 +2831,7 @@ CK_RV C_Initialize(CK_VOID_PTR pVoid)
9c2944
     TRACE_DEBUG("Shared memory %p \n", Anchor->SharedMemP);
9c2944
 
9c2944
     /* Connect to slot daemon and retrieve slot infos */
9c2944
-    Anchor->socketfd = connect_socket(SOCKET_FILE_PATH);
9c2944
+    Anchor->socketfd = connect_socket(PROC_SOCKET_FILE_PATH);
9c2944
     if (Anchor->socketfd < 0) {
9c2944
         OCK_SYSLOG(LOG_ERR, "C_Initialize: Module failed to create a "
9c2944
                    "socket. Verify that the slot management daemon is "
9c2944
diff --git a/usr/sbin/pkcsslotd/pkcsslotd.h b/usr/sbin/pkcsslotd/pkcsslotd.h
9c2944
index 813db9f4..69eb59f3 100644
9c2944
--- a/usr/sbin/pkcsslotd/pkcsslotd.h
9c2944
+++ b/usr/sbin/pkcsslotd/pkcsslotd.h
9c2944
@@ -61,7 +61,6 @@ extern key_t tok;
9c2944
 extern Slot_Info_t_64 sinfo[NUMBER_SLOTS_MANAGED];
9c2944
 extern unsigned int NumberSlotsInDB;
9c2944
 
9c2944
-extern int socketfd;
9c2944
 extern Slot_Mgr_Socket_t socketData;
9c2944
 
9c2944
 
9c2944
@@ -89,9 +88,9 @@ int XProcLock(void);
9c2944
 int XProcUnLock(void);
9c2944
 int CreateXProcLock(void);
9c2944
 
9c2944
-int CreateListenerSocket(void);
9c2944
-int InitSocketData(Slot_Mgr_Socket_t *sp);
9c2944
-int SocketConnectionHandler(int socketfd, int timeout_secs);
9c2944
-void DetachSocketListener(int socketfd);
9c2944
+int init_socket_server();
9c2944
+int term_socket_server();
9c2944
+int init_socket_data(Slot_Mgr_Socket_t *sp);
9c2944
+int socket_connection_handler(int timeout_secs);
9c2944
 
9c2944
 #endif                          /* _SLOTMGR_H */
9c2944
diff --git a/usr/sbin/pkcsslotd/signal.c b/usr/sbin/pkcsslotd/signal.c
9c2944
index cf7b9087..49482a2f 100644
9c2944
--- a/usr/sbin/pkcsslotd/signal.c
9c2944
+++ b/usr/sbin/pkcsslotd/signal.c
9c2944
@@ -101,7 +101,7 @@ void slotdGenericSignalHandler(int Signal)
9c2944
 
9c2944
     InfoLog("Exiting on %s (%d; %#x)", SignalConst(Signal), Signal, Signal);
9c2944
 
9c2944
-    DetachSocketListener(socketfd);
9c2944
+    term_socket_server();
9c2944
     DestroyMutexes();
9c2944
     DetachFromSharedMemory();
9c2944
     DestroySharedMemory();
9c2944
diff --git a/usr/sbin/pkcsslotd/slotmgr.c b/usr/sbin/pkcsslotd/slotmgr.c
9c2944
index ea5c86f5..94288f13 100644
9c2944
--- a/usr/sbin/pkcsslotd/slotmgr.c
9c2944
+++ b/usr/sbin/pkcsslotd/slotmgr.c
9c2944
@@ -37,7 +37,6 @@ unsigned int NumberSlotsInDB = 0;
9c2944
 
9c2944
 Slot_Info_t_64 *psinfo;
9c2944
 
9c2944
-int socketfd;
9c2944
 Slot_Mgr_Socket_t socketData;
9c2944
 
9c2944
 struct dircheckinfo_s {
9c2944
@@ -569,15 +568,15 @@ int main(int argc, char *argv[], char *envp[])
9c2944
     if (!XProcUnLock())
9c2944
         return 4;
9c2944
 
9c2944
-    if ((socketfd = CreateListenerSocket()) < 0) {
9c2944
+    if (!init_socket_server()) {
9c2944
         DestroyMutexes();
9c2944
         DetachFromSharedMemory();
9c2944
         DestroySharedMemory();
9c2944
         return 5;
9c2944
     }
9c2944
 
9c2944
-    if (!InitSocketData(&socketData)) {
9c2944
-        DetachSocketListener(socketfd);
9c2944
+    if (!init_socket_data(&socketData)) {
9c2944
+        term_socket_server();
9c2944
         DestroyMutexes();
9c2944
         DetachFromSharedMemory();
9c2944
         DestroySharedMemory();
9c2944
@@ -598,7 +597,7 @@ int main(int argc, char *argv[], char *envp[])
9c2944
     if (Daemon) {
9c2944
         pid_t pid;
9c2944
         if ((pid = fork()) < 0) {
9c2944
-            DetachSocketListener(socketfd);
9c2944
+            term_socket_server();
9c2944
             DestroyMutexes();
9c2944
             DetachFromSharedMemory();
9c2944
             DestroySharedMemory();
9c2944
@@ -643,7 +642,7 @@ int main(int argc, char *argv[], char *envp[])
9c2944
      * the daemonization process redefines our handler for (at least) SIGTERM
9c2944
      */
9c2944
     if (!SetupSignalHandlers()) {
9c2944
-        DetachSocketListener(socketfd);
9c2944
+        term_socket_server();
9c2944
         DestroyMutexes();
9c2944
         DetachFromSharedMemory();
9c2944
         DestroySharedMemory();
9c2944
@@ -664,7 +663,7 @@ int main(int argc, char *argv[], char *envp[])
9c2944
     printf("Start garbage \n");
9c2944
     /* start garbage collection thread */
9c2944
     if (!StartGCThread(shmp)) {
9c2944
-        DetachSocketListener(socketfd);
9c2944
+        term_socket_server();
9c2944
         DestroyMutexes();
9c2944
         DetachFromSharedMemory();
9c2944
         DestroySharedMemory();
9c2944
@@ -684,7 +683,7 @@ int main(int argc, char *argv[], char *envp[])
9c2944
 #if !(THREADED) && !(NOGARBAGE)
9c2944
         CheckForGarbage(shmp);
9c2944
 #endif
9c2944
-        SocketConnectionHandler(socketfd, 10);
9c2944
+        socket_connection_handler(10);
9c2944
     }
9c2944
 
9c2944
     /*************************************************************
9c2944
diff --git a/usr/sbin/pkcsslotd/socket_server.c b/usr/sbin/pkcsslotd/socket_server.c
9c2944
index ae0eff92..1fae0b95 100644
9c2944
--- a/usr/sbin/pkcsslotd/socket_server.c
9c2944
+++ b/usr/sbin/pkcsslotd/socket_server.c
9c2944
@@ -25,10 +25,14 @@
9c2944
 #include "pkcsslotd.h"
9c2944
 #include "apictl.h"
9c2944
 
9c2944
+int proc_listener_socket = -1;
9c2944
+
9c2944
+static void close_listener_socket(int socketfd, const char *file_path);
9c2944
+
9c2944
 // Creates the daemon's listener socket, to which clients will connect and
9c2944
 // retrieve slot information through.  Returns the file descriptor of the
9c2944
 // created socket.
9c2944
-int CreateListenerSocket(void)
9c2944
+static int create_listener_socket(const char *file_path)
9c2944
 {
9c2944
     struct sockaddr_un address;
9c2944
     struct group *grp;
9c2944
@@ -39,53 +43,60 @@ int CreateListenerSocket(void)
9c2944
         ErrLog("Failed to create listener socket, errno 0x%X.", errno);
9c2944
         return -1;
9c2944
     }
9c2944
-    if (unlink(SOCKET_FILE_PATH) && errno != ENOENT) {
9c2944
+    if (unlink(file_path) && errno != ENOENT) {
9c2944
         ErrLog("Failed to unlink socket file, errno 0x%X.", errno);
9c2944
-        close(socketfd);
9c2944
-        return -1;
9c2944
+        goto error;
9c2944
     }
9c2944
 
9c2944
     memset(&address, 0, sizeof(struct sockaddr_un));
9c2944
     address.sun_family = AF_UNIX;
9c2944
-    strcpy(address.sun_path, SOCKET_FILE_PATH);
9c2944
+    strcpy(address.sun_path, file_path);
9c2944
 
9c2944
     if (bind(socketfd,
9c2944
              (struct sockaddr *) &address, sizeof(struct sockaddr_un)) != 0) {
9c2944
         ErrLog("Failed to bind to socket, errno 0x%X.", errno);
9c2944
-        close(socketfd);
9c2944
-        return -1;
9c2944
+        goto error;
9c2944
     }
9c2944
     // make socket file part of the pkcs11 group, and write accessable
9c2944
     // for that group
9c2944
     grp = getgrnam("pkcs11");
9c2944
     if (!grp) {
9c2944
         ErrLog("Group PKCS#11 does not exist");
9c2944
-        DetachSocketListener(socketfd);
9c2944
-        return -1;
9c2944
+        goto error;
9c2944
     }
9c2944
-    if (chown(SOCKET_FILE_PATH, 0, grp->gr_gid)) {
9c2944
+    if (chown(file_path, 0, grp->gr_gid)) {
9c2944
         ErrLog("Could not change file group on socket, errno 0x%X.", errno);
9c2944
-        DetachSocketListener(socketfd);
9c2944
-        return -1;
9c2944
+        goto error;
9c2944
     }
9c2944
-    if (chmod(SOCKET_FILE_PATH,
9c2944
+    if (chmod(file_path,
9c2944
               S_IRUSR | S_IRGRP | S_IWUSR | S_IWGRP | S_IXUSR | S_IXGRP)) {
9c2944
         ErrLog("Could not change file permissions on socket, errno 0x%X.",
9c2944
                errno);
9c2944
-        DetachSocketListener(socketfd);
9c2944
-        return -1;
9c2944
+        goto error;
9c2944
     }
9c2944
 
9c2944
     if (listen(socketfd, 20) != 0) {
9c2944
         ErrLog("Failed to listen to socket, errno 0x%X.", errno);
9c2944
-        DetachSocketListener(socketfd);
9c2944
-        return -1;
9c2944
+        goto error;
9c2944
     }
9c2944
 
9c2944
     return socketfd;
9c2944
+
9c2944
+error:
9c2944
+    if (socketfd >= 0)
9c2944
+        close_listener_socket(socketfd, file_path);
9c2944
+
9c2944
+    return -1;
9c2944
+}
9c2944
+
9c2944
+
9c2944
+static void close_listener_socket(int socketfd, const char *file_path)
9c2944
+{
9c2944
+    close(socketfd);
9c2944
+    unlink(file_path);
9c2944
 }
9c2944
 
9c2944
-int InitSocketData(Slot_Mgr_Socket_t *socketData)
9c2944
+int init_socket_data(Slot_Mgr_Socket_t *socketData)
9c2944
 {
9c2944
     unsigned int processed = 0;
9c2944
 
9c2944
@@ -102,19 +113,19 @@ int InitSocketData(Slot_Mgr_Socket_t *socketData)
9c2944
     return TRUE;
9c2944
 }
9c2944
 
9c2944
-int SocketConnectionHandler(int socketfd, int timeout_secs)
9c2944
+int socket_connection_handler(int timeout_secs)
9c2944
 {
9c2944
     int returnVal;
9c2944
     fd_set set;
9c2944
     struct timeval timeout;
9c2944
 
9c2944
     FD_ZERO(&set);
9c2944
-    FD_SET(socketfd, &set);
9c2944
+    FD_SET(proc_listener_socket, &set);
9c2944
 
9c2944
     timeout.tv_sec = timeout_secs;
9c2944
     timeout.tv_usec = 0;
9c2944
 
9c2944
-    returnVal = select(socketfd + 1, &set, NULL, NULL, &timeout);
9c2944
+    returnVal = select(proc_listener_socket + 1, &set, NULL, NULL, &timeout);
9c2944
     if (returnVal == -1) {
9c2944
         ErrLog("select failed on socket connection, errno 0x%X.", errno);
9c2944
         return FALSE;
9c2944
@@ -125,7 +136,7 @@ int SocketConnectionHandler(int socketfd, int timeout_secs)
9c2944
         struct sockaddr_un address;
9c2944
         socklen_t address_length = sizeof(address);
9c2944
 
9c2944
-        int connectionfd = accept(socketfd,
9c2944
+        int connectionfd = accept(proc_listener_socket,
9c2944
                                   (struct sockaddr *) &address,
9c2944
                                   &address_length);
9c2944
         if (connectionfd < 0) {
9c2944
@@ -138,6 +149,10 @@ int SocketConnectionHandler(int socketfd, int timeout_secs)
9c2944
             }
9c2944
             return FALSE;
9c2944
         }
9c2944
+
9c2944
+        DbgLog(DL0, "Accepted connection from process: socket: %d", 
9c2944
+               connectionfd);
9c2944
+
9c2944
         if (write(connectionfd, &socketData, sizeof(socketData)) !=
9c2944
             sizeof(socketData)) {
9c2944
             ErrLog("Failed to write socket data, errno 0x%X.", errno);
9c2944
@@ -149,8 +164,23 @@ int SocketConnectionHandler(int socketfd, int timeout_secs)
9c2944
     }
9c2944
 }
9c2944
 
9c2944
-void DetachSocketListener(int socketfd)
9c2944
+int init_socket_server()
9c2944
 {
9c2944
-    close(socketfd);
9c2944
-    unlink(SOCKET_FILE_PATH);
9c2944
+    proc_listener_socket = create_listener_socket(PROC_SOCKET_FILE_PATH);
9c2944
+    if (proc_listener_socket < 0)
9c2944
+        return FALSE;
9c2944
+
9c2944
+    DbgLog(DL0, "Socket server started");
9c2944
+
9c2944
+    return TRUE;
9c2944
+}
9c2944
+
9c2944
+int term_socket_server()
9c2944
+{
9c2944
+    if (proc_listener_socket >= 0)
9c2944
+        close_listener_socket(proc_listener_socket, PROC_SOCKET_FILE_PATH);
9c2944
+
9c2944
+    DbgLog(DL0, "Socket server stopped");
9c2944
+
9c2944
+    return TRUE;
9c2944
 }