Commit 94dfc73e authored by Gustavo A. R. Silva's avatar Gustavo A. R. Silva
Browse files

treewide: uapi: Replace zero-length arrays with flexible-array members

There is a regular need in the kernel to provide a way to declare
having a dynamically sized set of trailing elements in a structure.
Kernel code should always use “flexible array members”[1] for these
cases. The older style of one-element or zero-length arrays should
no longer be used[2].

This code was transformed with the help of Coccinelle:
(linux-5.19-rc2$ spatch --jobs $(getconf _NPROCESSORS_ONLN) --sp-file script.cocci --include-headers --dir . > output.patch)

@@
identifier S, member, array;
type T1, T2;
@@

struct S {
  ...
  T1 member;
  T2 array[
- 0
  ];
};

-fstrict-flex-arrays=3 is coming and we need to land these changes
to prevent issues like these in the short future:

../fs/minix/dir.c:337:3: warning: 'strcpy' will always overflow; destination buffer has size 0,
but the source string has length 2 (including NUL byte) [-Wfortify-source]
		strcpy(de3->name, ".");
		^

Since these are all [0] to [] changes, the risk to UAPI is nearly zero. If
this breaks anything, we can use a union with a new member name.

[1] https://en.wikipedia.org/wiki/Flexible_array_member
[2] https://www.kernel.org/doc/html/v5.16/process/deprecated.html#zero-length-and-one-element-arrays

Link: https://github.com/KSPP/linux/issues/78


Build-tested-by: default avatarkernel test robot <lkp@intel.com>
Link: https://lore.kernel.org/lkml/62b675ec.wKX6AOZ6cbE71vtF%25lkp@intel.com/


Acked-by: Dan Williams <dan.j.williams@intel.com> # For ndctl.h
Signed-off-by: default avatarGustavo A. R. Silva <gustavoars@kernel.org>
parent b13baccc
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -34,7 +34,7 @@
struct bi_record {
	__be16 tag;			/* tag ID */
	__be16 size;			/* size of record (in bytes) */
	__be32 data[0];			/* data */
	__be32 data[];			/* data */
};


@@ -168,7 +168,7 @@ struct bootversion {
	struct {
		__be32 machtype;
		__be32 version;
	} machversions[0];
	} machversions[];
} __packed;

#endif /* __ASSEMBLY__ */
+1 −1
Original line number Diff line number Diff line
@@ -60,7 +60,7 @@ struct ucontext {
	sigset_t		uc_sigmask;

	/* Extended context structures may follow ucontext */
	unsigned long long	uc_extcontext[0];
	unsigned long long	uc_extcontext[];
};

#endif /* __MIPS_UAPI_ASM_UCONTEXT_H */
+3 −3
Original line number Diff line number Diff line
@@ -30,18 +30,18 @@ struct s390_ctrset_start { /* Set CPUs to operate on */
struct s390_ctrset_setdata {		/* Counter set data */
	__u32 set;			/* Counter set number */
	__u32 no_cnts;			/* # of counters stored in cv[] */
	__u64 cv[0];			/* Counter values (variable length) */
	__u64 cv[];			/* Counter values (variable length) */
};

struct s390_ctrset_cpudata {		/* Counter set data per CPU */
	__u32 cpu_nr;			/* CPU number */
	__u32 no_sets;			/* # of counters sets in data[] */
	struct s390_ctrset_setdata data[0];
	struct s390_ctrset_setdata data[];
};

struct s390_ctrset_read {		/* Structure to get all ctr sets */
	__u64 no_cpus;			/* Total # of CPUs data taken from */
	struct s390_ctrset_cpudata data[0];
	struct s390_ctrset_cpudata data[];
};

#define S390_HWCTR_MAGIC	'C'	/* Random magic # for ioctls */
+1 −1
Original line number Diff line number Diff line
@@ -52,7 +52,7 @@ struct setup_data {
	__u64 next;
	__u32 type;
	__u32 len;
	__u8 data[0];
	__u8 data[];
};

/* extensible setup indirect data node */
+6 −6
Original line number Diff line number Diff line
@@ -198,13 +198,13 @@ struct kvm_msrs {
	__u32 nmsrs; /* number of msrs in entries */
	__u32 pad;

	struct kvm_msr_entry entries[0];
	struct kvm_msr_entry entries[];
};

/* for KVM_GET_MSR_INDEX_LIST */
struct kvm_msr_list {
	__u32 nmsrs; /* number of msrs in entries */
	__u32 indices[0];
	__u32 indices[];
};

/* Maximum size of any access bitmap in bytes */
@@ -241,7 +241,7 @@ struct kvm_cpuid_entry {
struct kvm_cpuid {
	__u32 nent;
	__u32 padding;
	struct kvm_cpuid_entry entries[0];
	struct kvm_cpuid_entry entries[];
};

struct kvm_cpuid_entry2 {
@@ -263,7 +263,7 @@ struct kvm_cpuid_entry2 {
struct kvm_cpuid2 {
	__u32 nent;
	__u32 padding;
	struct kvm_cpuid_entry2 entries[0];
	struct kvm_cpuid_entry2 entries[];
};

/* for KVM_GET_PIT and KVM_SET_PIT */
@@ -389,7 +389,7 @@ struct kvm_xsave {
	 * the contents of CPUID leaf 0xD on the host.
	 */
	__u32 region[1024];
	__u32 extra[0];
	__u32 extra[];
};

#define KVM_MAX_XCRS	16
@@ -516,7 +516,7 @@ struct kvm_pmu_event_filter {
	__u32 fixed_counter_bitmap;
	__u32 flags;
	__u32 pad[4];
	__u64 events[0];
	__u64 events[];
};

#define KVM_PMU_EVENT_ALLOW 0
Loading