From b373d0e777df8770c24cfcc5cc80bf4808faa815 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Tue, 31 May 2011 13:18:37 +1000 Subject: s3-build: Provide a run-time shim to work around duplicate symbols The become_root() and similar 'smbd' functions that are used widely in Samba libraries had 'dummy' copies in dummysmbd.c and dummyroot.c. These have been replaced by a runtime plugin mechanim, which ensures that standlone binaries still do nothing, while in smbd the correct function is used. This avoids having these as duplicate symbols in the smbd binary, which can cause unpredictable behaviour. Andrew Bartlett Signed-off-by: Andrew Tridgell --- source3/smbd/blocking.c | 6 +++--- source3/smbd/dir.c | 4 ++-- source3/smbd/globals.c | 16 ++++++++++++++++ source3/smbd/oplock.c | 4 ++-- source3/smbd/proto.h | 14 ++++++++++++++ source3/smbd/statcache.c | 4 ++-- source3/smbd/uid.c | 6 +++--- 7 files changed, 42 insertions(+), 12 deletions(-) (limited to 'source3/smbd') diff --git a/source3/smbd/blocking.c b/source3/smbd/blocking.c index fd77e3d15b..d9c1fb2d3b 100644 --- a/source3/smbd/blocking.c +++ b/source3/smbd/blocking.c @@ -574,9 +574,9 @@ static bool blocking_lock_record_process(struct blocking_lock_record *blr) Called when a file is closed. *****************************************************************************/ -void cancel_pending_lock_requests_by_fid(files_struct *fsp, - struct byte_range_lock *br_lck, - enum file_close_type close_type) +void smbd_cancel_pending_lock_requests_by_fid(files_struct *fsp, + struct byte_range_lock *br_lck, + enum file_close_type close_type) { struct smbd_server_connection *sconn = fsp->conn->sconn; struct blocking_lock_record *blr, *blr_cancelled, *next = NULL; diff --git a/source3/smbd/dir.c b/source3/smbd/dir.c index c547cd2afa..fda7c34c57 100644 --- a/source3/smbd/dir.c +++ b/source3/smbd/dir.c @@ -1625,8 +1625,8 @@ bool SearchDir(struct smb_Dir *dirp, const char *name, long *poffset) Is this directory empty ? *****************************************************************/ -NTSTATUS can_delete_directory(struct connection_struct *conn, - const char *dirname) +NTSTATUS smbd_can_delete_directory(struct connection_struct *conn, + const char *dirname) { NTSTATUS status = NT_STATUS_OK; long dirpos = 0; diff --git a/source3/smbd/globals.c b/source3/smbd/globals.c index b3cf0bd7d2..2736fa69d0 100644 --- a/source3/smbd/globals.c +++ b/source3/smbd/globals.c @@ -20,6 +20,7 @@ #include "includes.h" #include "smbd/smbd.h" #include "smbd/globals.h" +#include "lib/smbd_shim.h" #include "memcache.h" #include "messages.h" #include "tdb_compat.h" @@ -145,9 +146,24 @@ struct memcache *smbd_memcache(void) return smbd_memcache_ctx; } +static const struct smbd_shim smbd_shim_fns = +{ + .cancel_pending_lock_requests_by_fid = smbd_cancel_pending_lock_requests_by_fid, + .send_stat_cache_delete_message = smbd_send_stat_cache_delete_message, + .can_delete_directory = smbd_can_delete_directory, + .change_to_root_user = smbd_change_to_root_user, + + .contend_level2_oplocks_begin = smbd_contend_level2_oplocks_begin, + .contend_level2_oplocks_end = smbd_contend_level2_oplocks_end, + + .become_root = smbd_become_root, + .unbecome_root = smbd_unbecome_root +}; void smbd_init_globals(void) { + set_smbd_shim(&smbd_shim_fns); + ZERO_STRUCT(conn_ctx_stack); ZERO_STRUCT(sec_ctx_stack); diff --git a/source3/smbd/oplock.c b/source3/smbd/oplock.c index 56481e9700..284b0321aa 100644 --- a/source3/smbd/oplock.c +++ b/source3/smbd/oplock.c @@ -849,7 +849,7 @@ static void contend_level2_oplocks_begin_default(files_struct *fsp, TALLOC_FREE(lck); } -void contend_level2_oplocks_begin(files_struct *fsp, +void smbd_contend_level2_oplocks_begin(files_struct *fsp, enum level2_contention_type type) { if (koplocks && koplocks->ops->contend_level2_oplocks_begin) { @@ -860,7 +860,7 @@ void contend_level2_oplocks_begin(files_struct *fsp, contend_level2_oplocks_begin_default(fsp, type); } -void contend_level2_oplocks_end(files_struct *fsp, +void smbd_contend_level2_oplocks_end(files_struct *fsp, enum level2_contention_type type) { /* Only kernel oplocks implement this so far */ diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h index 6e515278b4..adeaf68899 100644 --- a/source3/smbd/proto.h +++ b/source3/smbd/proto.h @@ -110,6 +110,9 @@ bool push_blocking_lock_request( struct byte_range_lock *br_lck, uint64_t offset, uint64_t count, uint64_t blocking_smblctx); +void smbd_cancel_pending_lock_requests_by_fid(files_struct *fsp, + struct byte_range_lock *br_lck, + enum file_close_type close_type); void cancel_pending_lock_requests_by_fid(files_struct *fsp, struct byte_range_lock *br_lck, enum file_close_type close_type); @@ -236,6 +239,8 @@ void DirCacheAdd(struct smb_Dir *dirp, const char *name, long offset); bool SearchDir(struct smb_Dir *dirp, const char *name, long *poffset); NTSTATUS can_delete_directory(struct connection_struct *conn, const char *dirname); +NTSTATUS smbd_can_delete_directory(struct connection_struct *conn, + const char *dirname); /* The following definitions come from smbd/dmapi.c */ @@ -670,6 +675,10 @@ void contend_level2_oplocks_begin(files_struct *fsp, enum level2_contention_type type); void contend_level2_oplocks_end(files_struct *fsp, enum level2_contention_type type); +void smbd_contend_level2_oplocks_begin(files_struct *fsp, + enum level2_contention_type type); +void smbd_contend_level2_oplocks_end(files_struct *fsp, + enum level2_contention_type type); void share_mode_entry_to_message(char *msg, const struct share_mode_entry *e); void message_to_share_mode_entry(struct share_mode_entry *e, char *msg); bool init_oplocks(struct messaging_context *msg_ctx); @@ -1046,6 +1055,8 @@ bool stat_cache_lookup(connection_struct *conn, char **pp_dirpath, char **pp_start, SMB_STRUCT_STAT *pst); +void smbd_send_stat_cache_delete_message(struct messaging_context *msg_ctx, + const char *name); void send_stat_cache_delete_message(struct messaging_context *msg_ctx, const char *name); void stat_cache_delete(const char *name); @@ -1106,10 +1117,13 @@ bool change_to_user(connection_struct *conn, uint16 vuid); bool change_to_user_by_session(connection_struct *conn, const struct auth_serversupplied_info *session_info); bool change_to_root_user(void); +bool smbd_change_to_root_user(void); bool become_authenticated_pipe_user(struct auth_serversupplied_info *session_info); bool unbecome_authenticated_pipe_user(void); void become_root(void); void unbecome_root(void); +void smbd_become_root(void); +void smbd_unbecome_root(void); bool become_user(connection_struct *conn, uint16 vuid); bool become_user_by_session(connection_struct *conn, const struct auth_serversupplied_info *session_info); diff --git a/source3/smbd/statcache.c b/source3/smbd/statcache.c index b0904c9ff7..963b7c4bc1 100644 --- a/source3/smbd/statcache.c +++ b/source3/smbd/statcache.c @@ -340,8 +340,8 @@ bool stat_cache_lookup(connection_struct *conn, Tell all smbd's to delete an entry. **************************************************************************/ -void send_stat_cache_delete_message(struct messaging_context *msg_ctx, - const char *name) +void smbd_send_stat_cache_delete_message(struct messaging_context *msg_ctx, + const char *name) { #ifdef DEVELOPER message_send_all(msg_ctx, diff --git a/source3/smbd/uid.c b/source3/smbd/uid.c index fb05a6ce98..285b158a19 100644 --- a/source3/smbd/uid.c +++ b/source3/smbd/uid.c @@ -345,7 +345,7 @@ bool change_to_user_by_session(connection_struct *conn, but modify the current_user entries. ****************************************************************************/ -bool change_to_root_user(void) +bool smbd_change_to_root_user(void) { set_root_sec_ctx(); @@ -441,7 +441,7 @@ static void pop_conn_ctx(void) restores the connection context. ****************************************************************************/ -void become_root(void) +void smbd_become_root(void) { /* * no good way to handle push_sec_ctx() failing without changing @@ -456,7 +456,7 @@ void become_root(void) /* Unbecome the root user */ -void unbecome_root(void) +void smbd_unbecome_root(void) { pop_sec_ctx(); pop_conn_ctx(); -- cgit