]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
selinux-util: mac_selinux_get_peer_label()
authorIvan Kruglov <mail@ikruglov.com>
Thu, 3 Jul 2025 11:53:23 +0000 (04:53 -0700)
committerIvan Kruglov <mail@ikruglov.com>
Thu, 10 Jul 2025 19:06:51 +0000 (21:06 +0200)
src/shared/selinux-util.c
src/shared/selinux-util.h
src/test/test-selinux.c

index baf5dc5c4a4296b962a42bda4b948ca25305be1c..439494f82b50efda9db7fbeb0444c5ef79cc71ca 100644 (file)
@@ -471,6 +471,32 @@ int mac_selinux_get_our_label(char **ret_label) {
 #endif
 }
 
+int mac_selinux_get_peer_label(int socket_fd, char **ret_label) {
+        assert(socket_fd >= 0);
+        assert(ret_label);
+
+#if HAVE_SELINUX
+        int r;
+
+        r = selinux_init(/* force= */ false);
+        if (r < 0)
+                return r;
+        if (r == 0)
+                return -EOPNOTSUPP;
+
+        _cleanup_freecon_ char *con = NULL;
+        if (getpeercon_raw(socket_fd, &con) < 0)
+                return -errno;
+        if (!con)
+                return -EOPNOTSUPP;
+
+        *ret_label = TAKE_PTR(con);
+        return 0;
+#else
+        return -EOPNOTSUPP;
+#endif
+}
+
 int mac_selinux_get_child_mls_label(int socket_fd, const char *exe, const char *exec_label, char **ret_label) {
 #if HAVE_SELINUX
         _cleanup_freecon_ char *mycon = NULL, *peercon = NULL, *fcon = NULL;
index a9180c4c9969ecc7ecf53a6bfa20a412d5b8655f..1ba1ad1407b3ff10f225d18b48562c6d18060a57 100644 (file)
@@ -35,6 +35,7 @@ int mac_selinux_apply_fd(int fd, const char *path, const char *label);
 
 int mac_selinux_get_create_label_from_exe(const char *exe, char **ret_label);
 int mac_selinux_get_our_label(char **ret_label);
+int mac_selinux_get_peer_label(int socket_fd, char **ret_label);
 int mac_selinux_get_child_mls_label(int socket_fd, const char *exe, const char *exec_label, char **ret_label);
 
 int mac_selinux_create_file_prepare_at(int dirfd, const char *path, mode_t mode);
index e51b3a283b1fc5ff50d08ed6ce091c8255484580..93e30896b7e41fa2ca52fe516d15103fefe4fe2d 100644 (file)
@@ -53,7 +53,7 @@ static void test_cleanup(void) {
 }
 
 static void test_misc(const char* fname) {
-        _cleanup_freecon_ char *label = NULL, *label2 = NULL, *label3 = NULL;
+        _cleanup_freecon_ char *label = NULL, *label2 = NULL, *label3 = NULL, *label4 = NULL;
         int r;
         _cleanup_close_ int fd = -EBADF;
 
@@ -73,6 +73,10 @@ static void test_misc(const char* fname) {
         r = mac_selinux_get_child_mls_label(fd, fname, label2, &label3);
         log_info_errno(r, "mac_selinux_get_child_mls_label → %d, \"%s\" (%m)",
                        r, strnull(label3));
+
+        r = mac_selinux_get_peer_label(fd, &label4);
+        log_info_errno(r, "mac_selinux_get_peer_label → %d, \"%s\" (%m)",
+                       r, strnull(label4));
 }
 
 static void test_create_file_prepare(const char* fname) {