Browse Source

import updated landloc.h

shtrophic 3 months ago
parent
commit
1a44f56372
1 changed files with 82 additions and 32 deletions
  1. 82 32
      landloc.h

+ 82 - 32
landloc.h

@@ -65,9 +65,13 @@ int main(void) {
 #define __LANDLOC_H__
 
 #ifndef __linux__
-#error "no landlock without linux"
+#   error "no landlock without linux"
 #endif
 
+#include <linux/version.h>
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 13, 0)
+
 #include <unistd.h>
 #include <linux/landlock.h>
 #include <sys/syscall.h>
@@ -75,53 +79,89 @@ int main(void) {
 #include <fcntl.h>
 
 #ifndef O_PATH
-#define O_PATH		010000000
+#   define O_PATH		010000000
 #endif
 
 #ifndef LL_PRINTERR
-#define LL_PRINTERR(fmt, ...) (void)fmt;
+#   define LL_PRINTERR(fmt, ...) (void)fmt;
 #else
-#include <string.h>
-#include <errno.h>
+#   include <string.h>
+#   include <errno.h>
 #endif
 
-#define LL_FS_ALL                   (\
-    LANDLOCK_ACCESS_FS_EXECUTE      |\
-    LANDLOCK_ACCESS_FS_WRITE_FILE   |\
-    LANDLOCK_ACCESS_FS_READ_FILE    |\
-    LANDLOCK_ACCESS_FS_READ_DIR     |\
-    LANDLOCK_ACCESS_FS_REMOVE_DIR   |\
-    LANDLOCK_ACCESS_FS_REMOVE_FILE  |\
-    LANDLOCK_ACCESS_FS_MAKE_CHAR    |\
-    LANDLOCK_ACCESS_FS_MAKE_DIR     |\
-    LANDLOCK_ACCESS_FS_MAKE_REG     |\
-    LANDLOCK_ACCESS_FS_MAKE_SOCK    |\
-    LANDLOCK_ACCESS_FS_MAKE_FIFO    |\
-    LANDLOCK_ACCESS_FS_MAKE_BLOCK   |\
-    LANDLOCK_ACCESS_FS_MAKE_SYM     |\
-    LANDLOCK_ACCESS_FS_REFER        |\
-    LANDLOCK_ACCESS_FS_TRUNCATE     |\
-    LANDLOCK_ACCESS_FS_IOCTL_DEV    )
-
-#define LL_NET_ALL                  (\
-    LANDLOCK_ACCESS_NET_BIND_TCP    |\
-    LANDLOCK_ACCESS_NET_CONNECT_TCP )
+#ifdef LANDLOCK_ACCESS_FS_REFER
+#   define __LL_FS_REFER_COMPAT LANDLOCK_ACCESS_FS_REFER
+#   define __LL_SWITCH_FS_REFER __rattr.handled_access_fs &= ~__LL_FS_REFER_COMPAT
+#else
+#   define __LL_FS_REFER_COMPAT 0
+#   define __LL_SWITCH_FS_REFER (void)0
+#endif
+
+#ifdef LANDLOCK_ACCESS_FS_TRUNCATE
+#   define __LL_FS_TRUNCATE_COMPAT LANDLOCK_ACCESS_FS_TRUNCATE
+#   define __LL_SWITCH_FS_TRUNCATE __rattr.handled_access_fs  &= ~__LL_FS_TRUNCATE_COMPAT
+#else
+#   define __LL_FS_TRUNCATE_COMPAT 0
+#   define __LL_SWITCH_FS_TRUNCATE (void)0
+#endif
+
+#ifdef LANDLOCK_ACCESS_FS_IOCTL_DEV
+#   define __LL_FS_IOCTL_DEV_COMPAT LANDLOCK_ACCESS_FS_IOCTL_DEV
+#   define __LL_SWITCH_FS_IOCTL_DEV __rattr.handled_access_fs &= ~__LL_FS_IOCTL_DEV_COMPAT
+#else
+#   define __LL_FS_IOCTL_DEV_COMPAT 0
+#   define __LL_SWITCH_FS_IOCTL_DEV (void)0
+#endif
+
+#define LL_FS_ALL                       (\
+    LANDLOCK_ACCESS_FS_EXECUTE          |\
+    LANDLOCK_ACCESS_FS_WRITE_FILE       |\
+    LANDLOCK_ACCESS_FS_READ_FILE        |\
+    LANDLOCK_ACCESS_FS_READ_DIR         |\
+    LANDLOCK_ACCESS_FS_REMOVE_DIR       |\
+    LANDLOCK_ACCESS_FS_REMOVE_FILE      |\
+    LANDLOCK_ACCESS_FS_MAKE_CHAR        |\
+    LANDLOCK_ACCESS_FS_MAKE_DIR         |\
+    LANDLOCK_ACCESS_FS_MAKE_REG         |\
+    LANDLOCK_ACCESS_FS_MAKE_SOCK        |\
+    LANDLOCK_ACCESS_FS_MAKE_FIFO        |\
+    LANDLOCK_ACCESS_FS_MAKE_BLOCK       |\
+    LANDLOCK_ACCESS_FS_MAKE_SYM         |\
+    __LL_FS_REFER_COMPAT                |\
+    __LL_FS_TRUNCATE_COMPAT             |\
+    __LL_FS_IOCTL_DEV_COMPAT            )
+
+#if defined(LANDLOCK_ACCESS_NET_BIND_TCP) && defined(LANDLOCK_ACCESS_NET_CONNECT_TCP)
+#   define __LL_HAVE_NET
+#endif
+
+#ifdef __LL_HAVE_NET
+#   define LL_NET_ALL (LANDLOCK_ACCESS_NET_BIND_TCP | LANDLOCK_ACCESS_NET_CONNECT_TCP)
+#   define __LL_DECLARE_NET struct landlock_net_port_attr __nattr = {0}
+#   define __LL_INIT_NET __rattr.handled_access_net = LL_NET_ALL
+#   define __LL_SWITCH_NET do { __rattr.handled_access_net &= ~(LANDLOCK_ACCESS_NET_BIND_TCP | LANDLOCK_ACCESS_NET_CONNECT_TCP); } while (0)
+#else
+#   define LL_NET_ALL 0
+#   define __LL_DECLARE_NET (void)0
+#   define __LL_INIT_NET (void)0
+#   define __LL_SWITCH_NET (void)0
+#endif
 
 #define LL_BEGIN(function, ...) int function(__VA_ARGS__) {\
     int ll_rule_fd, ll_abi;\
     struct landlock_ruleset_attr      __rattr = {0};\
     struct landlock_path_beneath_attr __pattr = {0};\
-    struct landlock_net_port_attr     __nattr = {0};\
+    __LL_DECLARE_NET;\
     int __err = 0;\
     __rattr.handled_access_fs  = LL_FS_ALL;\
-    __rattr.handled_access_net = LL_NET_ALL;\
+    __LL_INIT_NET;\
     ll_abi = (int)syscall(SYS_landlock_create_ruleset, NULL, 0, LANDLOCK_CREATE_RULESET_VERSION);\
     switch (ll_abi) {\
     case -1: return -1;\
-    case  1: __rattr.handled_access_fs  &= ~LANDLOCK_ACCESS_FS_REFER; __attribute__((fallthrough));\
-    case  2: __rattr.handled_access_fs  &= ~LANDLOCK_ACCESS_FS_TRUNCATE; __attribute__((fallthrough));\
-    case  3: __rattr.handled_access_net &= ~(LANDLOCK_ACCESS_NET_BIND_TCP | LANDLOCK_ACCESS_NET_CONNECT_TCP); __attribute__((fallthrough));\
-    case  4: __rattr.handled_access_fs &= ~LANDLOCK_ACCESS_FS_IOCTL_DEV;\
+    case  1: __LL_SWITCH_FS_REFER; __attribute__((fallthrough));\
+    case  2: __LL_SWITCH_FS_TRUNCATE; __attribute__((fallthrough));\
+    case  3: __LL_SWITCH_NET; __attribute__((fallthrough));\
+    case  4: __LL_SWITCH_FS_IOCTL_DEV;\
     default: break;\
     }\
     ll_rule_fd = (int)syscall(SYS_landlock_create_ruleset, &__rattr, sizeof(struct landlock_ruleset_attr), 0);\
@@ -159,6 +199,8 @@ int main(void) {
     close(__pattr.parent_fd);\
 } while (0)
 
+#ifdef __LL_HAVE_NET
+
 #define LL_PORT(p, rules) do {\
     unsigned short __port = (p);\
     __nattr.allowed_access = (rules);\
@@ -172,4 +214,12 @@ int main(void) {
     }\
 } while (0)
 
+#else
+
+#define LL_PORT(p, rules) do { (void)p; (void)rules; } while (0)
+
+#endif /* __LL_HAVE_NET */
+
+#endif /* KERNEL_VERSION(5, 13, 0) */
+
 #endif /* __LANDLOC_H__ */