sysctl: treewide: constify argument ctl_table_root::permissions(table)
authorThomas Weißschuh <linux@weissschuh.net>
Fri, 15 Mar 2024 18:11:31 +0000 (19:11 +0100)
committerJoel Granados <j.granados@samsung.com>
Wed, 24 Apr 2024 07:43:54 +0000 (09:43 +0200)
The permissions callback should not modify the ctl_table. Enforce this
expectation via the typesystem. This is a step to put "struct ctl_table"
into .rodata throughout the kernel.

The patch was created with the following coccinelle script:

  @@
  identifier func, head, ctl;
  @@

  int func(
    struct ctl_table_header *head,
  - struct ctl_table *ctl)
  + const struct ctl_table *ctl)
  { ... }

(insert_entry() from fs/proc/proc_sysctl.c is a false-positive)

No additional occurrences of '.permissions =' were found after a
tree-wide search for places missed by the conccinelle script.

Reviewed-by: Joel Granados <j.granados@samsung.com>
Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
Signed-off-by: Joel Granados <j.granados@samsung.com>
include/linux/sysctl.h
ipc/ipc_sysctl.c
ipc/mq_sysctl.c
kernel/ucount.c
net/sysctl_net.c

index 60333a6b9370ad3ab0cb469e56d2aaf9b66b549a..f9214de0490c41d4fb06ff68264105d8b3841a1f 100644 (file)
@@ -206,7 +206,7 @@ struct ctl_table_root {
        struct ctl_table_set *(*lookup)(struct ctl_table_root *root);
        void (*set_ownership)(struct ctl_table_header *head,
                              kuid_t *uid, kgid_t *gid);
-       int (*permissions)(struct ctl_table_header *head, struct ctl_table *table);
+       int (*permissions)(struct ctl_table_header *head, const struct ctl_table *table);
 };
 
 #define register_sysctl(path, table)   \
index 1a5085e5b1785cf712d2ea3b0753d6668babb0fb..19b2a67aef406875359045b45dcf7d508037c9d7 100644 (file)
@@ -204,7 +204,7 @@ static void ipc_set_ownership(struct ctl_table_header *head,
        *gid = gid_valid(ns_root_gid) ? ns_root_gid : GLOBAL_ROOT_GID;
 }
 
-static int ipc_permissions(struct ctl_table_header *head, struct ctl_table *table)
+static int ipc_permissions(struct ctl_table_header *head, const struct ctl_table *table)
 {
        int mode = table->mode;
 
index 6bb1c5397c69b950af0e3da51046f1e805b6d14a..43c0825da9e8b771ca53993f4bfcec1a258427e5 100644 (file)
@@ -90,7 +90,7 @@ static void mq_set_ownership(struct ctl_table_header *head,
        *gid = gid_valid(ns_root_gid) ? ns_root_gid : GLOBAL_ROOT_GID;
 }
 
-static int mq_permissions(struct ctl_table_header *head, struct ctl_table *table)
+static int mq_permissions(struct ctl_table_header *head, const struct ctl_table *table)
 {
        int mode = table->mode;
        kuid_t ns_root_uid;
index e196da0204dcb5773e1f94e539e1c8e2502b21ca..4d5b9c12c014226028e317ad649b8a69294b8834 100644 (file)
@@ -38,7 +38,7 @@ static int set_is_seen(struct ctl_table_set *set)
 }
 
 static int set_permissions(struct ctl_table_header *head,
-                                 struct ctl_table *table)
+                          const struct ctl_table *table)
 {
        struct user_namespace *user_ns =
                container_of(head->set, struct user_namespace, set);
index a0a7a79991f9ffa89d80916e89454b470a48285b..f5017012a049312a826b3e382ff9381bc4a25410 100644 (file)
@@ -40,7 +40,7 @@ static int is_seen(struct ctl_table_set *set)
 
 /* Return standard mode bits for table entry. */
 static int net_ctl_permissions(struct ctl_table_header *head,
-                              struct ctl_table *table)
+                              const struct ctl_table *table)
 {
        struct net *net = container_of(head->set, struct net, sysctls);