Merge pull request #9051 from dra27/fix-9043

Add missing local root in win32 `Unix.select`
master
David Allsopp 2019-10-19 08:55:23 +01:00 committed by GitHub
commit dd492d84a5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 25 additions and 20 deletions

View File

@ -448,6 +448,11 @@ OCaml 4.10.0
- #8981: Fix check for incompatible -c and -o options.
(Greta Yorsh, review by Damien Doligez)
- #9051: fix unregistered local root in win32unix/select.c (could result in
`select` returning file_descr-like values which weren't in the original sets)
and correct initialisation of some blocks allocated with caml_alloc_small.
(David Allsopp, review by Xavier Leroy)
OCaml 4.09 maintenance branch:
------------------------------

View File

@ -960,19 +960,19 @@ static int fdlist_to_fdset(value fdlist, fd_set *fdset)
static value fdset_to_fdlist(value fdlist, fd_set *fdset)
{
value res = Val_int(0);
Begin_roots2(fdlist, res)
for (/*nothing*/; fdlist != Val_int(0); fdlist = Field(fdlist, 1)) {
value s = Field(fdlist, 0);
if (FD_ISSET(Socket_val(s), fdset)) {
value newres = caml_alloc_small(2, 0);
Field(newres, 0) = s;
Field(newres, 1) = res;
res = newres;
}
CAMLparam1(fdlist);
CAMLlocal2(res, s);
res = Val_int(0);
for (/*nothing*/; fdlist != Val_int(0); fdlist = Field(fdlist, 1)) {
s = Field(fdlist, 0);
if (FD_ISSET(Socket_val(s), fdset)) {
value newres = caml_alloc_small(2, 0);
Field(newres, 0) = s;
Field(newres, 1) = res;
res = newres;
}
End_roots();
return res;
}
CAMLreturn(res);
}
CAMLprim value unix_select(value readfds, value writefds, value exceptfds,
@ -1264,20 +1264,20 @@ CAMLprim value unix_select(value readfds, value writefds, value exceptfds,
{
iterResult = &(iterSelectData->aResults[i]);
l = caml_alloc_small(2, 0);
Store_field(l, 0, find_handle(iterResult, readfds, writefds,
exceptfds));
Field(l, 0) = find_handle(iterResult, readfds, writefds,
exceptfds);
switch (iterResult->EMode)
{
case SELECT_MODE_READ:
Store_field(l, 1, read_list);
Field(l, 1) = read_list;
read_list = l;
break;
case SELECT_MODE_WRITE:
Store_field(l, 1, write_list);
Field(l, 1) = write_list;
write_list = l;
break;
case SELECT_MODE_EXCEPT:
Store_field(l, 1, except_list);
Field(l, 1) = except_list;
except_list = l;
break;
case SELECT_MODE_NONE:
@ -1320,9 +1320,9 @@ CAMLprim value unix_select(value readfds, value writefds, value exceptfds,
DEBUG_PRINT("Build final result");
res = caml_alloc_small(3, 0);
Store_field(res, 0, read_list);
Store_field(res, 1, write_list);
Store_field(res, 2, except_list);
Field(res, 0) = read_list;
Field(res, 1) = write_list;
Field(res, 2) = except_list;
DEBUG_PRINT("out select");