Patch "UAPI: nfsfh.h: Replace one-element array with flexible-array member" has been added to the 5.10-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    UAPI: nfsfh.h: Replace one-element array with flexible-array member

to the 5.10-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     uapi-nfsfh.h-replace-one-element-array-with-flexible.patch
and it can be found in the queue-5.10 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 1718a70f54bc92ba3e0fb23a5be87f207ff4d8fa
Author: Gustavo A. R. Silva <gustavoars@xxxxxxxxxx>
Date:   Tue Mar 23 17:48:58 2021 -0500

    UAPI: nfsfh.h: Replace one-element array with flexible-array member
    
    [ Upstream commit c0a744dcaa29e9537e8607ae9c965ad936124a4d ]
    
    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].
    
    Use an anonymous union with a couple of anonymous structs in order to
    keep userspace unchanged:
    
    $ pahole -C nfs_fhbase_new fs/nfsd/nfsfh.o
    struct nfs_fhbase_new {
            union {
                    struct {
                            __u8       fb_version_aux;       /*     0     1 */
                            __u8       fb_auth_type_aux;     /*     1     1 */
                            __u8       fb_fsid_type_aux;     /*     2     1 */
                            __u8       fb_fileid_type_aux;   /*     3     1 */
                            __u32      fb_auth[1];           /*     4     4 */
                    };                                       /*     0     8 */
                    struct {
                            __u8       fb_version;           /*     0     1 */
                            __u8       fb_auth_type;         /*     1     1 */
                            __u8       fb_fsid_type;         /*     2     1 */
                            __u8       fb_fileid_type;       /*     3     1 */
                            __u32      fb_auth_flex[0];      /*     4     0 */
                    };                                       /*     0     4 */
            };                                               /*     0     8 */
    
            /* size: 8, cachelines: 1, members: 1 */
            /* last cacheline: 8 bytes */
    };
    
    Also, this helps with the ongoing efforts to enable -Warray-bounds by
    fixing the following warnings:
    
    fs/nfsd/nfsfh.c: In function ‘nfsd_set_fh_dentry’:
    fs/nfsd/nfsfh.c:191:41: warning: array subscript 1 is above array bounds of ‘__u32[1]’ {aka ‘unsigned int[1]’} [-Warray-bounds]
      191 |        ntohl((__force __be32)fh->fh_fsid[1])));
          |                              ~~~~~~~~~~~^~~
    ./include/linux/kdev_t.h:12:46: note: in definition of macro ‘MKDEV’
       12 | #define MKDEV(ma,mi) (((ma) << MINORBITS) | (mi))
          |                                              ^~
    ./include/uapi/linux/byteorder/little_endian.h:40:26: note: in expansion of macro ‘__swab32’
       40 | #define __be32_to_cpu(x) __swab32((__force __u32)(__be32)(x))
          |                          ^~~~~~~~
    ./include/linux/byteorder/generic.h:136:21: note: in expansion of macro ‘__be32_to_cpu’
      136 | #define ___ntohl(x) __be32_to_cpu(x)
          |                     ^~~~~~~~~~~~~
    ./include/linux/byteorder/generic.h:140:18: note: in expansion of macro ‘___ntohl’
      140 | #define ntohl(x) ___ntohl(x)
          |                  ^~~~~~~~
    fs/nfsd/nfsfh.c:191:8: note: in expansion of macro ‘ntohl’
      191 |        ntohl((__force __be32)fh->fh_fsid[1])));
          |        ^~~~~
    fs/nfsd/nfsfh.c:192:32: warning: array subscript 2 is above array bounds of ‘__u32[1]’ {aka ‘unsigned int[1]’} [-Warray-bounds]
      192 |    fh->fh_fsid[1] = fh->fh_fsid[2];
          |                     ~~~~~~~~~~~^~~
    fs/nfsd/nfsfh.c:192:15: warning: array subscript 1 is above array bounds of ‘__u32[1]’ {aka ‘unsigned int[1]’} [-Warray-bounds]
      192 |    fh->fh_fsid[1] = fh->fh_fsid[2];
          |    ~~~~~~~~~~~^~~
    
    [1] https://en.wikipedia.org/wiki/Flexible_array_member
    [2] https://www.kernel.org/doc/html/v5.10/process/deprecated.html#zero-length-and-one-element-arrays
    
    Link: https://github.com/KSPP/linux/issues/79
    Link: https://github.com/KSPP/linux/issues/109
    Signed-off-by: Gustavo A. R. Silva <gustavoars@xxxxxxxxxx>
    Signed-off-by: Chuck Lever <chuck.lever@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/include/uapi/linux/nfsd/nfsfh.h b/include/uapi/linux/nfsd/nfsfh.h
index ff0ca88b1c8f6..427294dd56a1b 100644
--- a/include/uapi/linux/nfsd/nfsfh.h
+++ b/include/uapi/linux/nfsd/nfsfh.h
@@ -64,13 +64,24 @@ struct nfs_fhbase_old {
  *   in include/linux/exportfs.h for currently registered values.
  */
 struct nfs_fhbase_new {
-	__u8		fb_version;	/* == 1, even => nfs_fhbase_old */
-	__u8		fb_auth_type;
-	__u8		fb_fsid_type;
-	__u8		fb_fileid_type;
-	__u32		fb_auth[1];
-/*	__u32		fb_fsid[0]; floating */
-/*	__u32		fb_fileid[0]; floating */
+	union {
+		struct {
+			__u8		fb_version_aux;	/* == 1, even => nfs_fhbase_old */
+			__u8		fb_auth_type_aux;
+			__u8		fb_fsid_type_aux;
+			__u8		fb_fileid_type_aux;
+			__u32		fb_auth[1];
+			/*	__u32		fb_fsid[0]; floating */
+			/*	__u32		fb_fileid[0]; floating */
+		};
+		struct {
+			__u8		fb_version;	/* == 1, even => nfs_fhbase_old */
+			__u8		fb_auth_type;
+			__u8		fb_fsid_type;
+			__u8		fb_fileid_type;
+			__u32		fb_auth_flex[]; /* flexible-array member */
+		};
+	};
 };
 
 struct knfsd_fh {
@@ -97,7 +108,7 @@ struct knfsd_fh {
 #define	fh_fsid_type		fh_base.fh_new.fb_fsid_type
 #define	fh_auth_type		fh_base.fh_new.fb_auth_type
 #define	fh_fileid_type		fh_base.fh_new.fb_fileid_type
-#define	fh_fsid			fh_base.fh_new.fb_auth
+#define	fh_fsid			fh_base.fh_new.fb_auth_flex
 
 /* Do not use, provided for userspace compatiblity. */
 #define	fh_auth			fh_base.fh_new.fb_auth




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux