diff options
author | Jeremy Allison <jra@samba.org> | 2012-07-09 12:26:56 -0700 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2012-07-09 12:26:56 -0700 |
commit | 9d5e026bde837ed853478a223e2823fd35c67d26 (patch) | |
tree | 0b41a219fcf07d086a52a72cd595bb63406c351c | |
parent | 1f37ed7a5283ef3abd095d6a92efa231e7e2444d (diff) | |
download | samba-9d5e026bde837ed853478a223e2823fd35c67d26.tar.gz samba-9d5e026bde837ed853478a223e2823fd35c67d26.tar.bz2 samba-9d5e026bde837ed853478a223e2823fd35c67d26.zip |
Make check_same_stat() and check_same_dev_ino() common functions.
-rw-r--r-- | source3/include/proto.h | 4 | ||||
-rw-r--r-- | source3/lib/util.c | 29 | ||||
-rw-r--r-- | source3/smbd/open.c | 29 | ||||
-rw-r--r-- | source3/smbd/proto.h | 2 |
4 files changed, 33 insertions, 31 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h index b7f2852a48..7625983518 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -400,6 +400,10 @@ bool file_exist_stat(const char *fname,SMB_STRUCT_STAT *sbuf, bool fake_dir_create_times); bool socket_exist(const char *fname); uint64_t get_file_size_stat(const SMB_STRUCT_STAT *sbuf); +bool check_same_dev_ino(const SMB_STRUCT_STAT *sbuf1, + const SMB_STRUCT_STAT *sbuf2); +bool check_same_stat(const SMB_STRUCT_STAT *sbuf1, + const SMB_STRUCT_STAT *sbuf2); void show_msg(const char *buf); int set_message_bcc(char *buf,int num_bytes); ssize_t message_push_blob(uint8 **outbuf, DATA_BLOB blob); diff --git a/source3/lib/util.c b/source3/lib/util.c index 697f7b143d..fa46448296 100644 --- a/source3/lib/util.c +++ b/source3/lib/util.c @@ -126,6 +126,35 @@ uint64_t get_file_size_stat(const SMB_STRUCT_STAT *sbuf) return sbuf->st_ex_size; } +/**************************************************************************** + Check two stats have identical dev and ino fields. +****************************************************************************/ + +bool check_same_dev_ino(const SMB_STRUCT_STAT *sbuf1, + const SMB_STRUCT_STAT *sbuf2) +{ + if (sbuf1->st_ex_dev != sbuf2->st_ex_dev || + sbuf1->st_ex_ino != sbuf2->st_ex_ino) { + return false; + } + return true; +} + +/**************************************************************************** + Check if a stat struct is identical for use. +****************************************************************************/ + +bool check_same_stat(const SMB_STRUCT_STAT *sbuf1, + const SMB_STRUCT_STAT *sbuf2) +{ + if (sbuf1->st_ex_uid != sbuf2->st_ex_uid || + sbuf1->st_ex_gid != sbuf2->st_ex_gid || + !check_same_dev_ino(sbuf1, sbuf2)) { + return false; + } + return true; +} + /******************************************************************* Show a smb message structure. ********************************************************************/ diff --git a/source3/smbd/open.c b/source3/smbd/open.c index 145a8a4e6a..88f779a527 100644 --- a/source3/smbd/open.c +++ b/source3/smbd/open.c @@ -40,20 +40,6 @@ struct deferred_open_record { }; /**************************************************************************** - Check two stats have identical dev and ino fields. -****************************************************************************/ - -static bool check_same_dev_ino(const SMB_STRUCT_STAT *sbuf1, - const SMB_STRUCT_STAT *sbuf2) -{ - if (sbuf1->st_ex_dev != sbuf2->st_ex_dev || - sbuf1->st_ex_ino != sbuf2->st_ex_ino) { - return false; - } - return true; -} - -/**************************************************************************** If the requester wanted DELETE_ACCESS and was rejected because the file ACL didn't include DELETE_ACCESS, see if the parent ACL overrides this. @@ -2751,21 +2737,6 @@ static NTSTATUS mkdir_internal(connection_struct *conn, } /**************************************************************************** - Ensure we didn't get symlink raced on opening a directory. -****************************************************************************/ - -bool check_same_stat(const SMB_STRUCT_STAT *sbuf1, - const SMB_STRUCT_STAT *sbuf2) -{ - if (sbuf1->st_ex_uid != sbuf2->st_ex_uid || - sbuf1->st_ex_gid != sbuf2->st_ex_gid || - !check_same_dev_ino(sbuf1, sbuf2)) { - return false; - } - return true; -} - -/**************************************************************************** Open a directory from an NT SMB call. ****************************************************************************/ diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h index 4279755d66..725f89c229 100644 --- a/source3/smbd/proto.h +++ b/source3/smbd/proto.h @@ -620,8 +620,6 @@ bool is_deferred_open_async(const void *ptr); NTSTATUS open_file_fchmod(connection_struct *conn, struct smb_filename *smb_fname, files_struct **result); -bool check_same_stat(const SMB_STRUCT_STAT *sbuf1, - const SMB_STRUCT_STAT *sbuf2); NTSTATUS create_directory(connection_struct *conn, struct smb_request *req, struct smb_filename *smb_dname); void msg_file_was_renamed(struct messaging_context *msg, |