Skip to content

Commit

Permalink
Merge branch 'master' into improve-pmap-protect
Browse files Browse the repository at this point in the history
  • Loading branch information
cahirwpz authored Jan 9, 2024
2 parents 50f7f99 + 71ac66a commit 6756a96
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 15 deletions.
48 changes: 33 additions & 15 deletions lib/libc/sys/select.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,32 +5,30 @@
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>

int select(int nfds, fd_set *restrict readfds, fd_set *restrict writefds,
fd_set *restrict exceptfds, struct timeval *restrict timeout) {
int pselect(int nfds, fd_set *restrict readfds, fd_set *restrict writefds,
fd_set *restrict exceptfds, const struct timespec *restrict timeout,
const sigset_t *restrict sigmask) {
int kq;
int ret;
struct timespec timeout_ts;
struct kevent *events;
int nevents = 0;
sigset_t sigs;

if (nfds < 0) {
errno = EINVAL;
return -1;
}

if (timeout != NULL) {
if (timeout->tv_sec < 0 || timeout->tv_usec < 0 || timeout->tv_usec >= 1000000) {
errno = EINVAL;
return -1;
}

tv2ts(timeout, &timeout_ts);
}
if (sigmask && sigprocmask(SIG_SETMASK, sigmask, &sigs))
return -1;

kq = kqueue1(O_CLOEXEC);
if (kq < 0)
return -1;
if (kq < 0) {
ret = -1;
goto restore_sigs;
}

events = malloc(2 * nfds * sizeof(struct kevent));
if (!events) {
Expand All @@ -50,8 +48,8 @@ int select(int nfds, fd_set *restrict readfds, fd_set *restrict writefds,
FD_ZERO(readfds);
if (writefds != NULL)
FD_ZERO(writefds);
ret = kevent(kq, events, nevents, events, nevents, timeout == NULL ? NULL : &timeout_ts);

ret = kevent(kq, events, nevents, events, nevents, timeout);
if (ret == -1)
goto end;

Expand All @@ -71,5 +69,25 @@ int select(int nfds, fd_set *restrict readfds, fd_set *restrict writefds,
free(events);
close_kq:
close(kq);
restore_sigs:
if (sigmask && sigprocmask(SIG_SETMASK, &sigs, NULL))
ret = -1;
return ret;
}

int select(int nfds, fd_set *restrict readfds, fd_set *restrict writefds,
fd_set *restrict exceptfds, struct timeval *restrict timeout) {
struct timespec timeout_ts;

if (timeout != NULL) {
if (timeout->tv_sec < 0 || timeout->tv_usec < 0 || timeout->tv_usec >= 1000000) {
errno = EINVAL;
return -1;
}

tv2ts(timeout, &timeout_ts);
}

return pselect(nfds, readfds, writefds, exceptfds,
timeout == NULL ? NULL : &timeout_ts , NULL);
}
5 changes: 5 additions & 0 deletions sys/kern/vm_map.c
Original file line number Diff line number Diff line change
Expand Up @@ -539,6 +539,11 @@ static int cow_page_fault(vm_map_t *map, vm_map_entry_t *ent, size_t off,
if (old == NULL)
return 0;

/* This check is safe. We are the only owner of this anon and the ref count
* will not change because we are under vm_map:mtx. */
if (old->ref_cnt == 1)
return 0;

/* Current mapping will be replaced with new one so remove it from pmap. */
vaddr_t fault_page = off * PAGESIZE + ent->start;
pmap_remove(map->pmap, fault_page, fault_page + PAGESIZE);
Expand Down

0 comments on commit 6756a96

Please sign in to comment.