1
0
mirror of https://github.com/samba-team/samba.git synced 2025-03-03 12:58:35 +03:00

smbd: add smbd_impersonate_debug_create() helper

This will be used to implement no-op impersonation
for the create_conn_struct_as_root() case were we
don't really have other unrelated events in the loop
and only need a valid tevent wrapper context to avoid
double free on the raw event context on teardown.

This also adds useful debugging instead of being
a full no-op wrapper.

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
This commit is contained in:
Stefan Metzmacher 2018-03-23 07:47:38 +01:00
parent 7b5a47b846
commit 23319ef5a2
2 changed files with 235 additions and 0 deletions

View File

@ -1189,6 +1189,12 @@ void reply_transs2(struct smb_request *req);
/* The following definitions come from smbd/uid.c */
#define smbd_impersonate_debug_create(main_ev, name, dbg_lvl) \
_smbd_impersonate_debug_create(main_ev, name, dbg_lvl, __location__)
struct tevent_context *_smbd_impersonate_debug_create(struct tevent_context *main_ev,
const char *name,
int dbg_lvl,
const char *location);
bool change_to_guest(void);
NTSTATUS check_user_share_access(connection_struct *conn,
const struct auth_session_info *session_info,

View File

@ -25,6 +25,235 @@
#include "libcli/security/security.h"
#include "passdb/lookup_sid.h"
#include "auth.h"
#include "lib/util/time_basic.h"
struct smbd_impersonate_debug_state {
int dbg_lvl;
const char *name;
};
static bool smbd_impersonate_debug_before_use(struct tevent_context *wrap_ev,
void *private_data,
struct tevent_context *main_ev,
const char *location)
{
struct smbd_impersonate_debug_state *state =
(struct smbd_impersonate_debug_state *)private_data;
DEBUG(state->dbg_lvl, (
"%s: name[%s] wrap_ev[%p] state[%p] main_ev[%p] location[%s]\n",
__func__, state->name, wrap_ev, state, main_ev, location));
return true;
}
static void smbd_impersonate_debug_after_use(struct tevent_context *wrap_ev,
void *private_data,
struct tevent_context *main_ev,
const char *location)
{
struct smbd_impersonate_debug_state *state =
(struct smbd_impersonate_debug_state *)private_data;
DEBUG(state->dbg_lvl, (
"%s: name[%s] wrap_ev[%p] state[%p] main_ev[%p] location[%s]\n",
__func__, state->name, wrap_ev, state, main_ev, location));
}
static void smbd_impersonate_debug_before_fd_handler(struct tevent_context *wrap_ev,
void *private_data,
struct tevent_context *main_ev,
struct tevent_fd *fde,
uint16_t flags,
const char *handler_name,
const char *location)
{
struct smbd_impersonate_debug_state *state =
(struct smbd_impersonate_debug_state *)private_data;
DEBUG(state->dbg_lvl, (
"%s: name[%s] wrap_ev[%p] state[%p] main_ev[%p] "
"fde[%p] flags[0x%X] handler_name[%s] location[%s]\n",
__func__, state->name, wrap_ev, state, main_ev,
fde, flags, handler_name, location));
}
static void smbd_impersonate_debug_after_fd_handler(struct tevent_context *wrap_ev,
void *private_data,
struct tevent_context *main_ev,
struct tevent_fd *fde,
uint16_t flags,
const char *handler_name,
const char *location)
{
struct smbd_impersonate_debug_state *state =
(struct smbd_impersonate_debug_state *)private_data;
DEBUG(state->dbg_lvl, (
"%s: name[%s] wrap_ev[%p] state[%p] main_ev[%p] "
"fde[%p] flags[0x%X] handler_name[%s] location[%s]\n",
__func__, state->name, wrap_ev, state, main_ev,
fde, flags, handler_name, location));
}
static void smbd_impersonate_debug_before_timer_handler(struct tevent_context *wrap_ev,
void *private_data,
struct tevent_context *main_ev,
struct tevent_timer *te,
struct timeval requested_time,
struct timeval trigger_time,
const char *handler_name,
const char *location)
{
struct smbd_impersonate_debug_state *state =
(struct smbd_impersonate_debug_state *)private_data;
struct timeval_buf requested_buf;
struct timeval_buf trigger_buf;
DEBUG(state->dbg_lvl, (
"%s: name[%s] wrap_ev[%p] state[%p] main_ev[%p] "
"te[%p] requested_time[%s] trigger_time[%s] handler_name[%s] location[%s]\n",
__func__, state->name, wrap_ev, state, main_ev, te,
timeval_str_buf(&requested_time, true, true, &requested_buf),
timeval_str_buf(&trigger_time, true, true, &trigger_buf),
handler_name, location));
}
static void smbd_impersonate_debug_after_timer_handler(struct tevent_context *wrap_ev,
void *private_data,
struct tevent_context *main_ev,
struct tevent_timer *te,
struct timeval requested_time,
struct timeval trigger_time,
const char *handler_name,
const char *location)
{
struct smbd_impersonate_debug_state *state =
(struct smbd_impersonate_debug_state *)private_data;
struct timeval_buf requested_buf;
struct timeval_buf trigger_buf;
DEBUG(state->dbg_lvl, (
"%s: name[%s] wrap_ev[%p] state[%p] main_ev[%p] "
"te[%p] requested_time[%s] trigger_time[%s] handler_name[%s] location[%s]\n",
__func__, state->name, wrap_ev, state, main_ev, te,
timeval_str_buf(&requested_time, true, true, &requested_buf),
timeval_str_buf(&trigger_time, true, true, &trigger_buf),
handler_name, location));
}
static void smbd_impersonate_debug_before_immediate_handler(struct tevent_context *wrap_ev,
void *private_data,
struct tevent_context *main_ev,
struct tevent_immediate *im,
const char *handler_name,
const char *location)
{
struct smbd_impersonate_debug_state *state =
(struct smbd_impersonate_debug_state *)private_data;
DEBUG(state->dbg_lvl, (
"%s: name[%s] wrap_ev[%p] state[%p] main_ev[%p] "
"im[%p] handler_name[%s] location[%s]\n",
__func__, state->name, wrap_ev, state, main_ev,
im, handler_name, location));
}
static void smbd_impersonate_debug_after_immediate_handler(struct tevent_context *wrap_ev,
void *private_data,
struct tevent_context *main_ev,
struct tevent_immediate *im,
const char *handler_name,
const char *location)
{
struct smbd_impersonate_debug_state *state =
(struct smbd_impersonate_debug_state *)private_data;
DEBUG(state->dbg_lvl, (
"%s: name[%s] wrap_ev[%p] state[%p] main_ev[%p] "
"im[%p] handler_name[%s] location[%s]\n",
__func__, state->name, wrap_ev, state, main_ev,
im, handler_name, location));
}
static void smbd_impersonate_debug_before_signal_handler(struct tevent_context *wrap_ev,
void *private_data,
struct tevent_context *main_ev,
struct tevent_signal *se,
int signum,
int count,
void *siginfo,
const char *handler_name,
const char *location)
{
struct smbd_impersonate_debug_state *state =
(struct smbd_impersonate_debug_state *)private_data;
DEBUG(state->dbg_lvl, (
"%s: name[%s] wrap_ev[%p] state[%p] main_ev[%p] "
"se[%p] signum[%d] count[%d] siginfo[%p] handler_name[%s] location[%s]\n",
__func__, state->name, wrap_ev, state, main_ev,
se, signum, count, siginfo, handler_name, location));
}
static void smbd_impersonate_debug_after_signal_handler(struct tevent_context *wrap_ev,
void *private_data,
struct tevent_context *main_ev,
struct tevent_signal *se,
int signum,
int count,
void *siginfo,
const char *handler_name,
const char *location)
{
struct smbd_impersonate_debug_state *state =
(struct smbd_impersonate_debug_state *)private_data;
DEBUG(state->dbg_lvl, (
"%s: name[%s] wrap_ev[%p] state[%p] main_ev[%p] "
"se[%p] signum[%d] count[%d] siginfo[%p] handler_name[%s] location[%s]\n",
__func__, state->name, wrap_ev, state, main_ev,
se, signum, count, siginfo, handler_name, location));
}
static const struct tevent_wrapper_ops smbd_impersonate_debug_ops = {
.name = "smbd_impersonate_debug",
.before_use = smbd_impersonate_debug_before_use,
.after_use = smbd_impersonate_debug_after_use,
.before_fd_handler = smbd_impersonate_debug_before_fd_handler,
.after_fd_handler = smbd_impersonate_debug_after_fd_handler,
.before_timer_handler = smbd_impersonate_debug_before_timer_handler,
.after_timer_handler = smbd_impersonate_debug_after_timer_handler,
.before_immediate_handler = smbd_impersonate_debug_before_immediate_handler,
.after_immediate_handler = smbd_impersonate_debug_after_immediate_handler,
.before_signal_handler = smbd_impersonate_debug_before_signal_handler,
.after_signal_handler = smbd_impersonate_debug_after_signal_handler,
};
struct tevent_context *_smbd_impersonate_debug_create(struct tevent_context *main_ev,
const char *name,
int dbg_lvl,
const char *location)
{
struct tevent_context *wrap_ev = NULL;
struct smbd_impersonate_debug_state *state = NULL;
wrap_ev = tevent_context_wrapper_create(main_ev,
main_ev,
&smbd_impersonate_debug_ops,
&state,
struct smbd_impersonate_debug_state);
if (wrap_ev == NULL) {
return NULL;
}
state->name = name;
state->dbg_lvl = dbg_lvl;
DEBUG(state->dbg_lvl, (
"%s: name[%s] wrap_ev[%p] state[%p] main_ev[%p] location[%s]\n",
__func__, state->name, wrap_ev, state, main_ev, location));
return wrap_ev;
}
/* what user is current? */
extern struct current_user current_user;