aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrooks Davis <brooks@FreeBSD.org>2023-01-18 23:48:18 +0000
committerBrooks Davis <brooks@FreeBSD.org>2023-01-18 23:48:18 +0000
commitad23377e244c1f234f922aacfdb32be4e0a9713e (patch)
treef046967c47b481c746bc7a88c868a5abcef468c3
parent1a27768e01ecdec7f5e556c6d284564904d2e230 (diff)
xdr: store chars consistently
Cast char's through unsigned char before storing as an integer in xdr_char(), this ensures that the encoded form is consistently not sign-extended following Open Solaris's example. Prior to this change, platforms with signed chars would sign extend values with the high bit set but ones with unsigned chars would not so 0xff would be stored as 0x000000ff on unsigned char platforms and 0xffffffff on signed char platforms. Decoding has the same result for either form so this is a largely cosmetic change, but it seems best to produce consistent output. For more discussion, see https://github.com/openzfs/zfs/issues/14173 Reviewed by: mav, imp Differential Revision: https://reviews.freebsd.org/D37992 (cherry picked from commit a872c37054172f3f7a03aef263ca5886a749771f)
-rw-r--r--lib/libc/xdr/xdr.c8
-rw-r--r--sys/xdr/xdr.c8
2 files changed, 8 insertions, 8 deletions
diff --git a/lib/libc/xdr/xdr.c b/lib/libc/xdr/xdr.c
index fcf4e9029074..48b4cdbecd02 100644
--- a/lib/libc/xdr/xdr.c
+++ b/lib/libc/xdr/xdr.c
@@ -429,13 +429,13 @@ xdr_uint16_t(XDR *xdrs, uint16_t *u_int16_p)
bool_t
xdr_char(XDR *xdrs, char *cp)
{
- int i;
+ u_int i;
- i = (*cp);
- if (!xdr_int(xdrs, &i)) {
+ i = *((unsigned char *)cp);
+ if (!xdr_u_int(xdrs, &i)) {
return (FALSE);
}
- *cp = i;
+ *((unsigned char *)cp) = i;
return (TRUE);
}
diff --git a/sys/xdr/xdr.c b/sys/xdr/xdr.c
index 349e53d02387..6e66b90453c4 100644
--- a/sys/xdr/xdr.c
+++ b/sys/xdr/xdr.c
@@ -372,13 +372,13 @@ xdr_uint16_t(XDR *xdrs, uint16_t *uint16_p)
bool_t
xdr_char(XDR *xdrs, char *cp)
{
- int i;
+ u_int i;
- i = (*cp);
- if (!xdr_int(xdrs, &i)) {
+ i = *((unsigned char *)cp);
+ if (!xdr_u_int(xdrs, &i)) {
return (FALSE);
}
- *cp = i;
+ *((unsigned char *)cp) = i;
return (TRUE);
}