save a pointer to the currently connected audit server in the closure object
This commit is contained in:

committed by
Todd C. Miller

parent
7ceeca1eb0
commit
de02745a3f
@@ -40,6 +40,8 @@
|
|||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
#include <grp.h>
|
#include <grp.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
|
||||||
#include "sudoers.h"
|
#include "sudoers.h"
|
||||||
#include "sudo_iolog.h"
|
#include "sudo_iolog.h"
|
||||||
@@ -586,17 +588,28 @@ static int
|
|||||||
sudoers_io_open_remote(void)
|
sudoers_io_open_remote(void)
|
||||||
{
|
{
|
||||||
int sock, ret = -1;
|
int sock, ret = -1;
|
||||||
|
struct sudoers_string *connected_server = NULL;
|
||||||
|
|
||||||
debug_decl(sudoers_io_open_remote, SUDOERS_DEBUG_PLUGIN);
|
debug_decl(sudoers_io_open_remote, SUDOERS_DEBUG_PLUGIN);
|
||||||
|
|
||||||
/* Connect to log server. */
|
/* Connect to log server. */
|
||||||
sock = log_server_connect(iolog_details.log_servers,
|
sock = log_server_connect(iolog_details.log_servers,
|
||||||
&iolog_details.server_timeout);
|
&iolog_details.server_timeout, &connected_server);
|
||||||
if (sock == -1) {
|
if (sock == -1) {
|
||||||
/* TODO: support offline logs if server unreachable */
|
/* TODO: support offline logs if server unreachable */
|
||||||
sudo_warnx(U_("unable to connect to log server"));
|
sudo_warnx(U_("unable to connect to log server"));
|
||||||
ret = -1;
|
ret = -1;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* save the name of the server we are successfully connected to */
|
||||||
|
client_closure.host = connected_server;
|
||||||
|
|
||||||
|
struct sockaddr_in addr;
|
||||||
|
socklen_t addr_len = sizeof(addr);
|
||||||
|
getpeername(sock, (struct sockaddr *) &addr, &addr_len);
|
||||||
|
inet_ntop(addr.sin_family, &(addr.sin_addr), client_closure.ipaddr, INET6_ADDRSTRLEN);
|
||||||
|
|
||||||
if (!client_closure_fill(&client_closure, sock, &iolog_details, &sudoers_io)) {
|
if (!client_closure_fill(&client_closure, sock, &iolog_details, &sudoers_io)) {
|
||||||
close(sock);
|
close(sock);
|
||||||
ret = -1;
|
ret = -1;
|
||||||
|
@@ -181,7 +181,8 @@ connect_server(const char *host, const char *port, struct timespec *timo,
|
|||||||
* Returns a socket with O_NONBLOCK and close-on-exec flags set.
|
* Returns a socket with O_NONBLOCK and close-on-exec flags set.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
log_server_connect(struct sudoers_str_list *servers, struct timespec *timo)
|
log_server_connect(struct sudoers_str_list *servers, struct timespec *timo,
|
||||||
|
struct sudoers_string **connected_server)
|
||||||
{
|
{
|
||||||
struct sudoers_string *server;
|
struct sudoers_string *server;
|
||||||
char *copy, *host, *port;
|
char *copy, *host, *port;
|
||||||
@@ -204,6 +205,8 @@ log_server_connect(struct sudoers_str_list *servers, struct timespec *timo)
|
|||||||
close(sock);
|
close(sock);
|
||||||
sock = -1;
|
sock = -1;
|
||||||
}
|
}
|
||||||
|
/* this is the server we successfully connected to */
|
||||||
|
*connected_server = server;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -86,6 +86,12 @@ enum client_state {
|
|||||||
/* Remote connection closure, non-zero fields must come first. */
|
/* Remote connection closure, non-zero fields must come first. */
|
||||||
struct client_closure {
|
struct client_closure {
|
||||||
int sock;
|
int sock;
|
||||||
|
struct sudoers_string *host;
|
||||||
|
#if defined(HAVE_STRUCT_IN6_ADDR)
|
||||||
|
char ipaddr[INET6_ADDRSTRLEN];
|
||||||
|
#else
|
||||||
|
char ipaddr[INET_ADDRSTRLEN];
|
||||||
|
#endif
|
||||||
#if defined(HAVE_OPENSSL)
|
#if defined(HAVE_OPENSSL)
|
||||||
bool tls;
|
bool tls;
|
||||||
SSL_CTX *ssl_ctx;
|
SSL_CTX *ssl_ctx;
|
||||||
@@ -109,6 +115,8 @@ struct client_closure {
|
|||||||
# define CLIENT_CLOSURE_INITIALIZER(_c) \
|
# define CLIENT_CLOSURE_INITIALIZER(_c) \
|
||||||
{ \
|
{ \
|
||||||
-1, \
|
-1, \
|
||||||
|
NULL, \
|
||||||
|
"", \
|
||||||
false, \
|
false, \
|
||||||
NULL, \
|
NULL, \
|
||||||
NULL, \
|
NULL, \
|
||||||
@@ -121,6 +129,8 @@ struct client_closure {
|
|||||||
# define CLIENT_CLOSURE_INITIALIZER(_c) \
|
# define CLIENT_CLOSURE_INITIALIZER(_c) \
|
||||||
{ \
|
{ \
|
||||||
-1, \
|
-1, \
|
||||||
|
NULL, \
|
||||||
|
"", \
|
||||||
ERROR, \
|
ERROR, \
|
||||||
false, \
|
false, \
|
||||||
TAILQ_HEAD_INITIALIZER((_c).write_bufs), \
|
TAILQ_HEAD_INITIALIZER((_c).write_bufs), \
|
||||||
@@ -137,7 +147,7 @@ bool fmt_exit_message(struct client_closure *closure, int exit_status, int error
|
|||||||
bool fmt_io_buf(struct client_closure *closure, int type, const char *buf, unsigned int len, struct timespec *delay);
|
bool fmt_io_buf(struct client_closure *closure, int type, const char *buf, unsigned int len, struct timespec *delay);
|
||||||
bool fmt_suspend(struct client_closure *closure, const char *signame, struct timespec *delay);
|
bool fmt_suspend(struct client_closure *closure, const char *signame, struct timespec *delay);
|
||||||
bool fmt_winsize(struct client_closure *closure, unsigned int lines, unsigned int cols, struct timespec *delay);
|
bool fmt_winsize(struct client_closure *closure, unsigned int lines, unsigned int cols, struct timespec *delay);
|
||||||
int log_server_connect(struct sudoers_str_list *servers, struct timespec *timo);
|
int log_server_connect(struct sudoers_str_list *servers, struct timespec *timo, struct sudoers_string **connected_server);
|
||||||
void client_closure_free(struct client_closure *closure);
|
void client_closure_free(struct client_closure *closure);
|
||||||
|
|
||||||
#endif /* SUDOERS_IOLOG_CLIENT_H */
|
#endif /* SUDOERS_IOLOG_CLIENT_H */
|
||||||
|
Reference in New Issue
Block a user