aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2012-05-03 08:34:44 +0000
committerCorinna Vinschen <corinna@vinschen.de>2012-05-03 08:34:44 +0000
commit00a76ece10b91c8f6664de0ddd36af596ccac3c8 (patch)
tree2618a2e2852311ae52496af6d9a614338773c6fa
parente32a14ca19b05a542b3971987a41104664bc197b (diff)
downloadnewlib-00a76ece10b91c8f6664de0ddd36af596ccac3c8.zip
newlib-00a76ece10b91c8f6664de0ddd36af596ccac3c8.tar.gz
newlib-00a76ece10b91c8f6664de0ddd36af596ccac3c8.tar.bz2
* 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/ChangeLog10
-rw-r--r--winsup/cygwin/net.cc12
-rw-r--r--winsup/cygwin/wincap.cc49
-rw-r--r--winsup/cygwin/wincap.h2
4 files changed, 68 insertions, 5 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index c70c872..e2dbf3d 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 830a800..a0a83b5 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) &param >= (uintptr_t) 0x80000000L)
+ if ((uintptr_t) &param >= (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, &param, 0, NULL);
if (!thr)
{
diff --git a/winsup/cygwin/wincap.cc b/winsup/cygwin/wincap.cc
index 495e3a3..c5cac6a 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 f22c194..6bd291d 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)