sctp: delete the nested flexible array variable
authorXin Long <lucien.xin@gmail.com>
Wed, 19 Apr 2023 15:16:30 +0000 (11:16 -0400)
committerDavid S. Miller <davem@davemloft.net>
Fri, 21 Apr 2023 07:19:29 +0000 (08:19 +0100)
This patch deletes the flexible-array variable[] from the structure
sctp_sackhdr and sctp_errhdr to avoid some sparse warnings:

  # make C=2 CF="-Wflexible-array-nested" M=./net/sctp/
  net/sctp/sm_statefuns.c: note: in included file (through include/net/sctp/structs.h, include/net/sctp/sctp.h):
  ./include/linux/sctp.h:451:28: warning: nested flexible array
  ./include/linux/sctp.h:393:29: warning: nested flexible array

Signed-off-by: Xin Long <lucien.xin@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/sctp.h
net/sctp/outqueue.c
net/sctp/sm_sideeffect.c
net/sctp/sm_statefuns.c

index 9815b80..01a0eb7 100644 (file)
@@ -385,7 +385,7 @@ struct sctp_sackhdr {
        __be32 a_rwnd;
        __be16 num_gap_ack_blocks;
        __be16 num_dup_tsns;
-       union sctp_sack_variable variable[];
+       /* union sctp_sack_variable variable[]; */
 };
 
 struct sctp_sack_chunk {
@@ -443,7 +443,7 @@ struct sctp_shutdown_chunk {
 struct sctp_errhdr {
        __be16 cause;
        __be16 length;
-       __u8  variable[];
+       /* __u8  variable[]; */
 };
 
 struct sctp_operr_chunk {
index 2083107..0dc6b8a 100644 (file)
@@ -1231,7 +1231,7 @@ static void sctp_sack_update_unack_data(struct sctp_association *assoc,
 
        unack_data = assoc->next_tsn - assoc->ctsn_ack_point - 1;
 
-       frags = sack->variable;
+       frags = (union sctp_sack_variable *)(sack + 1);
        for (i = 0; i < ntohs(sack->num_gap_ack_blocks); i++) {
                unack_data -= ((ntohs(frags[i].gab.end) -
                                ntohs(frags[i].gab.start) + 1));
@@ -1252,7 +1252,6 @@ int sctp_outq_sack(struct sctp_outq *q, struct sctp_chunk *chunk)
        struct sctp_transport *transport;
        struct sctp_chunk *tchunk = NULL;
        struct list_head *lchunk, *transport_list, *temp;
-       union sctp_sack_variable *frags = sack->variable;
        __u32 sack_ctsn, ctsn, tsn;
        __u32 highest_tsn, highest_new_tsn;
        __u32 sack_a_rwnd;
@@ -1313,8 +1312,12 @@ int sctp_outq_sack(struct sctp_outq *q, struct sctp_chunk *chunk)
 
        /* Get the highest TSN in the sack. */
        highest_tsn = sack_ctsn;
-       if (gap_ack_blocks)
+       if (gap_ack_blocks) {
+               union sctp_sack_variable *frags =
+                       (union sctp_sack_variable *)(sack + 1);
+
                highest_tsn += ntohs(frags[gap_ack_blocks - 1].gab.end);
+       }
 
        if (TSN_lt(asoc->highest_sacked, highest_tsn))
                asoc->highest_sacked = highest_tsn;
@@ -1789,7 +1792,7 @@ static int sctp_acked(struct sctp_sackhdr *sack, __u32 tsn)
         *  Block are assumed to have been received correctly.
         */
 
-       frags = sack->variable;
+       frags = (union sctp_sack_variable *)(sack + 1);
        blocks = ntohs(sack->num_gap_ack_blocks);
        tsn_offset = tsn - ctsn;
        for (i = 0; i < blocks; ++i) {
index 463c4a5..7fbeb99 100644 (file)
@@ -984,8 +984,7 @@ static void sctp_cmd_process_operr(struct sctp_cmd_seq *cmds,
                {
                        struct sctp_chunkhdr *unk_chunk_hdr;
 
-                       unk_chunk_hdr = (struct sctp_chunkhdr *)
-                                                       err_hdr->variable;
+                       unk_chunk_hdr = (struct sctp_chunkhdr *)(err_hdr + 1);
                        switch (unk_chunk_hdr->type) {
                        /* ADDIP 4.1 A9) If the peer responds to an ASCONF with
                         * an ERROR chunk reporting that it did not recognized
index 39d416e..8d0cfd6 100644 (file)
@@ -1337,7 +1337,7 @@ static int sctp_sf_send_restart_abort(struct net *net, union sctp_addr *ssa,
         * throughout the code today.
         */
        errhdr = (struct sctp_errhdr *)buffer;
-       addrparm = (union sctp_addr_param *)errhdr->variable;
+       addrparm = (union sctp_addr_param *)(errhdr + 1);
 
        /* Copy into a parm format. */
        len = af->to_addr_param(ssa, addrparm);