PFS: unblock the child when unsuspending an accept
Previously, PFS would incorrectly try to unsuspend the parent (i.e., the listening socket), resulting in the child hanging until the other side performed another action. Test56 started failing on this now. Change-Id: I231ac5481c83ac45951d33aeecc8149273f48b11
This commit is contained in:
parent
60f1a5f280
commit
5c584cedf8
1 changed files with 8 additions and 6 deletions
|
@ -398,7 +398,7 @@ int do_accept(message *dev_m_in, message *dev_m_out)
|
||||||
|
|
||||||
int do_connect(message *dev_m_in, message *dev_m_out)
|
int do_connect(message *dev_m_in, message *dev_m_out)
|
||||||
{
|
{
|
||||||
int minor;
|
int minor, child;
|
||||||
struct sockaddr_un addr;
|
struct sockaddr_un addr;
|
||||||
int rc, i, j;
|
int rc, i, j;
|
||||||
|
|
||||||
|
@ -446,26 +446,28 @@ int do_connect(message *dev_m_in, message *dev_m_out)
|
||||||
!strncmp(addr.sun_path, uds_fd_table[i].addr.sun_path,
|
!strncmp(addr.sun_path, uds_fd_table[i].addr.sun_path,
|
||||||
UNIX_PATH_MAX)) {
|
UNIX_PATH_MAX)) {
|
||||||
|
|
||||||
if (uds_fd_table[i].child != -1) {
|
if ((child = uds_fd_table[i].child) != -1) {
|
||||||
|
|
||||||
/* the server is blocked on accept(2) --
|
/* the server is blocked on accept(2) --
|
||||||
* perform connection to the child
|
* perform connection to the child
|
||||||
*/
|
*/
|
||||||
|
|
||||||
rc = perform_connection(dev_m_in, dev_m_out,
|
rc = perform_connection(dev_m_in, dev_m_out,
|
||||||
&addr, minor, uds_fd_table[i].child);
|
&addr, minor, child);
|
||||||
|
|
||||||
if (rc == OK) {
|
if (rc == OK) {
|
||||||
|
|
||||||
uds_fd_table[i].child = -1;
|
uds_fd_table[i].child = -1;
|
||||||
|
|
||||||
#if DEBUG == 1
|
#if DEBUG == 1
|
||||||
printf("(uds) [%d] {do_connect} revive %d\n", minor, i);
|
printf("(uds) [%d] {do_connect} revive %d\n", minor, child);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* wake the parent (server) */
|
/* wake the parent (server) */
|
||||||
uds_fd_table[i].ready_to_revive = 1;
|
uds_fd_table[child].ready_to_revive =
|
||||||
uds_unsuspend(dev_m_in->m_source, i);
|
1;
|
||||||
|
uds_unsuspend(dev_m_in->m_source,
|
||||||
|
child);
|
||||||
}
|
}
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
|
|
Loading…
Reference in a new issue