xdrgen: Fix code generated for counted arrays
authorChuck Lever <chuck.lever@oracle.com>
Fri, 16 May 2025 13:37:12 +0000 (09:37 -0400)
committerChuck Lever <chuck.lever@oracle.com>
Fri, 16 May 2025 14:58:48 +0000 (10:58 -0400)
commit425364dc49f050b6008b43408aa96d42105a9c1d
tree3a7562e6b2916f47f6ed2d00b74799d204bcffca
parent1e7dbad6d1fe4b35ccd2aa8fea9496d837af4430
xdrgen: Fix code generated for counted arrays

When an XDR counted array has a maximum element count, xdrgen adds
a bounds check to the encoder or decoder for that type. But in cases
where the .x provides no maximum element count, such as

struct notify4 {
        /* composed from notify_type4 or notify_deviceid_type4 */
        bitmap4         notify_mask;
        notifylist4     notify_vals;
};

struct CB_NOTIFY4args {
        stateid4    cna_stateid;
        nfs_fh4     cna_fh;
        notify4     cna_changes<>;
};

xdrgen is supposed to omit that bounds check. Some of the Jinja2
templates handle that correctly, but a few are incorrect and leave
the bounds check in place with a maximum of zero, which causes
encoding/decoding of that type to fail unconditionally.

Reported-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
tools/net/sunrpc/xdrgen/templates/C/pointer/encoder/variable_length_array.j2
tools/net/sunrpc/xdrgen/templates/C/struct/encoder/variable_length_array.j2
tools/net/sunrpc/xdrgen/templates/C/union/decoder/variable_length_array.j2