Commit 425364dc authored by Chuck Lever's avatar Chuck Lever
Browse files

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: default avatarJeff Layton <jlayton@kernel.org>
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
parent 1e7dbad6
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -2,8 +2,10 @@
{% if annotate %}
	/* member {{ name }} (variable-length array) */
{% endif %}
{% if maxsize != "0" %}
	if (value->{{ name }}.count > {{ maxsize }})
		return false;
{% endif %}
	if (xdr_stream_encode_u32(xdr, value->{{ name }}.count) != XDR_UNIT)
		return false;
	for (u32 i = 0; i < value->{{ name }}.count; i++)
+2 −0
Original line number Diff line number Diff line
@@ -2,8 +2,10 @@
{% if annotate %}
	/* member {{ name }} (variable-length array) */
{% endif %}
{% if maxsize != "0" %}
	if (value->{{ name }}.count > {{ maxsize }})
		return false;
{% endif %}
	if (xdr_stream_encode_u32(xdr, value->{{ name }}.count) != XDR_UNIT)
		return false;
	for (u32 i = 0; i < value->{{ name }}.count; i++)
+2 −0
Original line number Diff line number Diff line
@@ -4,8 +4,10 @@
{% endif %}
		if (xdr_stream_decode_u32(xdr, &count) < 0)
			return false;
{% if maxsize != "0" %}
		if (count > {{ maxsize }})
			return false;
{% endif %}
		for (u32 i = 0; i < count; i++) {
			if (xdrgen_decode_{{ type }}(xdr, &ptr->{{ name }}.items[i]) < 0)
				return false;