]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
sctp: Constify struct sctp_sched_ops
authorChristophe JAILLET <christophe.jaillet@wanadoo.fr>
Sat, 25 Oct 2025 07:40:59 +0000 (09:40 +0200)
committerJakub Kicinski <kuba@kernel.org>
Wed, 29 Oct 2025 00:50:55 +0000 (17:50 -0700)
'struct sctp_sched_ops' is not modified in these drivers.

Constifying this structure moves some data to a read-only section, so
increases overall security, especially when the structure holds some
function pointers.

On a x86_64, with allmodconfig, as an example:
Before:
======
   text    data     bss     dec     hex filename
   8019     568       0    8587    218b net/sctp/stream_sched_fc.o

After:
=====
   text    data     bss     dec     hex filename
   8275     312       0    8587    218b net/sctp/stream_sched_fc.o

Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Link: https://patch.msgid.link/dce03527eb7b7cc8a3c26d5cdac12bafe3350135.1761377890.git.christophe.jaillet@wanadoo.fr
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/net/sctp/stream_sched.h
include/net/sctp/structs.h
net/sctp/stream.c
net/sctp/stream_sched.c
net/sctp/stream_sched_fc.c
net/sctp/stream_sched_prio.c
net/sctp/stream_sched_rr.c

index 8034bf5febbe8f2c87f2d5f7570be0031507db76..77806ef1cb70c17d0ac15bb33ee09d0bf11f0a77 100644 (file)
@@ -52,10 +52,10 @@ void sctp_sched_dequeue_done(struct sctp_outq *q, struct sctp_chunk *ch);
 
 void sctp_sched_dequeue_common(struct sctp_outq *q, struct sctp_chunk *ch);
 int sctp_sched_init_sid(struct sctp_stream *stream, __u16 sid, gfp_t gfp);
-struct sctp_sched_ops *sctp_sched_ops_from_stream(struct sctp_stream *stream);
+const struct sctp_sched_ops *sctp_sched_ops_from_stream(struct sctp_stream *stream);
 
 void sctp_sched_ops_register(enum sctp_sched_type sched,
-                            struct sctp_sched_ops *sched_ops);
+                            const struct sctp_sched_ops *sched_ops);
 void sctp_sched_ops_prio_init(void);
 void sctp_sched_ops_rr_init(void);
 void sctp_sched_ops_fc_init(void);
index 3dd304e411d02cc5d6436433432275475f1faef6..5900196d65fd18200b839285b78d80fefa05b6e6 100644 (file)
@@ -1073,7 +1073,7 @@ struct sctp_outq {
        struct list_head out_chunk_list;
 
        /* Stream scheduler being used */
-       struct sctp_sched_ops *sched;
+       const struct sctp_sched_ops *sched;
 
        unsigned int out_qlen;  /* Total length of queued data chunks. */
 
index f205556c5b248c0d7538500c4b7a4c7198d178a5..0615e4426341c8c0a5c1461004a46628f649c035 100644 (file)
@@ -54,7 +54,7 @@ static void sctp_stream_shrink_out(struct sctp_stream *stream, __u16 outcnt)
 
 static void sctp_stream_free_ext(struct sctp_stream *stream, __u16 sid)
 {
-       struct sctp_sched_ops *sched;
+       const struct sctp_sched_ops *sched;
 
        if (!SCTP_SO(stream, sid)->ext)
                return;
@@ -130,7 +130,7 @@ out:
 int sctp_stream_init(struct sctp_stream *stream, __u16 outcnt, __u16 incnt,
                     gfp_t gfp)
 {
-       struct sctp_sched_ops *sched = sctp_sched_ops_from_stream(stream);
+       const struct sctp_sched_ops *sched = sctp_sched_ops_from_stream(stream);
        int i, ret = 0;
 
        gfp |= __GFP_NOWARN;
@@ -182,7 +182,7 @@ int sctp_stream_init_ext(struct sctp_stream *stream, __u16 sid)
 
 void sctp_stream_free(struct sctp_stream *stream)
 {
-       struct sctp_sched_ops *sched = sctp_sched_ops_from_stream(stream);
+       const struct sctp_sched_ops *sched = sctp_sched_ops_from_stream(stream);
        int i;
 
        sched->unsched_all(stream);
@@ -207,7 +207,7 @@ void sctp_stream_clear(struct sctp_stream *stream)
 
 void sctp_stream_update(struct sctp_stream *stream, struct sctp_stream *new)
 {
-       struct sctp_sched_ops *sched = sctp_sched_ops_from_stream(stream);
+       const struct sctp_sched_ops *sched = sctp_sched_ops_from_stream(stream);
 
        sched->unsched_all(stream);
        sctp_stream_outq_migrate(stream, new, new->outcnt);
index 54afbe4fb087200404bdc9b43bd5b5b7088d7b6e..50f8b5240359eb4c07fbec237d67ce8a552b400e 100644 (file)
@@ -91,7 +91,7 @@ static void sctp_sched_fcfs_unsched_all(struct sctp_stream *stream)
 {
 }
 
-static struct sctp_sched_ops sctp_sched_fcfs = {
+static const struct sctp_sched_ops sctp_sched_fcfs = {
        .set = sctp_sched_fcfs_set,
        .get = sctp_sched_fcfs_get,
        .init = sctp_sched_fcfs_init,
@@ -111,10 +111,10 @@ static void sctp_sched_ops_fcfs_init(void)
 
 /* API to other parts of the stack */
 
-static struct sctp_sched_ops *sctp_sched_ops[SCTP_SS_MAX + 1];
+static const struct sctp_sched_ops *sctp_sched_ops[SCTP_SS_MAX + 1];
 
 void sctp_sched_ops_register(enum sctp_sched_type sched,
-                            struct sctp_sched_ops *sched_ops)
+                            const struct sctp_sched_ops *sched_ops)
 {
        sctp_sched_ops[sched] = sched_ops;
 }
@@ -130,7 +130,7 @@ void sctp_sched_ops_init(void)
 
 static void sctp_sched_free_sched(struct sctp_stream *stream)
 {
-       struct sctp_sched_ops *sched = sctp_sched_ops_from_stream(stream);
+       const struct sctp_sched_ops *sched = sctp_sched_ops_from_stream(stream);
        struct sctp_stream_out_ext *soute;
        int i;
 
@@ -148,9 +148,9 @@ static void sctp_sched_free_sched(struct sctp_stream *stream)
 int sctp_sched_set_sched(struct sctp_association *asoc,
                         enum sctp_sched_type sched)
 {
-       struct sctp_sched_ops *old = asoc->outqueue.sched;
+       const struct sctp_sched_ops *old = asoc->outqueue.sched;
        struct sctp_datamsg *msg = NULL;
-       struct sctp_sched_ops *n;
+       const struct sctp_sched_ops *n;
        struct sctp_chunk *ch;
        int i, ret = 0;
 
@@ -263,14 +263,14 @@ void sctp_sched_dequeue_common(struct sctp_outq *q, struct sctp_chunk *ch)
 
 int sctp_sched_init_sid(struct sctp_stream *stream, __u16 sid, gfp_t gfp)
 {
-       struct sctp_sched_ops *sched = sctp_sched_ops_from_stream(stream);
+       const struct sctp_sched_ops *sched = sctp_sched_ops_from_stream(stream);
        struct sctp_stream_out_ext *ext = SCTP_SO(stream, sid)->ext;
 
        INIT_LIST_HEAD(&ext->outq);
        return sched->init_sid(stream, sid, gfp);
 }
 
-struct sctp_sched_ops *sctp_sched_ops_from_stream(struct sctp_stream *stream)
+const struct sctp_sched_ops *sctp_sched_ops_from_stream(struct sctp_stream *stream)
 {
        struct sctp_association *asoc;
 
index 4bd18a497a6dc60b2f34e0171d63d6048ce63a82..776c6de46c2244fc07750cdd7bed9b8a316eb20b 100644 (file)
@@ -188,7 +188,7 @@ static void sctp_sched_fc_unsched_all(struct sctp_stream *stream)
                list_del_init(&soute->fc_list);
 }
 
-static struct sctp_sched_ops sctp_sched_fc = {
+static const struct sctp_sched_ops sctp_sched_fc = {
        .set = sctp_sched_fc_set,
        .get = sctp_sched_fc_get,
        .init = sctp_sched_fc_init,
@@ -206,7 +206,7 @@ void sctp_sched_ops_fc_init(void)
        sctp_sched_ops_register(SCTP_SS_FC, &sctp_sched_fc);
 }
 
-static struct sctp_sched_ops sctp_sched_wfq = {
+static const struct sctp_sched_ops sctp_sched_wfq = {
        .set = sctp_sched_wfq_set,
        .get = sctp_sched_wfq_get,
        .init = sctp_sched_fc_init,
index 4d4d9da331f4c3b06e45b767376ce8bb63c60cb5..fb6c55e5615df4527bff72b79f32d7f3ac4d7104 100644 (file)
@@ -300,7 +300,7 @@ static void sctp_sched_prio_unsched_all(struct sctp_stream *stream)
                        sctp_sched_prio_unsched(soute);
 }
 
-static struct sctp_sched_ops sctp_sched_prio = {
+static const struct sctp_sched_ops sctp_sched_prio = {
        .set = sctp_sched_prio_set,
        .get = sctp_sched_prio_get,
        .init = sctp_sched_prio_init,
index 1f235e7f643a73ad9e633bd98c1437525132e5b7..9157b653f19615a080b2e5c40d32ad4f835f448e 100644 (file)
@@ -171,7 +171,7 @@ static void sctp_sched_rr_unsched_all(struct sctp_stream *stream)
                sctp_sched_rr_unsched(stream, soute);
 }
 
-static struct sctp_sched_ops sctp_sched_rr = {
+static const struct sctp_sched_ops sctp_sched_rr = {
        .set = sctp_sched_rr_set,
        .get = sctp_sched_rr_get,
        .init = sctp_sched_rr_init,