Tags 955440 +patch
Thanks

The offending code is.

        #if defined(__APPLE__) || defined(__SOLARIS__) || defined(__arm__)
                // File descriptor passing macros (CMSG_*) seem to be broken
                // on 64-bit MacOS X. This structure works around the problem.
                struct {
                        struct cmsghdr header;
                        int fd;
                } control_data;
                #define EXPECTED_CMSG_LEN sizeof(control_data)
#else
                char control_data[CMSG_SPACE(sizeof(int))];
                #define EXPECTED_CMSG_LEN CMSG_LEN(sizeof(int))
        #endif

And there is another similar block later in the file that likely suffers from 
the same issue.

I took a look at a git blame in upstream git 
https://github.com/phusion/passenger/blame/0ef3222e86ede97dff189de1137cca67684d4e2d/src/cxx_supportlib/Utils/IOUtils.cpp#L1128
 which leads back to 
https://github.com/phusion/passenger/commit/e3885d5c9e7b5403422742f193be0aa5775a84d2 but 
that is just moving the offending code from MessageChannel.h to IOUtils.cpp so going to 
the parent commit and blaming again takes us to 
https://github.com/phusion/passenger/commit/312b5e1c65558e17cd30d1b28089078d8f614fbf 
which added the arm condition to the list of conditionals and is described as "Fixed 
compilation problems on Linux systems with ARM CPU".

My feeling is that the issue that upstream was trying to fix was an alignment 
issue. In particular the creation of  of a buffer by using char 
control_data[CMSG_SPACE(sizeof(int))] means there are no alignment guarantees 
on the buffer and if my reading of the macros is correct then an unaligned 
buffer will lead to unaligned accesses. It looks like this bad practice may 
have originated from older versions of the manpage, I note that 
https://linux.die.net/man/3/cmsg_space uses a plain char array while the 
manpage in Bullseye uses a union.

I have written a patch which fixes the alignment issue in the main codepath and 
switches arm Linux (and any other non-apple, non-solaris arm systems) from the 
alternate codepath to the main codepath. I have tested that the package builds 
in raspbian bullseye-staging with the patch, I have not tested it beyond that.

I have uploaded the package to raspbian bullseye, a debdiff should appear soon 
at https://debdiffs.raspbian.org/main/p/passenger/ no intent to NMU in Debian.


Reply via email to