From 05a15f8c43e7a167983f19bd866b90158661703e Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Sun, 5 Jan 2020 01:32:49 +0100 Subject: lwip,pfinet: Fix crash on make_sock_user getting EINTR _ports_create_port_internal may return EINTR. * lwip/port-objs.c (make_sock_user): Set errno when ports_create_port returns an error. * pfinet/socket.c (make_sock_user): Likewise. * lwip/io-ops.c (lwip_S_io_reauthenticate): Loop while make_sock_user errors with EINTR. * pfinet/io-ops.c (S_io_reauthenticate): Likewise. --- lwip/io-ops.c | 6 +++++- lwip/port-objs.c | 5 ++++- pfinet/io-ops.c | 9 ++++++++- pfinet/socket.c | 5 ++++- 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/lwip/io-ops.c b/lwip/io-ops.c index 89d596a49..2e666ab2e 100644 --- a/lwip/io-ops.c +++ b/lwip/io-ops.c @@ -317,7 +317,11 @@ lwip_S_io_reauthenticate (struct sock_user * user, mach_port_t rend) aux_uids = aubuf; aux_gids = agbuf; - newuser = make_sock_user (user->sock, 0, 1, 0); + do + newuser = make_sock_user (user->sock, 0, 1, 0); + while (!newuser && errno == EINTR); + if (!newuser) + return 0; auth = getauth (); newright = ports_get_send_right (newuser); diff --git a/lwip/port-objs.c b/lwip/port-objs.c index 07bcab8fa..70e1aeaf2 100644 --- a/lwip/port-objs.c +++ b/lwip/port-objs.c @@ -118,7 +118,10 @@ make_sock_user (struct socket *sock, int isroot, int noinstall, int consume) err = ports_create_port (socketport_class, lwip_bucket, sizeof (struct sock_user), &user); if (err) - return 0; + { + errno = err; + return 0; + } if (!consume) refcount_ref (&sock->refcnt); diff --git a/pfinet/io-ops.c b/pfinet/io-ops.c index e0e1875b2..c1b6e5b55 100644 --- a/pfinet/io-ops.c +++ b/pfinet/io-ops.c @@ -374,7 +374,14 @@ S_io_reauthenticate (struct sock_user *user, aux_gids = agbuf; pthread_mutex_lock (&global_lock); - newuser = make_sock_user (user->sock, 0, 1, 0); + do + newuser = make_sock_user (user->sock, 0, 1, 0); + while (!newuser && errno == EINTR); + if (!newuser) + { + pthread_mutex_unlock (&global_lock); + return 0; + } auth = getauth (); newright = ports_get_send_right (newuser); diff --git a/pfinet/socket.c b/pfinet/socket.c index 4a12426c2..059520aee 100644 --- a/pfinet/socket.c +++ b/pfinet/socket.c @@ -81,7 +81,10 @@ make_sock_user (struct socket *sock, int isroot, int noinstall, int consume) err = ports_create_port (socketport_class, pfinet_bucket, sizeof (struct sock_user), &user); if (err) - return 0; + { + errno = err; + return 0; + } /* We maintain a reference count in `struct socket' (a member not in the original Linux structure), because there can be multiple -- cgit v1.2.3