]> xenbits.xensource.com Git - libvirt.git/commitdiff
rpcgen: tests: Run cleanly on platforms where char is unsigned
authorMichal Privoznik <mprivozn@redhat.com>
Wed, 29 Nov 2023 11:30:16 +0000 (12:30 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Wed, 29 Nov 2023 16:16:45 +0000 (17:16 +0100)
There are some platforms where 'char' is unsigned, by default
(RPi, s390x to name a few). And because of how test_demo is
written we are experiencing some test cases failing there. For
instance: /xdr/struct-scalar is failing. This is because in the
test (test_struct_scalar()), we have a struct with two chars. One
is initialized to 0xca, the other 0xfe (note that both have the
MSB set). The XDR encoder (xdr_TestStructScalar()) then calls
xdr_char() on both of them. But XDR itself has no notion of
char type, so under the hood, it expands it to int [1] and calls
xdr_int(). And this is where the problem lies. On platforms where
char is signed, the integer expansion results in 0xffffffca, but
on platforms where char is unsigned it results in 0x000000ca. Two
distinct results.

The test then goes and compares the encoded buffer with an
expected one (memcmp(), read from the disk earlier).

This poses no problem for real life use, because when decoding
those chars back, the padding is thrown away.

To avoid tickling this issue, use values that don't have the MSB
set.

1: https://git.linux-nfs.org/?p=steved/libtirpc.git;a=blob;f=src/xdr.c;h=28d1382cc4853ecf1238d792af5016160435d1e0;hb=HEAD#l487

Fixes: 40cbaa8fbe rpcgen: add test case for XDR serialization
Reported-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
Reviewed-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
scripts/rpcgen/tests/test_demo.c
scripts/rpcgen/tests/test_demo_struct_fixed_array.bin
scripts/rpcgen/tests/test_demo_struct_pointer_set.bin
scripts/rpcgen/tests/test_demo_struct_scalar.bin
scripts/rpcgen/tests/test_demo_struct_variable_array_set.bin
scripts/rpcgen/tests/test_demo_test_struct_all_types.bin

index 1cdb9cfb825ee78b885a849dd808272296659454..a48ceccd582c15031e3dd08d8ce248cf2b21dccf 100644 (file)
@@ -373,7 +373,7 @@ static void test_enum_variable_array_empty(void)
              &vorig, &vnew, "enum_variable_array_empty", false);
 }
 
-#define TEST_STRUCT_INIT (TestStruct) { .c1 = 0xca, .c2 = 0xfe }
+#define TEST_STRUCT_INIT (TestStruct) { .c1 = 0x4a, .c2 = 0x7e }
 #define TEST_STRUCT_INIT_ALT (TestStruct) { .c1 = 0x09, .c2 = 0x07 }
 
 static void test_struct_scalar(void)
index f0e786ddea02cbd342ec9f6d3c6ee2b090b38792..dfa991acbdb4b5cfd48a43d9c3e5e118282e2c95 100644 (file)
Binary files a/scripts/rpcgen/tests/test_demo_struct_fixed_array.bin and b/scripts/rpcgen/tests/test_demo_struct_fixed_array.bin differ
index 572814793222ad03346747bb3041bb7eafc5205e..0aa91c2b571fb80d49f966e259220410b415f003 100644 (file)
Binary files a/scripts/rpcgen/tests/test_demo_struct_pointer_set.bin and b/scripts/rpcgen/tests/test_demo_struct_pointer_set.bin differ
index 0e6959d56a3ced8e5a656342f7a6a4e8cfb4b779..aa46538fb8fb946dd368ff954b373e5d0399d449 100644 (file)
Binary files a/scripts/rpcgen/tests/test_demo_struct_scalar.bin and b/scripts/rpcgen/tests/test_demo_struct_scalar.bin differ
index a9406a21cf6b767b76e2041536e560f5ef3c0202..48c2e710e9355c089471129b48f99159bbdf1339 100644 (file)
Binary files a/scripts/rpcgen/tests/test_demo_struct_variable_array_set.bin and b/scripts/rpcgen/tests/test_demo_struct_variable_array_set.bin differ
index 5ee4ee5a6d5e467e373add81d6266f4acee2a150..660c0e1b9c43046b790bda9c25a297653b714db0 100644 (file)
Binary files a/scripts/rpcgen/tests/test_demo_test_struct_all_types.bin and b/scripts/rpcgen/tests/test_demo_test_struct_all_types.bin differ