From: Volker Lendecke Date: Mon, 13 Jan 2020 14:37:25 +0000 (+0100) Subject: smbd: Move sharename check of conn_force_tdis() into a callback X-Git-Tag: samba-4.12.0rc1~89 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c9850e3d80320a5d13a69194246cce3f09f4ba3e;p=thirdparty%2Fsamba.git smbd: Move sharename check of conn_force_tdis() into a callback Next commit will have an additional check Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison --- diff --git a/source3/smbd/conn_idle.c b/source3/smbd/conn_idle.c index 078a0ed6917..cd12e3f1266 100644 --- a/source3/smbd/conn_idle.c +++ b/source3/smbd/conn_idle.c @@ -81,17 +81,13 @@ bool conn_idle_all(struct smbd_server_connection *sconn, time_t t) The special sharename '*' forces unmount of all shares. ****************************************************************************/ -void conn_force_tdis(struct smbd_server_connection *sconn, const char *sharename) +void conn_force_tdis( + struct smbd_server_connection *sconn, + bool (*check_fn)(struct connection_struct *conn, + void *private_data), + void *private_data) { - const struct loadparm_substitution *lp_sub = - loadparm_s3_global_substitution(); connection_struct *conn, *next; - bool close_all = false; - - if (strcmp(sharename, "*") == 0) { - close_all = true; - DEBUG(1, ("conn_force_tdis: Forcing close of all shares\n")); - } /* SMB1 and SMB 2*/ for (conn = sconn->connections; conn; conn = next) { @@ -107,21 +103,16 @@ void conn_force_tdis(struct smbd_server_connection *sconn, const char *sharename } tcon = conn->tcon; - if (close_all) { - do_close = true; - } else if (strequal(lp_servicename(talloc_tos(), lp_sub, SNUM(conn)), - sharename)) { - DEBUG(1, ("conn_force_tdis: Forcing close of " - "share '%s' (wire_id=0x%08x)\n", - tcon->global->share_name, - tcon->global->tcon_wire_id)); - do_close = true; - } - + do_close = check_fn(conn, private_data); if (!do_close) { continue; } + DBG_WARNING("Forcing close of " + "share '%s' (wire_id=0x%08x)\n", + tcon->global->share_name, + tcon->global->tcon_wire_id); + if (sconn->using_smb2) { vuid = conn->vuid; } diff --git a/source3/smbd/conn_msg.c b/source3/smbd/conn_msg.c index b4d563dbb99..3d27121b743 100644 --- a/source3/smbd/conn_msg.c +++ b/source3/smbd/conn_msg.c @@ -30,13 +30,42 @@ The special sharename '*' forces unmount of all shares. ****************************************************************************/ +struct force_tdis_state { + const char *sharename; +}; + +static bool force_tdis_check( + struct connection_struct *conn, + void *private_data) +{ + struct force_tdis_state *state = private_data; + const struct loadparm_substitution *lp_sub = + loadparm_s3_global_substitution(); + char *servicename = NULL; + bool do_close; + + if (strcmp(state->sharename, "*") == 0) { + DBG_WARNING("Forcing close of all shares\n"); + return true; + } + + servicename = lp_servicename(talloc_tos(), lp_sub, SNUM(conn)); + do_close = strequal(servicename, state->sharename); + + TALLOC_FREE(servicename); + + return do_close; +} + void msg_force_tdis(struct messaging_context *msg, void *private_data, uint32_t msg_type, struct server_id server_id, DATA_BLOB *data) { - const char *sharename = (const char *)data->data; + struct force_tdis_state state = { + .sharename = (const char *)data->data, + }; struct smbd_server_connection *sconn = talloc_get_type_abort(private_data, struct smbd_server_connection); @@ -46,5 +75,5 @@ void msg_force_tdis(struct messaging_context *msg, return; } - conn_force_tdis(sconn, sharename); + conn_force_tdis(sconn, force_tdis_check, &state); } diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h index 4b1960b0c14..88becd7df72 100644 --- a/source3/smbd/proto.h +++ b/source3/smbd/proto.h @@ -154,7 +154,11 @@ connection_struct *conn_new(struct smbd_server_connection *sconn); bool conn_idle_all(struct smbd_server_connection *sconn, time_t t); void conn_clear_vuid_caches(struct smbd_server_connection *sconn, uint64_t vuid); void conn_free(connection_struct *conn); -void conn_force_tdis(struct smbd_server_connection *sconn, const char *sharename); +void conn_force_tdis( + struct smbd_server_connection *sconn, + bool (*check_fn)(struct connection_struct *conn, + void *private_data), + void *private_data); void msg_force_tdis(struct messaging_context *msg, void *private_data, uint32_t msg_type,