https://bugs.exim.org/show_bug.cgi?id=3108
--- Comment #13 from Theo Buehler <[email protected]> --- OpenBSD doesn't provide `strchrnul()`, so the compat implementation is used. However, there is no prototype and the compilation on OpenBSD shows the following errors: ``` pdkim.c:671:12: warning: call to undeclared function 'strchrnul'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration] end = US strchrnul(CS ele, ';'); ^ pdkim.c:671:9: warning: cast to 'unsigned char *' from smaller integer type 'int' [-Wint-to-pointer-cast] ``` so llvm ends up truncating the pointer returned by `strchrnul()` to an int and then sign-extends that back to a pointer which will be invalid and dereferencing it on line 673 naturally segfaults. The fix simply is to provide a prototype of `strchrnul()`, presumably in `src/osfunctions.h`. I've confirmed this by looking at the disassembly on aarch64. I've also provided Peter with a patch to test and waiting on him to hear back. Since most OS provide `strchrnul()` I expect the impact to be small. As an aside, the `strchrnul()` compat implementation should use a cast for correctness: ``` while (*US s != c && *s) s++; ``` Otherwise, if `c >= 0x80`, the comparison `*s != c` is always false on architectures with signed char. -- You are receiving this mail because: You are on the CC list for the bug. -- ## subscription configuration (requires account): ## https://lists.exim.org/mailman3/postorius/lists/exim-dev.lists.exim.org/ ## unsubscribe (doesn't require an account): ## [email protected] ## Exim details at http://www.exim.org/ ## Please use the Wiki with this list - http://wiki.exim.org/
