https://bugs.kde.org/show_bug.cgi?id=486428
Bug ID: 486428 Summary: ioctl(I2C_RDWR) incorrectly checks padding bytes Classification: Developer tools Product: valgrind Version: unspecified Platform: Other OS: Linux Status: REPORTED Severity: normal Priority: NOR Component: general Assignee: jsew...@acm.org Reporter: a...@cyberialabs.net Target Milestone: --- SUMMARY This mostly looks like a duplicate of 479842, but I'm suggesting a slightly different patch below. ioctl(I2C_RDWR) complains on 64 bit machines about uninitialized padding bytes. STEPS TO REPRODUCE 1. Send an I2C_RDWR ioctl after setting `addr`, `flags`, `len`, and `buf` but not any padding bytes. OBSERVED RESULT ``` ==31112== Syscall param ioctl(I2C_RDWR).msgs points to uninitialised byte(s) ==31112== at 0x49690E4: ioctl (ioctl.c:36) ==31112== by 0x108FB: test_register_address_space_size (hw_test.c:187) ==31112== by 0x10BBB: run_tests (hw_test.c:323) ==31112== by 0x10C67: i2c_test (main.c:33) ==31112== by 0x10CA7: main (main.c:44) ==31112== Address 0x7d9562ce is on thread 1's stack ==31112== in frame #1, created by test_register_address_space_size (hw_test.c:165) ``` EXPECTED RESULT No error message. SOFTWARE/OS VERSIONS Raspbian 12 ADDITIONAL INFORMATION I would suggest the following patch to fix this issue. I haven't contributed to Valgrind before, and I am not familiar with how such contributions work. I apologize if I missed anything (if so please let me know and I will fix it). ``` diff --git a/coregrind/m_syswrap/syswrap-linux.c b/coregrind/m_syswrap/syswrap-linux.c index 45413fdd9..cdf2d152f 100644 --- a/coregrind/m_syswrap/syswrap-linux.c +++ b/coregrind/m_syswrap/syswrap-linux.c @@ -8574,11 +8574,14 @@ PRE(sys_ioctl) PRE_MEM_READ("ioctl(I2C_RDWR)", (Addr)vkui, sizeof(struct vki_i2c_rdwr_ioctl_data)); for (i=0; i < vkui->nmsgs; i++) { struct vki_i2c_msg *msg = vkui->msgs + i; - PRE_MEM_READ("ioctl(I2C_RDWR).msgs", (Addr)msg, sizeof(struct vki_i2c_msg)); - if (msg->flags & VKI_I2C_M_RD) - PRE_MEM_WRITE("ioctl(I2C_RDWR).msgs.buf", (Addr)msg->buf, msg->len); + PRE_MEM_READ("ioctl(I2C_RDWR).msgs[].addr", (Addr)&msg->addr, sizeof(msg->addr)); + PRE_MEM_READ("ioctl(I2C_RDWR).msgs[].flags", (Addr)&msg->flags, sizeof(msg->flags)); + PRE_MEM_READ("ioctl(I2C_RDWR).msgs[].len", (Addr)&msg->len, sizeof(msg->len)); + PRE_MEM_READ("ioctl(I2C_RDWR).msgs[].buf", (Addr)&msg->buf, sizeof(msg->buf)); + if (msg->flags & VKI_I2C_M_RD) + PRE_MEM_WRITE("ioctl(I2C_RDWR).msgs[].buf[]", (Addr)msg->buf, msg->len); else - PRE_MEM_READ("ioctl(I2C_RDWR).msgs.buf", (Addr)msg->buf, msg->len); + PRE_MEM_READ("ioctl(I2C_RDWR).msgs[].buf[]", (Addr)msg->buf, msg->len); } } break; ``` -- You are receiving this mail because: You are watching all bug changes.