Everything is in the subject. Tested on x86_64-pc-linux-gnu, committed on trunk
2017-09-25 Vasiliy Fofanov <fofa...@adacore.com> * adaint.c (win32_wait): Properly handle error and take into account the WIN32 limitation on the number of simultaneous wait objects.
Index: adaint.c =================================================================== --- adaint.c (revision 253141) +++ adaint.c (working copy) @@ -2551,6 +2551,7 @@ DWORD res; int hl_len; int found; + int pos; START_WAIT: @@ -2563,7 +2564,15 @@ /* -------------------- critical section -------------------- */ EnterCS(); + /* ??? We can't wait for more than MAXIMUM_WAIT_OBJECTS due to a Win32 + limitation */ + if (plist_length < MAXIMUM_WAIT_OBJECTS) hl_len = plist_length; + else + { + errno = EINVAL; + return -1; + } #ifdef CERT hl = (HANDLE *) xmalloc (sizeof (HANDLE) * hl_len); @@ -2586,6 +2595,13 @@ res = WaitForMultipleObjects (hl_len, hl, FALSE, INFINITE); + /* If there was an error, exit now */ + if (res == WAIT_FAILED) + { + errno = EINVAL; + return -1; + } + /* if the ProcListEvt has been signaled then the list of processes has been updated to add or remove a handle, just loop over */ @@ -2596,9 +2612,17 @@ goto START_WAIT; } - h = hl[res - WAIT_OBJECT_0]; + /* Handle two distinct groups of return codes: finished waits and abandoned + waits */ + + if (res < WAIT_ABANDONED_0) + pos = res - WAIT_OBJECT_0; + else + pos = res - WAIT_ABANDONED_0; + + h = hl[pos]; GetExitCodeProcess (h, &exitcode); - pid = pidl [res - WAIT_OBJECT_0]; + pid = pidl [pos]; found = __gnat_win32_remove_handle (h, -1);