On Mon, Mar 14, 2022 at 4:45 PM T.J. Mercier tjmercier@google.com wrote:
On Thu, Mar 10, 2022 at 11:33 AM Todd Kjos tkjos@google.com wrote:
On Wed, Mar 9, 2022 at 8:52 AM T.J. Mercier tjmercier@google.com wrote:
The kernel interface should use types that the kernel defines instead of pid_t and uid_t, whose definiton is owned by libc. This fixes the header so that it can be included without first including sys/types.h.
Signed-off-by: T.J. Mercier tjmercier@google.com
include/uapi/linux/android/binder.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/include/uapi/linux/android/binder.h b/include/uapi/linux/android/binder.h index 169fd5069a1a..aa28454dbca3 100644 --- a/include/uapi/linux/android/binder.h +++ b/include/uapi/linux/android/binder.h @@ -289,8 +289,8 @@ struct binder_transaction_data {
/* General information about the transaction. */ __u32 flags;
pid_t sender_pid;
uid_t sender_euid;
__kernel_pid_t sender_pid;
__kernel_uid_t sender_euid;
Are we guaranteed that this does not affect the UAPI at all? Userspace code using this definition will have to run with kernels using the old definition and visa-versa.
A standards compliant userspace should be expecting a signed integer type here. So the only way I can think userspace would be affected is if:
- pid_t is a long AND
- sizeof(long) > sizeof(int) AND
- Consumers of the pid_t definition actually attempt to mutate the
result to make use of extra bits in the variable (which are not there)
This seems extremely unlikely. For instance just on the topic of the first item, all of the C library implementations with pid_t definitions linked here use an int, except for Bionic which typdefs pid_t to __kernel_pid_t and Sortix which uses long. https://wiki.osdev.org/C_Library
However I would argue this is already broken and should count as a bug fix since I can't do this:
$ cat binder_include.c ; gcc binder_include.c #include <linux/android/binder.h> int main() {} In file included from binder_include.c:1: /usr/include/linux/android/binder.h:291:9: error: unknown type name ‘pid_t’ 291 | pid_t sender_pid; | ^~~~~ /usr/include/linux/android/binder.h:292:9: error: unknown type name ‘uid_t’ 292 | uid_t sender_euid; | ^~~~~
This is also the only occurrence of pid_t in all of include/uapi/linux. All 40+ other uses are __kernel_pid_t, and I don't see why the binder header should be different.
It looks like those other cases used to be pid_t, but were changed to __kernel_pid_t.
Acked-by: Todd Kjos tkjos@google.com
binder_size_t data_size; /* number of bytes of data */ binder_size_t offsets_size; /* number of bytes of offsets */
-- 2.35.1.616.g0bdcbb4464-goog