* fhandler_socket.cc (fhandler_socket::connect): Always set sun_path
in case of a successful or pending connect. (fhandler_socket::accept): Don't run secret event and eid credential transactions if OS accept returned WSAEWOULDBLOCK.
This commit is contained in:
parent
333eabc6f8
commit
2e7c4a2ab1
@ -1,3 +1,10 @@
|
|||||||
|
2005-03-17 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
|
* fhandler_socket.cc (fhandler_socket::connect): Always set sun_path
|
||||||
|
in case of a successful or pending connect.
|
||||||
|
(fhandler_socket::accept): Don't run secret event and eid credential
|
||||||
|
transactions if OS accept returned WSAEWOULDBLOCK.
|
||||||
|
|
||||||
2005-03-16 Christopher Faylor <cgf@timesys.com>
|
2005-03-16 Christopher Faylor <cgf@timesys.com>
|
||||||
|
|
||||||
* fhandler_tape.cc (get_ll): This is a generally useful function so
|
* fhandler_tape.cc (get_ll): This is a generally useful function so
|
||||||
|
@ -637,6 +637,10 @@ fhandler_socket::connect (const struct sockaddr *name, int namelen)
|
|||||||
}
|
}
|
||||||
set_winsock_errno ();
|
set_winsock_errno ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (get_addr_family () == AF_LOCAL && (!res || in_progress))
|
||||||
|
set_sun_path (name->sa_data);
|
||||||
|
|
||||||
if (get_addr_family () == AF_LOCAL && get_socket_type () == SOCK_STREAM)
|
if (get_addr_family () == AF_LOCAL && get_socket_type () == SOCK_STREAM)
|
||||||
{
|
{
|
||||||
if (!res || in_progress)
|
if (!res || in_progress)
|
||||||
@ -670,12 +674,12 @@ fhandler_socket::connect (const struct sockaddr *name, int namelen)
|
|||||||
if (!res || in_progress)
|
if (!res || in_progress)
|
||||||
{
|
{
|
||||||
/* eid credential transaction. */
|
/* eid credential transaction. */
|
||||||
set_sun_path (name->sa_data);
|
|
||||||
if (wincap.has_named_pipes ())
|
if (wincap.has_named_pipes ())
|
||||||
{
|
{
|
||||||
struct ucred in = { getpid (), geteuid32 (), getegid32 () };
|
struct ucred in = { getpid (), geteuid32 (), getegid32 () };
|
||||||
struct ucred out = { (pid_t) 0, (__uid32_t) -1, (__gid32_t) -1 };
|
struct ucred out = { (pid_t) 0, (__uid32_t) -1, (__gid32_t) -1 };
|
||||||
DWORD bytes = 0;
|
DWORD bytes = 0;
|
||||||
|
debug_printf ("Calling CallNamedPipe");
|
||||||
if (CallNamedPipe(eid_pipe_name ((char *) alloca (CYG_MAX_PATH + 1)),
|
if (CallNamedPipe(eid_pipe_name ((char *) alloca (CYG_MAX_PATH + 1)),
|
||||||
&in, sizeof in, &out, sizeof out, &bytes, 1000))
|
&in, sizeof in, &out, sizeof out, &bytes, 1000))
|
||||||
{
|
{
|
||||||
@ -745,7 +749,6 @@ fhandler_socket::accept (struct sockaddr *peer, int *len)
|
|||||||
{
|
{
|
||||||
int res = -1;
|
int res = -1;
|
||||||
bool secret_check_failed = false;
|
bool secret_check_failed = false;
|
||||||
bool in_progress = false;
|
|
||||||
struct ucred in = { sec_pid, sec_uid, sec_gid };
|
struct ucred in = { sec_pid, sec_uid, sec_gid };
|
||||||
struct ucred out = { (pid_t) 0, (__uid32_t) -1, (__gid32_t) -1 };
|
struct ucred out = { (pid_t) 0, (__uid32_t) -1, (__gid32_t) -1 };
|
||||||
|
|
||||||
@ -769,21 +772,13 @@ fhandler_socket::accept (struct sockaddr *peer, int *len)
|
|||||||
|
|
||||||
res = ::accept (get_socket (), peer, len);
|
res = ::accept (get_socket (), peer, len);
|
||||||
|
|
||||||
if ((SOCKET) res == INVALID_SOCKET && WSAGetLastError () == WSAEWOULDBLOCK)
|
if ((SOCKET) res != INVALID_SOCKET && get_addr_family () == AF_LOCAL
|
||||||
in_progress = true;
|
&& get_socket_type () == SOCK_STREAM)
|
||||||
|
|
||||||
if (get_addr_family () == AF_LOCAL && get_socket_type () == SOCK_STREAM)
|
|
||||||
{
|
{
|
||||||
if ((SOCKET) res != INVALID_SOCKET || in_progress)
|
if (!create_secret_event ())
|
||||||
{
|
secret_check_failed = true;
|
||||||
if (!create_secret_event ())
|
|
||||||
secret_check_failed = true;
|
|
||||||
else if (in_progress)
|
|
||||||
signal_secret_event ();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!secret_check_failed &&
|
if (!secret_check_failed)
|
||||||
(SOCKET) res != INVALID_SOCKET)
|
|
||||||
{
|
{
|
||||||
if (!check_peer_secret_event ((struct sockaddr_in*) peer))
|
if (!check_peer_secret_event ((struct sockaddr_in*) peer))
|
||||||
{
|
{
|
||||||
@ -795,40 +790,37 @@ fhandler_socket::accept (struct sockaddr *peer, int *len)
|
|||||||
if (secret_check_failed)
|
if (secret_check_failed)
|
||||||
{
|
{
|
||||||
close_secret_event ();
|
close_secret_event ();
|
||||||
if ((SOCKET) res != INVALID_SOCKET)
|
closesocket (res);
|
||||||
closesocket (res);
|
|
||||||
set_errno (ECONNABORTED);
|
set_errno (ECONNABORTED);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((SOCKET) res != INVALID_SOCKET || in_progress)
|
/* eid credential transaction. */
|
||||||
{
|
if (wincap.has_named_pipes ())
|
||||||
/* eid credential transaction. */
|
{
|
||||||
if (wincap.has_named_pipes ())
|
DWORD bytes = 0;
|
||||||
|
debug_printf ("Calling ConnectNamedPipe");
|
||||||
|
bool ret = ConnectNamedPipe (sec_pipe, NULL);
|
||||||
|
if (ret || GetLastError () == ERROR_PIPE_CONNECTED)
|
||||||
{
|
{
|
||||||
DWORD bytes = 0;
|
if (!ReadFile (sec_pipe, &out, sizeof out, &bytes, NULL))
|
||||||
bool ret = ConnectNamedPipe (sec_pipe, NULL);
|
debug_printf ("Receiving eid credentials failed: %E");
|
||||||
if (ret || GetLastError () == ERROR_PIPE_CONNECTED)
|
|
||||||
{
|
|
||||||
if (!ReadFile (sec_pipe, &out, sizeof out, &bytes, NULL))
|
|
||||||
debug_printf ("Receiving eid credentials failed: %E");
|
|
||||||
else
|
|
||||||
debug_printf ("Received eid credentials: pid: %d, uid: %d"
|
|
||||||
", gid: %d", out.pid, out.uid, out.gid);
|
|
||||||
if (!WriteFile (sec_pipe, &in, sizeof in, &bytes, NULL))
|
|
||||||
debug_printf ("Sending eid credentials failed: %E");
|
|
||||||
DisconnectNamedPipe (sec_pipe);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
debug_printf ("Connecting the eid credential pipe failed: %E");
|
debug_printf ("Received eid credentials: pid: %d, uid: %d"
|
||||||
}
|
", gid: %d", out.pid, out.uid, out.gid);
|
||||||
else /* 9x */
|
if (!WriteFile (sec_pipe, &in, sizeof in, &bytes, NULL))
|
||||||
{
|
debug_printf ("Sending eid credentials failed: %E");
|
||||||
/* Incorrect but wrong pid at least doesn't break getpeereid. */
|
DisconnectNamedPipe (sec_pipe);
|
||||||
out.pid = sec_pid;
|
|
||||||
out.uid = sec_uid;
|
|
||||||
out.gid = sec_gid;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
debug_printf ("Connecting the eid credential pipe failed: %E");
|
||||||
|
}
|
||||||
|
else /* 9x */
|
||||||
|
{
|
||||||
|
/* Incorrect but wrong pid at least doesn't break getpeereid. */
|
||||||
|
out.pid = sec_pid;
|
||||||
|
out.uid = sec_uid;
|
||||||
|
out.gid = sec_gid;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user