diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2012-05-03 08:34:44 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2012-05-03 08:34:44 +0000 |
commit | 00a76ece10b91c8f6664de0ddd36af596ccac3c8 (patch) | |
tree | 2618a2e2852311ae52496af6d9a614338773c6fa | |
parent | e32a14ca19b05a542b3971987a41104664bc197b (diff) | |
download | cygnal-00a76ece10b91c8f6664de0ddd36af596ccac3c8.tar.gz cygnal-00a76ece10b91c8f6664de0ddd36af596ccac3c8.tar.bz2 cygnal-00a76ece10b91c8f6664de0ddd36af596ccac3c8.zip |
* net.cc (get_adapters_addresses): Only create thread on affected
systems. Change comment acordingly.
* wincap.h (wincaps::has_gaa_largeaddress_bug): New element.
* wincap.cc: Implement above element throughout.
(wincap_8): New globale wincaps to support Windows 8.
(wincapc::init): Take Windows 8 into account. Set new
has_gaa_largeaddress_bug member to false on 32 bit systems.
-rw-r--r-- | winsup/cygwin/ChangeLog | 10 | ||||
-rw-r--r-- | winsup/cygwin/net.cc | 12 | ||||
-rw-r--r-- | winsup/cygwin/wincap.cc | 49 | ||||
-rw-r--r-- | winsup/cygwin/wincap.h | 2 |
4 files changed, 68 insertions, 5 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index c70c872fa..e2dbf3d3f 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,13 @@ +2012-05-03 Corinna Vinschen <corinna@vinschen.de> + + * net.cc (get_adapters_addresses): Only create thread on affected + systems. Change comment acordingly. + * wincap.h (wincaps::has_gaa_largeaddress_bug): New element. + * wincap.cc: Implement above element throughout. + (wincap_8): New globale wincaps to support Windows 8. + (wincapc::init): Take Windows 8 into account. Set new + has_gaa_largeaddress_bug member to false on 32 bit systems. + 2012-05-02 Christopher Faylor <me.cygwin2012@cgf.cx> * DevNotes: New file. Add entry cgf-000001. diff --git a/winsup/cygwin/net.cc b/winsup/cygwin/net.cc index 830a80051..a0a83b55a 100644 --- a/winsup/cygwin/net.cc +++ b/winsup/cygwin/net.cc @@ -1695,13 +1695,17 @@ get_adapters_addresses (PIP_ADAPTER_ADDRESSES *pa_ret, ULONG family) DWORD ret; gaa_wa param = { family, pa_ret ?: NULL }; - if ((uintptr_t) ¶m >= (uintptr_t) 0x80000000L) + if ((uintptr_t) ¶m >= (uintptr_t) 0x80000000L + && wincap.has_gaa_largeaddress_bug ()) { - /* Starting with Windows Vista, GetAdaptersAddresses fails with error 998, + /* In Windows Vista and Windows 7 under WOW64, GetAdaptersAddresses fails if it's running in a thread with a stack located in the large address area. So, if we're running in a pthread with such a stack, we call - GetAdaptersAddresses in a child thread with an OS-allocated stack, - which is guaranteed to be located in the lower address area. */ + GetAdaptersAddresses in a child thread with an OS-allocated stack. + The OS allocates stacks bottom up, so chances are good that the new + stack will be located in the lower address area. + FIXME: The problem is fixed in W8CP, but needs testing before W8 goes + gold. */ HANDLE thr = CreateThread (NULL, 0, call_gaa, ¶m, 0, NULL); if (!thr) { diff --git a/winsup/cygwin/wincap.cc b/winsup/cygwin/wincap.cc index 495e3a36f..c5cac6aa2 100644 --- a/winsup/cygwin/wincap.cc +++ b/winsup/cygwin/wincap.cc @@ -37,6 +37,7 @@ wincaps wincap_2000 __attribute__((section (".cygwin_dll_common"), shared)) = { has_recycle_dot_bin:false, has_gaa_prefixes:false, has_gaa_on_link_prefix:false, + has_gaa_largeaddress_bug:false, supports_all_posix_ai_flags:false, has_restricted_stack_args:false, has_transactions:false, @@ -71,6 +72,7 @@ wincaps wincap_2000sp4 __attribute__((section (".cygwin_dll_common"), shared)) = has_recycle_dot_bin:false, has_gaa_prefixes:false, has_gaa_on_link_prefix:false, + has_gaa_largeaddress_bug:false, supports_all_posix_ai_flags:false, has_restricted_stack_args:false, has_transactions:false, @@ -105,6 +107,7 @@ wincaps wincap_xp __attribute__((section (".cygwin_dll_common"), shared)) = { has_recycle_dot_bin:false, has_gaa_prefixes:false, has_gaa_on_link_prefix:false, + has_gaa_largeaddress_bug:false, supports_all_posix_ai_flags:false, has_restricted_stack_args:false, has_transactions:false, @@ -139,6 +142,7 @@ wincaps wincap_xpsp1 __attribute__((section (".cygwin_dll_common"), shared)) = { has_recycle_dot_bin:false, has_gaa_prefixes:true, has_gaa_on_link_prefix:false, + has_gaa_largeaddress_bug:false, supports_all_posix_ai_flags:false, has_restricted_stack_args:false, has_transactions:false, @@ -173,6 +177,7 @@ wincaps wincap_xpsp2 __attribute__((section (".cygwin_dll_common"), shared)) = { has_recycle_dot_bin:false, has_gaa_prefixes:true, has_gaa_on_link_prefix:false, + has_gaa_largeaddress_bug:false, supports_all_posix_ai_flags:false, has_restricted_stack_args:false, has_transactions:false, @@ -207,6 +212,7 @@ wincaps wincap_2003 __attribute__((section (".cygwin_dll_common"), shared)) = { has_recycle_dot_bin:false, has_gaa_prefixes:true, has_gaa_on_link_prefix:false, + has_gaa_largeaddress_bug:false, supports_all_posix_ai_flags:false, has_restricted_stack_args:true, has_transactions:false, @@ -241,6 +247,7 @@ wincaps wincap_vista __attribute__((section (".cygwin_dll_common"), shared)) = { has_recycle_dot_bin:true, has_gaa_prefixes:true, has_gaa_on_link_prefix:true, + has_gaa_largeaddress_bug:true, supports_all_posix_ai_flags:true, has_restricted_stack_args:false, has_transactions:true, @@ -275,6 +282,42 @@ wincaps wincap_7 __attribute__((section (".cygwin_dll_common"), shared)) = { has_recycle_dot_bin:true, has_gaa_prefixes:true, has_gaa_on_link_prefix:true, + has_gaa_largeaddress_bug:true, + supports_all_posix_ai_flags:true, + has_restricted_stack_args:false, + has_transactions:true, + has_recvmsg:true, + has_sendmsg:true, + has_broken_udf:false, + has_console_handle_problem:true, + has_broken_alloc_console:true, + has_always_all_codepages:true, + has_localenames:true, + has_fast_cwd:true, + has_restricted_raw_disk_access:true, + use_dont_resolve_hack:false, + has_stack_size_param_is_a_reservation:true, + has_console_logon_sid:true, + wow64_has_secondary_stack:false, + has_program_compatibility_assistant:true, + kernel_is_always_casesensitive:false, +}; + +wincaps wincap_8 __attribute__((section (".cygwin_dll_common"), shared)) = { + max_sys_priv:SE_CREATE_SYMBOLIC_LINK_PRIVILEGE, + is_server:false, + has_physical_mem_access:false, + has_create_global_privilege:true, + has_ioctl_storage_get_media_types_ex:true, + has_disk_ex_ioctls:true, + has_buggy_restart_scan:false, + has_mandatory_integrity_control:true, + needs_logon_sid_in_sid_list:false, + needs_count_in_si_lpres2:false, + has_recycle_dot_bin:true, + has_gaa_prefixes:true, + has_gaa_on_link_prefix:true, + has_gaa_largeaddress_bug:false, supports_all_posix_ai_flags:true, has_restricted_stack_args:false, has_transactions:true, @@ -352,9 +395,12 @@ wincapc::init () case 0: caps = &wincap_vista; break; - default: + case 1: caps = &wincap_7; break; + default: + caps = &wincap_8; + break; } break; default: @@ -381,6 +427,7 @@ wincapc::init () ((wincaps *)caps)->needs_count_in_si_lpres2 = false; ((wincaps *)caps)->has_restricted_stack_args = false; ((wincaps *)caps)->wow64_has_secondary_stack = false; + ((wincaps *)caps)->has_gaa_largeaddress_bug = false; } __small_sprintf (osnam, "NT-%d.%d", version.dwMajorVersion, diff --git a/winsup/cygwin/wincap.h b/winsup/cygwin/wincap.h index f22c194a9..6bd291dfa 100644 --- a/winsup/cygwin/wincap.h +++ b/winsup/cygwin/wincap.h @@ -27,6 +27,7 @@ struct wincaps unsigned has_recycle_dot_bin : 1; unsigned has_gaa_prefixes : 1; unsigned has_gaa_on_link_prefix : 1; + unsigned has_gaa_largeaddress_bug : 1; unsigned supports_all_posix_ai_flags : 1; unsigned has_restricted_stack_args : 1; unsigned has_transactions : 1; @@ -80,6 +81,7 @@ public: bool IMPLEMENT (has_recycle_dot_bin) bool IMPLEMENT (has_gaa_prefixes) bool IMPLEMENT (has_gaa_on_link_prefix) + bool IMPLEMENT (has_gaa_largeaddress_bug) bool IMPLEMENT (supports_all_posix_ai_flags) bool IMPLEMENT (has_restricted_stack_args) bool IMPLEMENT (has_transactions) |