From acfc63b0cf0df472a8e17df1bf5a2c8284e28833 Mon Sep 17 00:00:00 2001 From: David Allsopp Date: Thu, 9 Jul 2020 20:17:03 +0100 Subject: [PATCH] Fix invalid acl_entry_t on 32-bit Cygwin If the acl_t struct was at or above 0x80000000 then the pointer was sign-extended to 0xffff_ffff_8000_0000 and so the index was lost. Signed-off-by: David Allsopp --- winsup/cygwin/release/3.1.7 | 4 ++++ winsup/cygwin/sec_posixacl.h | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 winsup/cygwin/release/3.1.7 diff --git a/winsup/cygwin/release/3.1.7 b/winsup/cygwin/release/3.1.7 new file mode 100644 index 000000000..6ce316fc4 --- /dev/null +++ b/winsup/cygwin/release/3.1.7 @@ -0,0 +1,4 @@ +Bug Fixes: +---------- + +- Fix acl_get_* functions in 32-bit Cygwin (pointer sign extension) diff --git a/winsup/cygwin/sec_posixacl.h b/winsup/cygwin/sec_posixacl.h index a3790a52b..0f9e7bde3 100644 --- a/winsup/cygwin/sec_posixacl.h +++ b/winsup/cygwin/sec_posixacl.h @@ -34,7 +34,7 @@ struct __acl_t inline acl_entry_t __to_entry (acl_t acl, uint16_t idx) { - return ((uint64_t) idx << 48) | (uint64_t) acl; + return ((uint64_t) idx << 48) | (uint64_t) ((uintptr_t) acl); } #define __to_permset(a,i) ((acl_permset_t)__to_entry((a),(i)))