diff options
author | Andrew Bartlett <abartlet@samba.org> | 2011-06-24 16:26:23 +1000 |
---|---|---|
committer | Andrew Bartlett <abartlet@samba.org> | 2011-06-24 16:26:23 +1000 |
commit | 6da26870e0ae5acd6ff49a30ec2f6886b44d095e (patch) | |
tree | 850c71039563c16a5d563c47e7ba2ab645baf198 /source3/locking | |
parent | 6925a799d04c6fa59dd2ddef1f5510f9bb7d17d1 (diff) | |
parent | 2610c05b5b95cc7036b3d6dfb894c6cfbdb68483 (diff) | |
download | samba-6da26870e0ae5acd6ff49a30ec2f6886b44d095e.tar.gz samba-6da26870e0ae5acd6ff49a30ec2f6886b44d095e.tar.bz2 samba-6da26870e0ae5acd6ff49a30ec2f6886b44d095e.zip |
Merge 2610c05b5b95cc7036b3d6dfb894c6cfbdb68483 as Samba-4.0alpha16
Diffstat (limited to 'source3/locking')
-rw-r--r-- | source3/locking/brlock.c | 26 | ||||
-rw-r--r-- | source3/locking/locking.c | 80 | ||||
-rw-r--r-- | source3/locking/posix.c | 11 | ||||
-rw-r--r-- | source3/locking/proto.h | 26 |
4 files changed, 90 insertions, 53 deletions
diff --git a/source3/locking/brlock.c b/source3/locking/brlock.c index c325338062..6eef695f69 100644 --- a/source3/locking/brlock.c +++ b/source3/locking/brlock.c @@ -5,17 +5,17 @@ Copyright (C) Andrew Tridgell 1992-2000 Copyright (C) Jeremy Allison 1992-2000 - + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ @@ -51,8 +51,8 @@ static void print_lock_struct(unsigned int i, struct lock_struct *pls) i, (unsigned long long)pls->context.smblctx, (unsigned int)pls->context.tid, - procid_str(talloc_tos(), &pls->context.pid) )); - + server_id_str(talloc_tos(), &pls->context.pid) )); + DEBUG(10,("start = %.0f, size = %.0f, fnum = %d, %s %s\n", (double)pls->start, (double)pls->size, @@ -180,7 +180,7 @@ static bool brl_conflict1(const struct lock_struct *lck1, lck2->start >= (lck1->start + lck1->size)) { return False; } - + return True; } #endif @@ -1521,7 +1521,7 @@ void brl_close_fnum(struct messaging_context *msg_ctx, /* Copy the current lock array. */ if (br_lck->num_locks) { - locks_copy = (struct lock_struct *)TALLOC_MEMDUP(br_lck, locks, br_lck->num_locks * sizeof(struct lock_struct)); + locks_copy = (struct lock_struct *)talloc_memdup(br_lck, locks, br_lck->num_locks * sizeof(struct lock_struct)); if (!locks_copy) { smb_panic("brl_close_fnum: talloc failed"); } @@ -1823,7 +1823,7 @@ static struct byte_range_lock *brl_get_locks_internal(TALLOC_CTX *mem_ctx, files_struct *fsp, bool read_only) { TDB_DATA key, data; - struct byte_range_lock *br_lck = TALLOC_P(mem_ctx, struct byte_range_lock); + struct byte_range_lock *br_lck = talloc(mem_ctx, struct byte_range_lock); bool do_read_only = read_only; if (br_lck == NULL) { @@ -1845,7 +1845,7 @@ static struct byte_range_lock *brl_get_locks_internal(TALLOC_CTX *mem_ctx, } if (do_read_only) { - if (brlock_db->fetch(brlock_db, br_lck, key, &data) == -1) { + if (brlock_db->fetch(brlock_db, br_lck, key, &data) != 0) { DEBUG(3, ("Could not fetch byte range lock record\n")); TALLOC_FREE(br_lck); return NULL; @@ -1881,7 +1881,7 @@ static struct byte_range_lock *brl_get_locks_internal(TALLOC_CTX *mem_ctx, memcpy(br_lck->lock_data, data.dptr, data.dsize); } - + if (!fsp->lockdb_clean) { int orig_num_locks = br_lck->num_locks; @@ -1993,8 +1993,8 @@ static void brl_revalidate_collect(struct file_id id, struct server_id pid, static int compare_procids(const void *p1, const void *p2) { - const struct server_id *i1 = (struct server_id *)p1; - const struct server_id *i2 = (struct server_id *)p2; + const struct server_id *i1 = (const struct server_id *)p1; + const struct server_id *i2 = (const struct server_id *)p2; if (i1->pid < i2->pid) return -1; if (i2->pid > i2->pid) return 1; @@ -2020,7 +2020,7 @@ static void brl_revalidate(struct messaging_context *msg_ctx, uint32 i; struct server_id last_pid; - if (!(state = TALLOC_ZERO_P(NULL, struct brl_revalidate_state))) { + if (!(state = talloc_zero(NULL, struct brl_revalidate_state))) { DEBUG(0, ("talloc failed\n")); return; } diff --git a/source3/locking/locking.c b/source3/locking/locking.c index f5892ddf0d..81e93a555a 100644 --- a/source3/locking/locking.c +++ b/source3/locking/locking.c @@ -4,17 +4,17 @@ Copyright (C) Andrew Tridgell 1992-2000 Copyright (C) Jeremy Allison 1992-2006 Copyright (C) Volker Lendecke 2005 - + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. @@ -43,6 +43,7 @@ #include "../libcli/security/security.h" #include "serverid.h" #include "messages.h" +#include "util_tdb.h" #undef DBGC_CLASS #define DBGC_CLASS DBGC_LOCKING @@ -309,15 +310,15 @@ NTSTATUS do_unlock(struct messaging_context *msg_ctx, { bool ok = False; struct byte_range_lock *br_lck = NULL; - + if (!fsp->can_lock) { return fsp->is_directory ? NT_STATUS_INVALID_DEVICE_REQUEST : NT_STATUS_INVALID_HANDLE; } - + if (!lp_locking(fsp->conn->params)) { return NT_STATUS_OK; } - + DEBUG(10,("do_unlock: unlock start=%.0f len=%.0f requested for fnum %d file %s\n", (double)offset, (double)count, fsp->fnum, fsp_str_dbg(fsp))); @@ -334,7 +335,7 @@ NTSTATUS do_unlock(struct messaging_context *msg_ctx, offset, count, lock_flav); - + TALLOC_FREE(br_lck); if (!ok) { @@ -364,7 +365,7 @@ NTSTATUS do_lock_cancel(files_struct *fsp, return fsp->is_directory ? NT_STATUS_INVALID_DEVICE_REQUEST : NT_STATUS_INVALID_HANDLE; } - + if (!lp_locking(fsp->conn->params)) { return NT_STATUS_DOS(ERRDOS, ERRcancelviolation); } @@ -578,7 +579,7 @@ static int parse_delete_tokens_list(struct share_mode_lock *lck, p += sizeof(token_len); - pdtl = TALLOC_ZERO_P(lck, struct delete_token_list); + pdtl = talloc_zero(lck, struct delete_token_list); if (pdtl == NULL) { DEBUG(0,("parse_delete_tokens_list: talloc failed")); return -1; @@ -587,7 +588,7 @@ static int parse_delete_tokens_list(struct share_mode_lock *lck, memcpy(&pdtl->name_hash, p, sizeof(pdtl->name_hash)); p += sizeof(pdtl->name_hash); - pdtl->delete_token = TALLOC_ZERO_P(pdtl, struct security_unix_token); + pdtl->delete_token = talloc_zero(pdtl, struct security_unix_token); if (pdtl->delete_token == NULL) { DEBUG(0,("parse_delete_tokens_list: talloc failed")); return -1; @@ -615,7 +616,7 @@ static int parse_delete_tokens_list(struct share_mode_lock *lck, } pdtl->delete_token->ngroups = token_len / sizeof(gid_t); - pdtl->delete_token->groups = TALLOC_ARRAY(pdtl->delete_token, gid_t, + pdtl->delete_token->groups = talloc_array(pdtl->delete_token, gid_t, pdtl->delete_token->ngroups); if (pdtl->delete_token->groups == NULL) { DEBUG(0,("parse_delete_tokens_list: talloc failed")); @@ -671,7 +672,7 @@ static bool parse_share_modes(const TDB_DATA dbuf, struct share_mode_lock *lck) } lck->share_modes = NULL; - + if (lck->num_share_modes != 0) { if (dbuf.dsize < (sizeof(struct locking_data) + @@ -679,9 +680,9 @@ static bool parse_share_modes(const TDB_DATA dbuf, struct share_mode_lock *lck) sizeof(struct share_mode_entry)))) { smb_panic("parse_share_modes: buffer too short"); } - + lck->share_modes = (struct share_mode_entry *) - TALLOC_MEMDUP(lck, + talloc_memdup(lck, dbuf.dptr+sizeof(struct locking_data), lck->num_share_modes * sizeof(struct share_mode_entry)); @@ -781,7 +782,7 @@ static TDB_DATA unparse_share_modes(const struct share_mode_lock *lck) sp_len + 1 + bn_len + 1 + sn_len + 1; - result.dptr = TALLOC_ARRAY(lck, uint8, result.dsize); + result.dptr = talloc_array(lck, uint8, result.dsize); if (result.dptr == NULL) { smb_panic("talloc failed"); @@ -838,14 +839,17 @@ static TDB_DATA unparse_share_modes(const struct share_mode_lock *lck) offset += token_size; } - safe_strcpy((char *)result.dptr + offset, lck->servicepath, - result.dsize - offset - 1); + strlcpy((char *)result.dptr + offset, + lck->servicepath ? lck->servicepath : "", + result.dsize - offset); offset += sp_len + 1; - safe_strcpy((char *)result.dptr + offset, lck->base_name, - result.dsize - offset - 1); + strlcpy((char *)result.dptr + offset, + lck->base_name ? lck->base_name : "", + result.dsize - offset); offset += bn_len + 1; - safe_strcpy((char *)result.dptr + offset, lck->stream_name, - result.dsize - offset - 1); + strlcpy((char *)result.dptr + offset, + lck->stream_name ? lck->stream_name : "", + result.dsize - offset); if (DEBUGLEVEL >= 10) { print_share_mode_table(data); @@ -969,7 +973,7 @@ struct share_mode_lock *get_share_mode_lock(TALLOC_CTX *mem_ctx, struct file_id tmp; TDB_DATA key = locking_key(&id, &tmp); - if (!(lck = TALLOC_P(mem_ctx, struct share_mode_lock))) { + if (!(lck = talloc(mem_ctx, struct share_mode_lock))) { DEBUG(0, ("talloc failed\n")); return NULL; } @@ -1000,12 +1004,12 @@ struct share_mode_lock *fetch_share_mode_unlocked(TALLOC_CTX *mem_ctx, TDB_DATA key = locking_key(&id, &tmp); TDB_DATA data; - if (!(lck = TALLOC_P(mem_ctx, struct share_mode_lock))) { + if (!(lck = talloc(mem_ctx, struct share_mode_lock))) { DEBUG(0, ("talloc failed\n")); return NULL; } - if (lock_db->fetch(lock_db, lck, key, &data) == -1) { + if (lock_db->fetch(lock_db, lck, key, &data) != 0) { DEBUG(3, ("Could not fetch share entry\n")); TALLOC_FREE(lck); return NULL; @@ -1078,7 +1082,7 @@ bool rename_share_filename(struct messaging_context *msg_ctx, sn_len + 1; /* Set up the name changed message. */ - frm = TALLOC_ARRAY(lck, char, msg_len); + frm = talloc_array(lck, char, msg_len); if (!frm) { return False; } @@ -1087,10 +1091,15 @@ bool rename_share_filename(struct messaging_context *msg_ctx, DEBUG(10,("rename_share_filename: msg_len = %u\n", (unsigned int)msg_len )); - safe_strcpy(&frm[24], lck->servicepath, sp_len); - safe_strcpy(&frm[24 + sp_len + 1], lck->base_name, bn_len); - safe_strcpy(&frm[24 + sp_len + 1 + bn_len + 1], lck->stream_name, - sn_len); + strlcpy(&frm[24], + lck->servicepath ? lck->servicepath : "", + sp_len+1); + strlcpy(&frm[24 + sp_len + 1], + lck->base_name ? lck->base_name : "", + bn_len+1); + strlcpy(&frm[24 + sp_len + 1 + bn_len + 1], + lck->stream_name ? lck->stream_name : "", + sn_len+1); /* Send the messages. */ for (i=0; i<lck->num_share_modes; i++) { @@ -1424,7 +1433,7 @@ NTSTATUS can_set_delete_on_close(files_struct *fsp, uint32 dosmode) * Only allow delete on close for writable files. */ - if ((dosmode & aRONLY) && + if ((dosmode & FILE_ATTRIBUTE_READONLY) && !lp_delete_readonly(SNUM(fsp->conn))) { DEBUG(10,("can_set_delete_on_close: file %s delete on close " "flag set but file attribute is readonly.\n", @@ -1474,7 +1483,7 @@ static struct security_unix_token *copy_unix_token(TALLOC_CTX *ctx, const struct { struct security_unix_token *cpy; - cpy = TALLOC_P(ctx, struct security_unix_token); + cpy = talloc(ctx, struct security_unix_token); if (!cpy) { return NULL; } @@ -1484,11 +1493,12 @@ static struct security_unix_token *copy_unix_token(TALLOC_CTX *ctx, const struct cpy->ngroups = tok->ngroups; if (tok->ngroups) { /* Make this a talloc child of cpy. */ - cpy->groups = TALLOC_ARRAY(cpy, gid_t, tok->ngroups); + cpy->groups = (gid_t *)talloc_memdup( + cpy, tok->groups, tok->ngroups * sizeof(gid_t)); if (!cpy->groups) { + TALLOC_FREE(cpy); return NULL; } - memcpy(cpy->groups, tok->groups, tok->ngroups * sizeof(gid_t)); } return cpy; } @@ -1503,7 +1513,7 @@ static bool add_delete_on_close_token(struct share_mode_lock *lck, { struct delete_token_list *dtl; - dtl = TALLOC_ZERO_P(lck, struct delete_token_list); + dtl = talloc_zero(lck, struct delete_token_list); if (dtl == NULL) { return false; } @@ -1573,7 +1583,7 @@ void set_delete_on_close_lck(files_struct *fsp, bool set_delete_on_close(files_struct *fsp, bool delete_on_close, const struct security_unix_token *tok) { struct share_mode_lock *lck; - + DEBUG(10,("set_delete_on_close: %s delete on close flag for " "fnum = %d, file %s\n", delete_on_close ? "Adding" : "Removing", fsp->fnum, diff --git a/source3/locking/posix.c b/source3/locking/posix.c index cea8d2f8a2..51151df9a4 100644 --- a/source3/locking/posix.c +++ b/source3/locking/posix.c @@ -25,6 +25,7 @@ #include "system/filesys.h" #include "locking/proto.h" #include "dbwrap.h" +#include "util_tdb.h" #undef DBGC_CLASS #define DBGC_CLASS DBGC_LOCKING @@ -557,7 +558,7 @@ static void add_fd_to_close_entry(files_struct *fsp) SMB_ASSERT(rec != NULL); - new_data = TALLOC_ARRAY( + new_data = talloc_array( rec, uint8_t, rec->value.dsize + sizeof(fsp->fh->fd)); SMB_ASSERT(new_data != NULL); @@ -891,7 +892,7 @@ BECOMES..... | l_curr| | l_new | +-------+ +---------+ **********************************************/ - struct lock_list *l_new = TALLOC_P(ctx, struct lock_list); + struct lock_list *l_new = talloc(ctx, struct lock_list); if(l_new == NULL) { DEBUG(0,("posix_lock_list: talloc fail.\n")); @@ -999,7 +1000,7 @@ bool set_posix_lock_windows_flavour(files_struct *fsp, return False; } - if ((ll = TALLOC_P(l_ctx, struct lock_list)) == NULL) { + if ((ll = talloc(l_ctx, struct lock_list)) == NULL) { DEBUG(0,("set_posix_lock_windows_flavour: unable to talloc unlock list.\n")); talloc_destroy(l_ctx); return False; @@ -1118,7 +1119,7 @@ bool release_posix_lock_windows_flavour(files_struct *fsp, return False; } - if ((ul = TALLOC_P(ul_ctx, struct lock_list)) == NULL) { + if ((ul = talloc(ul_ctx, struct lock_list)) == NULL) { DEBUG(0,("release_posix_lock_windows_flavour: unable to talloc unlock list.\n")); talloc_destroy(ul_ctx); return False; @@ -1280,7 +1281,7 @@ bool release_posix_lock_posix_flavour(files_struct *fsp, return False; } - if ((ul = TALLOC_P(ul_ctx, struct lock_list)) == NULL) { + if ((ul = talloc(ul_ctx, struct lock_list)) == NULL) { DEBUG(0,("release_posix_lock_windows_flavour: unable to talloc unlock list.\n")); talloc_destroy(ul_ctx); return False; diff --git a/source3/locking/proto.h b/source3/locking/proto.h index 6f130961a8..b7c8990b1a 100644 --- a/source3/locking/proto.h +++ b/source3/locking/proto.h @@ -1,3 +1,27 @@ +/* + * Unix SMB/CIFS implementation. + * Locking functions + * + * Copyright (C) Andrew Tridgell 1992-2000 + * Copyright (C) Jeremy Allison 1992-2006 + * Copyright (C) Volker Lendecke 2005 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef _LOCKING_PROTO_H_ +#define _LOCKING_PROTO_H_ /* The following definitions come from locking/brlock.c */ @@ -199,3 +223,5 @@ bool release_posix_lock_posix_flavour(files_struct *fsp, const struct lock_context *lock_ctx, const struct lock_struct *plocks, int num_locks); + +#endif /* _LOCKING_PROTO_H_ */ |