s3-talloc Change TALLOC_ARRAY() to talloc_array()
[samba.git] / source3 / locking / locking.c
index f98208fbad2cc978577a7719b5e25652c5a8f587..55412ec8b2aa8c702db98b739d6e6fe2f64b276c 100644 (file)
@@ -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/>.
 
 */
 
 #include "includes.h"
-#include "librpc/gen_ndr/messaging.h"
+#include "system/filesys.h"
+#include "locking/proto.h"
 #include "smbd/globals.h"
 #include "dbwrap.h"
 #include "../libcli/security/security.h"
+#include "serverid.h"
+#include "messages.h"
+#include "util_tdb.h"
 
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_LOCKING
@@ -306,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)));
@@ -331,7 +335,7 @@ NTSTATUS do_unlock(struct messaging_context *msg_ctx,
                        offset,
                        count,
                        lock_flav);
-   
+
        TALLOC_FREE(br_lck);
 
        if (!ok) {
@@ -361,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);
        }
@@ -584,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, UNIX_USER_TOKEN);
+               pdtl->delete_token = TALLOC_ZERO_P(pdtl, struct security_unix_token);
                if (pdtl->delete_token == NULL) {
                        DEBUG(0,("parse_delete_tokens_list: talloc failed"));
                        return -1;
@@ -612,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"));
@@ -668,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) +
@@ -676,7 +680,7 @@ 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,
                                      dbuf.dptr+sizeof(struct locking_data),
@@ -778,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");
@@ -808,7 +812,7 @@ static TDB_DATA unparse_share_modes(const struct share_mode_lock *lck)
 
        /* Store any delete on close tokens. */
        for (pdtl = lck->delete_tokens; pdtl; pdtl = pdtl->next) {
-               UNIX_USER_TOKEN *pdt = pdtl->delete_token;
+               struct security_unix_token *pdt = pdtl->delete_token;
                uint32_t token_size = sizeof(uint32_t) +
                                        sizeof(uint32_t) +
                                        sizeof(uid_t) +
@@ -835,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);
@@ -1075,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;
        }
@@ -1084,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++) {
@@ -1373,13 +1385,15 @@ bool remove_share_oplock(struct share_mode_lock *lck, files_struct *fsp)
                return False;
        }
 
-       e->op_mid = 0;
-       if (EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type)) {
+       if (EXCLUSIVE_OPLOCK_TYPE(e->op_type)) {
                /*
                 * Going from exclusive or batch,
                 * we always go through FAKE_LEVEL_II
                 * first.
                 */
+               if (!EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type)) {
+                       smb_panic("remove_share_oplock: logic error");
+               }
                e->op_type = FAKE_LEVEL_II_OPLOCK;
        } else {
                e->op_type = NO_OPLOCK;
@@ -1419,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",
@@ -1461,15 +1475,15 @@ NTSTATUS can_set_delete_on_close(files_struct *fsp, uint32 dosmode)
 }
 
 /*************************************************************************
- Return a talloced copy of a UNIX_USER_TOKEN. NULL on fail.
+ Return a talloced copy of a struct security_unix_token. NULL on fail.
  (Should this be in locking.c.... ?).
 *************************************************************************/
 
-static UNIX_USER_TOKEN *copy_unix_token(TALLOC_CTX *ctx, const UNIX_USER_TOKEN *tok)
+static struct security_unix_token *copy_unix_token(TALLOC_CTX *ctx, const struct security_unix_token *tok)
 {
-       UNIX_USER_TOKEN *cpy;
+       struct security_unix_token *cpy;
 
-       cpy = TALLOC_P(ctx, UNIX_USER_TOKEN);
+       cpy = TALLOC_P(ctx, struct security_unix_token);
        if (!cpy) {
                return NULL;
        }
@@ -1479,11 +1493,12 @@ static UNIX_USER_TOKEN *copy_unix_token(TALLOC_CTX *ctx, const UNIX_USER_TOKEN *
        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;
 }
@@ -1494,7 +1509,7 @@ static UNIX_USER_TOKEN *copy_unix_token(TALLOC_CTX *ctx, const UNIX_USER_TOKEN *
 
 static bool add_delete_on_close_token(struct share_mode_lock *lck,
                        uint32_t name_hash,
-                       const UNIX_USER_TOKEN *tok)
+                       const struct security_unix_token *tok)
 {
        struct delete_token_list *dtl;
 
@@ -1521,14 +1536,14 @@ static bool add_delete_on_close_token(struct share_mode_lock *lck,
  changed the delete on close flag. This will be noticed
  in the close code, the last closer will delete the file
  if flag is set.
- This makes a copy of any UNIX_USER_TOKEN into the
+ This makes a copy of any struct security_unix_token into the
  lck entry. This function is used when the lock is already granted.
 ****************************************************************************/
 
 void set_delete_on_close_lck(files_struct *fsp,
                        struct share_mode_lock *lck,
                        bool delete_on_close,
-                       const UNIX_USER_TOKEN *tok)
+                       const struct security_unix_token *tok)
 {
        struct delete_token_list *dtl;
        bool ret;
@@ -1565,10 +1580,10 @@ void set_delete_on_close_lck(files_struct *fsp,
        SMB_ASSERT(ret);
 }
 
-bool set_delete_on_close(files_struct *fsp, bool delete_on_close, const UNIX_USER_TOKEN *tok)
+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,
@@ -1596,15 +1611,15 @@ bool set_delete_on_close(files_struct *fsp, bool delete_on_close, const UNIX_USE
        return True;
 }
 
-const UNIX_USER_TOKEN *get_delete_on_close_token(struct share_mode_lock *lck, uint32_t name_hash)
+const struct security_unix_token *get_delete_on_close_token(struct share_mode_lock *lck, uint32_t name_hash)
 {
        struct delete_token_list *dtl;
 
-       DEBUG(10,("get_delete_on_close_token: name_hash = %u\n",
+       DEBUG(10,("get_delete_on_close_token: name_hash = 0x%x\n",
                        (unsigned int)name_hash ));
 
        for (dtl = lck->delete_tokens; dtl; dtl = dtl->next) {
-               DEBUG(10,("get_delete_on_close_token: dtl->name_hash = %u\n",
+               DEBUG(10,("get_delete_on_close_token: dtl->name_hash = 0x%x\n",
                                (unsigned int)dtl->name_hash ));
                if (dtl->name_hash == name_hash) {
                        return dtl->delete_token;