mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2025-02-25 15:10:48 +01:00
New function for Tor to treat itself as the "owner" of a socket
Our socket accounting functions assumed that we'd never be asked to close a socket that we didn't open ourselves. But now we want to support taking control sockets that we inherit -- so we need a way of taking ownership of them, so we don't freak out later on when we close them.
This commit is contained in:
parent
5bcd8dc5c4
commit
4eb5753bd2
2 changed files with 14 additions and 5 deletions
|
@ -1273,11 +1273,22 @@ tor_open_socket_with_extensions(int domain, int type, int protocol,
|
||||||
goto socket_ok; /* So that socket_ok will not be unused. */
|
goto socket_ok; /* So that socket_ok will not be unused. */
|
||||||
|
|
||||||
socket_ok:
|
socket_ok:
|
||||||
|
tor_take_socket_ownership(s);
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For socket accounting: remember that we are the owner of the socket
|
||||||
|
* <b>s</b>. This will prevent us from overallocating sockets, and prevent us
|
||||||
|
* from asserting later when we close the socket <b>s</b>.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
tor_take_socket_ownership(tor_socket_t s)
|
||||||
|
{
|
||||||
socket_accounting_lock();
|
socket_accounting_lock();
|
||||||
++n_sockets_open;
|
++n_sockets_open;
|
||||||
mark_socket_open(s);
|
mark_socket_open(s);
|
||||||
socket_accounting_unlock();
|
socket_accounting_unlock();
|
||||||
return s;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** As accept(), but counts the number of open sockets. */
|
/** As accept(), but counts the number of open sockets. */
|
||||||
|
@ -1358,10 +1369,7 @@ tor_accept_socket_with_extensions(tor_socket_t sockfd, struct sockaddr *addr,
|
||||||
goto socket_ok; /* So that socket_ok will not be unused. */
|
goto socket_ok; /* So that socket_ok will not be unused. */
|
||||||
|
|
||||||
socket_ok:
|
socket_ok:
|
||||||
socket_accounting_lock();
|
tor_take_socket_ownership(s);
|
||||||
++n_sockets_open;
|
|
||||||
mark_socket_open(s);
|
|
||||||
socket_accounting_unlock();
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -483,6 +483,7 @@ typedef int socklen_t;
|
||||||
|
|
||||||
int tor_close_socket_simple(tor_socket_t s);
|
int tor_close_socket_simple(tor_socket_t s);
|
||||||
MOCK_DECL(int, tor_close_socket, (tor_socket_t s));
|
MOCK_DECL(int, tor_close_socket, (tor_socket_t s));
|
||||||
|
void tor_take_socket_ownership(tor_socket_t s);
|
||||||
tor_socket_t tor_open_socket_with_extensions(
|
tor_socket_t tor_open_socket_with_extensions(
|
||||||
int domain, int type, int protocol,
|
int domain, int type, int protocol,
|
||||||
int cloexec, int nonblock);
|
int cloexec, int nonblock);
|
||||||
|
|
Loading…
Add table
Reference in a new issue