s3: Change fsp->fsp_name to be an smb_filename struct!
authorTim Prouty <tprouty@samba.org>
Fri, 10 Jul 2009 21:50:37 +0000 (14:50 -0700)
committerTim Prouty <tprouty@samba.org>
Tue, 21 Jul 2009 00:26:56 +0000 (17:26 -0700)
32 files changed:
source3/include/proto.h
source3/include/smb.h
source3/locking/brlock.c
source3/locking/locking.c
source3/locking/posix.c
source3/smbd/aio.c
source3/smbd/blocking.c
source3/smbd/close.c
source3/smbd/dosmode.c
source3/smbd/fileio.c
source3/smbd/files.c
source3/smbd/ipc.c
source3/smbd/notify.c
source3/smbd/nttrans.c
source3/smbd/open.c
source3/smbd/oplock.c
source3/smbd/oplock_irix.c
source3/smbd/oplock_linux.c
source3/smbd/oplock_onefs.c
source3/smbd/pipes.c
source3/smbd/posix_acls.c
source3/smbd/reply.c
source3/smbd/smb2_close.c
source3/smbd/smb2_create.c
source3/smbd/smb2_flush.c
source3/smbd/smb2_getinfo.c
source3/smbd/smb2_notify.c
source3/smbd/smb2_read.c
source3/smbd/smb2_setinfo.c
source3/smbd/smb2_write.c
source3/smbd/trans2.c
source3/smbd/vfs.c

index 695e14b53c7af6989246247a2cc0d97c089e3273..830d2284c482525768263d0344ce1b5d0662c11d 100644 (file)
@@ -6365,9 +6365,12 @@ void file_sync_all(connection_struct *conn);
 void file_free(struct smb_request *req, files_struct *fsp);
 files_struct *file_fnum(uint16 fnum);
 files_struct *file_fsp(struct smb_request *req, uint16 fid);
-void dup_file_fsp(struct smb_request *req, files_struct *from,
+NTSTATUS dup_file_fsp(struct smb_request *req, files_struct *from,
                      uint32 access_mask, uint32 share_access,
                      uint32 create_options, files_struct *to);
+const char *fsp_str_dbg(const struct files_struct *fsp);
+NTSTATUS fsp_set_smb_fname(struct files_struct *fsp,
+                          const struct smb_filename *smb_fname_in);
 
 /* The following definitions come from smbd/ipc.c  */
 
index 2e9cf1b54aaced4478889fa8d5c0fa166ab95d19..94ed2186fbd561ac199a2ad06e035afc80b5b891 100644 (file)
@@ -452,7 +452,7 @@ typedef struct files_struct {
        bool lockdb_clean;
        bool initial_delete_on_close; /* Only set at NTCreateX if file was created. */
        bool posix_open;
-       char *fsp_name;
+       struct smb_filename *fsp_name;
 
        struct vfs_fsp_data *vfs_extension;
        struct fake_file_handle *fake_file_handle;
index be2948c53113fd51218595c0d9e80b3ff02c6f7e..e238ec959b6e01682b1fa83bf32a25c9c26bcb20 100644 (file)
@@ -1196,7 +1196,7 @@ bool brl_locktest(struct byte_range_lock *br_lck,
 
                DEBUG(10,("brl_locktest: posix start=%.0f len=%.0f %s for fnum %d file %s\n",
                        (double)start, (double)size, ret ? "locked" : "unlocked",
-                       fsp->fnum, fsp->fsp_name ));
+                       fsp->fnum, fsp_str_dbg(fsp)));
 
                /* We need to return the inverse of is_posix_locked. */
                ret = !ret;
@@ -1262,7 +1262,7 @@ NTSTATUS brl_lockquery(struct byte_range_lock *br_lck,
 
                DEBUG(10,("brl_lockquery: posix start=%.0f len=%.0f %s for fnum %d file %s\n",
                        (double)*pstart, (double)*psize, ret ? "locked" : "unlocked",
-                       fsp->fnum, fsp->fsp_name ));
+                       fsp->fnum, fsp_str_dbg(fsp)));
 
                if (ret) {
                        /* Hmmm. No clue what to set smbpid to - use -1. */
index 91fe137fdcbf8847a9e27f58edb63980f4098a0c..fba871c704e0cb5417e82bdd462524fed165e754 100644 (file)
@@ -109,11 +109,11 @@ bool strict_lock_default(files_struct *fsp, struct lock_struct *plock)
 
        if (strict_locking == Auto) {
                if  (EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type) && (plock->lock_type == READ_LOCK || plock->lock_type == WRITE_LOCK)) {
-                       DEBUG(10,("is_locked: optimisation - exclusive oplock on file %s\n", fsp->fsp_name ));
+                       DEBUG(10,("is_locked: optimisation - exclusive oplock on file %s\n", fsp_str_dbg(fsp)));
                        ret = True;
                } else if ((fsp->oplock_type == LEVEL_II_OPLOCK) &&
                           (plock->lock_type == READ_LOCK)) {
-                       DEBUG(10,("is_locked: optimisation - level II oplock on file %s\n", fsp->fsp_name ));
+                       DEBUG(10,("is_locked: optimisation - level II oplock on file %s\n", fsp_str_dbg(fsp)));
                        ret = True;
                } else {
                        struct byte_range_lock *br_lck = brl_get_locks_readonly(talloc_tos(), fsp);
@@ -149,7 +149,7 @@ bool strict_lock_default(files_struct *fsp, struct lock_struct *plock)
                        lock_flav_name(plock->lock_flav),
                        (double)plock->start, (double)plock->size,
                        ret ? "unlocked" : "locked",
-                       plock->fnum, fsp->fsp_name ));
+                       plock->fnum, fsp_str_dbg(fsp)));
 
        return ret;
 }
@@ -259,7 +259,7 @@ struct byte_range_lock *do_lock(struct messaging_context *msg_ctx,
                "blocking_lock=%s requested for fnum %d file %s\n",
                lock_flav_name(lock_flav), lock_type_name(lock_type),
                (double)offset, (double)count, blocking_lock ? "true" :
-               "false", fsp->fnum, fsp->fsp_name));
+               "false", fsp->fnum, fsp_str_dbg(fsp)));
 
        br_lck = brl_get_locks(talloc_tos(), fsp);
        if (!br_lck) {
@@ -308,7 +308,8 @@ NTSTATUS do_unlock(struct messaging_context *msg_ctx,
        }
        
        DEBUG(10,("do_unlock: unlock start=%.0f len=%.0f requested for fnum %d file %s\n",
-                 (double)offset, (double)count, fsp->fnum, fsp->fsp_name ));
+                 (double)offset, (double)count, fsp->fnum,
+                 fsp_str_dbg(fsp)));
 
        br_lck = brl_get_locks(talloc_tos(), fsp);
        if (!br_lck) {
@@ -358,7 +359,8 @@ NTSTATUS do_lock_cancel(files_struct *fsp,
        }
 
        DEBUG(10,("do_lock_cancel: cancel start=%.0f len=%.0f requested for fnum %d file %s\n",
-                 (double)offset, (double)count, fsp->fnum, fsp->fsp_name ));
+                 (double)offset, (double)count, fsp->fnum,
+                 fsp_str_dbg(fsp)));
 
        br_lck = brl_get_locks(talloc_tos(), fsp);
        if (!br_lck) {
@@ -1311,7 +1313,7 @@ NTSTATUS can_set_delete_on_close(files_struct *fsp, bool delete_on_close,
            !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",
-                         fsp->fsp_name ));
+                         fsp_str_dbg(fsp)));
                return NT_STATUS_CANNOT_DELETE;
        }
 
@@ -1322,7 +1324,7 @@ NTSTATUS can_set_delete_on_close(files_struct *fsp, bool delete_on_close,
        if (!CAN_WRITE(fsp->conn)) {
                DEBUG(10,("can_set_delete_on_close: file %s delete on "
                          "close flag set but write access denied on share.\n",
-                         fsp->fsp_name ));
+                         fsp_str_dbg(fsp)));
                return NT_STATUS_ACCESS_DENIED;
        }
 
@@ -1334,13 +1336,15 @@ NTSTATUS can_set_delete_on_close(files_struct *fsp, bool delete_on_close,
        if (!(fsp->access_mask & DELETE_ACCESS)) {
                DEBUG(10,("can_set_delete_on_close: file %s delete on "
                          "close flag set but delete access denied.\n",
-                         fsp->fsp_name ));
+                         fsp_str_dbg(fsp)));
                return NT_STATUS_ACCESS_DENIED;
        }
 
        /* Don't allow delete on close for non-empty directories. */
        if (fsp->is_directory) {
-               return can_delete_directory(fsp->conn, fsp->fsp_name);
+               SMB_ASSERT(!is_ntfs_stream_smb_fname(fsp->fsp_name));
+               return can_delete_directory(fsp->conn,
+                                           fsp->fsp_name->base_name);
        }
 
        return NT_STATUS_OK;
@@ -1422,7 +1426,7 @@ bool set_delete_on_close(files_struct *fsp, bool delete_on_close, const UNIX_USE
        DEBUG(10,("set_delete_on_close: %s delete on close flag for "
                  "fnum = %d, file %s\n",
                  delete_on_close ? "Adding" : "Removing", fsp->fnum,
-                 fsp->fsp_name ));
+                 fsp_str_dbg(fsp)));
 
        lck = get_share_mode_lock(talloc_tos(), fsp->file_id, NULL, NULL,
                                  NULL);
@@ -1443,7 +1447,8 @@ bool set_delete_on_close(files_struct *fsp, bool delete_on_close, const UNIX_USE
        set_delete_on_close_lck(lck, delete_on_close, tok);
 
        if (fsp->is_directory) {
-               send_stat_cache_delete_message(fsp->fsp_name);
+               SMB_ASSERT(!is_ntfs_stream_smb_fname(fsp->fsp_name));
+               send_stat_cache_delete_message(fsp->fsp_name->base_name);
        }
 
        TALLOC_FREE(lck);
index 9b51c3aa6abca3c48d7023530aaa5d474208e87a..33ffaf95caf928629a71e669f3015b5f90e1435e 100644 (file)
@@ -280,8 +280,9 @@ bool is_posix_locked(files_struct *fsp,
        SMB_OFF_T count;
        int posix_lock_type = map_posix_lock_type(fsp,*plock_type);
 
-       DEBUG(10,("is_posix_locked: File %s, offset = %.0f, count = %.0f, type = %s\n",
-               fsp->fsp_name, (double)*pu_offset, (double)*pu_count, posix_lock_type_name(*plock_type) ));
+       DEBUG(10,("is_posix_locked: File %s, offset = %.0f, count = %.0f, "
+                 "type = %s\n", fsp_str_dbg(fsp), (double)*pu_offset,
+                 (double)*pu_count,  posix_lock_type_name(*plock_type)));
 
        /*
         * If the requested lock won't fit in the POSIX range, we will
@@ -424,7 +425,7 @@ static void increment_windows_lock_ref_count(files_struct *fsp)
        TALLOC_FREE(rec);
 
        DEBUG(10,("increment_windows_lock_ref_count for file now %s = %d\n",
-                 fsp->fsp_name, lock_ref_count ));
+                 fsp_str_dbg(fsp), lock_ref_count));
 }
 
 /****************************************************************************
@@ -460,7 +461,7 @@ void reduce_windows_lock_ref_count(files_struct *fsp, unsigned int dcount)
        TALLOC_FREE(rec);
 
        DEBUG(10,("reduce_windows_lock_ref_count for file now %s = %d\n",
-                 fsp->fsp_name, lock_ref_count ));
+                 fsp_str_dbg(fsp), lock_ref_count));
 }
 
 static void decrement_windows_lock_ref_count(files_struct *fsp)
@@ -492,7 +493,7 @@ static int get_windows_lock_ref_count(files_struct *fsp)
        }
 
        DEBUG(10,("get_windows_lock_count for file %s = %d\n",
-                 fsp->fsp_name, lock_ref_count ));
+                 fsp_str_dbg(fsp), lock_ref_count));
 
        return lock_ref_count;
 }
@@ -518,7 +519,7 @@ static void delete_windows_lock_ref_count(files_struct *fsp)
        TALLOC_FREE(rec);
 
        DEBUG(10,("delete_windows_lock_ref_count for file %s\n",
-                 fsp->fsp_name));
+                 fsp_str_dbg(fsp)));
 }
 
 /****************************************************************************
@@ -555,7 +556,7 @@ static void add_fd_to_close_entry(files_struct *fsp)
        TALLOC_FREE(rec);
 
        DEBUG(10,("add_fd_to_close_entry: added fd %d file %s\n",
-                 fsp->fh->fd, fsp->fsp_name ));
+                 fsp->fh->fd, fsp_str_dbg(fsp)));
 }
 
 /****************************************************************************
@@ -945,8 +946,10 @@ bool set_posix_lock_windows_flavour(files_struct *fsp,
        struct lock_list *llist = NULL;
        struct lock_list *ll = NULL;
 
-       DEBUG(5,("set_posix_lock_windows_flavour: File %s, offset = %.0f, count = %.0f, type = %s\n",
-                       fsp->fsp_name, (double)u_offset, (double)u_count, posix_lock_type_name(lock_type) ));
+       DEBUG(5,("set_posix_lock_windows_flavour: File %s, offset = %.0f, "
+                "count = %.0f, type = %s\n", fsp_str_dbg(fsp),
+                (double)u_offset, (double)u_count,
+                posix_lock_type_name(lock_type)));
 
        /*
         * If the requested lock won't fit in the POSIX range, we will
@@ -1079,8 +1082,9 @@ bool release_posix_lock_windows_flavour(files_struct *fsp,
        struct lock_list *ulist = NULL;
        struct lock_list *ul = NULL;
 
-       DEBUG(5,("release_posix_lock_windows_flavour: File %s, offset = %.0f, count = %.0f\n",
-               fsp->fsp_name, (double)u_offset, (double)u_count ));
+       DEBUG(5,("release_posix_lock_windows_flavour: File %s, offset = %.0f, "
+                "count = %.0f\n", fsp_str_dbg(fsp),
+                (double)u_offset, (double)u_count));
 
        /* Remember the number of Windows locks we have on this dev/ino pair. */
        decrement_windows_lock_ref_count(fsp);
@@ -1197,8 +1201,10 @@ bool set_posix_lock_posix_flavour(files_struct *fsp,
        SMB_OFF_T count;
        int posix_lock_type = map_posix_lock_type(fsp,lock_type);
 
-       DEBUG(5,("set_posix_lock_posix_flavour: File %s, offset = %.0f, count = %.0f, type = %s\n",
-                       fsp->fsp_name, (double)u_offset, (double)u_count, posix_lock_type_name(lock_type) ));
+       DEBUG(5,("set_posix_lock_posix_flavour: File %s, offset = %.0f, count "
+                "= %.0f, type = %s\n", fsp_str_dbg(fsp),
+                (double)u_offset, (double)u_count,
+                posix_lock_type_name(lock_type)));
 
        /*
         * If the requested lock won't fit in the POSIX range, we will
@@ -1241,8 +1247,9 @@ bool release_posix_lock_posix_flavour(files_struct *fsp,
        struct lock_list *ulist = NULL;
        struct lock_list *ul = NULL;
 
-       DEBUG(5,("release_posix_lock_posix_flavour: File %s, offset = %.0f, count = %.0f\n",
-               fsp->fsp_name, (double)u_offset, (double)u_count ));
+       DEBUG(5,("release_posix_lock_posix_flavour: File %s, offset = %.0f, "
+                "count = %.0f\n", fsp_str_dbg(fsp),
+                (double)u_offset, (double)u_count));
 
        /*
         * If the requested lock won't fit in the POSIX range, we will
index c6f700f17a0901b0fb5856579ede1a22046dabfc..ed415c5e1304a7b4c6adb87c92c9852139425f4a 100644 (file)
@@ -188,7 +188,7 @@ bool schedule_aio_read_and_X(connection_struct *conn,
 
        DEBUG(10,("schedule_aio_read_and_X: scheduled aio_read for file %s, "
                  "offset %.0f, len = %u (mid = %u)\n",
-                 fsp->fsp_name, (double)startpos, (unsigned int)smb_maxcnt,
+                 fsp_str_dbg(fsp), (double)startpos, (unsigned int)smb_maxcnt,
                  (unsigned int)aio_ex->req->mid ));
 
        outstanding_aio_calls++;
@@ -241,7 +241,7 @@ bool schedule_aio_write_and_X(connection_struct *conn,
                DEBUG(10,("schedule_aio_write_and_X: failed to schedule "
                          "aio_write for file %s, offset %.0f, len = %u "
                          "(mid = %u)\n",
-                         fsp->fsp_name, (double)startpos,
+                         fsp_str_dbg(fsp), (double)startpos,
                          (unsigned int)numtowrite,
                          (unsigned int)req->mid ));
                return False;
@@ -300,14 +300,14 @@ bool schedule_aio_write_and_X(connection_struct *conn,
                                            "failed.");
                }
                DEBUG(10,("schedule_aio_write_and_X: scheduled aio_write "
-                         "behind for file %s\n", fsp->fsp_name ));
+                         "behind for file %s\n", fsp_str_dbg(fsp)));
        }
        outstanding_aio_calls++;
 
        DEBUG(10,("schedule_aio_write_and_X: scheduled aio_write for file "
                  "%s, offset %.0f, len = %u (mid = %u) "
                  "outstanding_aio_calls = %d\n",
-                 fsp->fsp_name, (double)startpos, (unsigned int)numtowrite,
+                 fsp_str_dbg(fsp), (double)startpos, (unsigned int)numtowrite,
                  (unsigned int)aio_ex->req->mid, outstanding_aio_calls ));
 
        return True;
@@ -341,7 +341,7 @@ static int handle_aio_read_complete(struct aio_extra *aio_ex)
 
                DEBUG( 3,( "handle_aio_read_complete: file %s nread == -1. "
                           "Error = %s\n",
-                          aio_ex->fsp->fsp_name, strerror(errno) ));
+                          fsp_str_dbg(aio_ex->fsp), strerror(errno)));
 
                ret = errno;
                ERROR_NT(map_nt_error_from_unix(ret));
@@ -359,7 +359,7 @@ static int handle_aio_read_complete(struct aio_extra *aio_ex)
 
                DEBUG( 3, ( "handle_aio_read_complete file %s max=%d "
                            "nread=%d\n",
-                           aio_ex->fsp->fsp_name,
+                           fsp_str_dbg(aio_ex->fsp),
                            (int)aio_ex->acb.aio_nbytes, (int)nread ) );
 
        }
@@ -374,7 +374,7 @@ static int handle_aio_read_complete(struct aio_extra *aio_ex)
 
        DEBUG(10,("handle_aio_read_complete: scheduled aio_read completed "
                  "for file %s, offset %.0f, len = %u\n",
-                 aio_ex->fsp->fsp_name, (double)aio_ex->acb.aio_offset,
+                 fsp_str_dbg(aio_ex->fsp), (double)aio_ex->acb.aio_offset,
                  (unsigned int)nread ));
 
        return ret;
@@ -399,13 +399,13 @@ static int handle_aio_write_complete(struct aio_extra *aio_ex)
                                DEBUG(5,("handle_aio_write_complete: "
                                         "aio_write_behind failed ! File %s "
                                         "is corrupt ! Error %s\n",
-                                        fsp->fsp_name, strerror(errno) ));
+                                        fsp_str_dbg(fsp), strerror(errno)));
                                ret = errno;
                        } else {
                                DEBUG(0,("handle_aio_write_complete: "
                                         "aio_write_behind failed ! File %s "
                                         "is corrupt ! Wanted %u bytes but "
-                                        "only wrote %d\n", fsp->fsp_name,
+                                        "only wrote %d\n", fsp_str_dbg(fsp),
                                         (unsigned int)numtowrite,
                                         (int)nwritten ));
                                ret = EIO;
@@ -413,7 +413,7 @@ static int handle_aio_write_complete(struct aio_extra *aio_ex)
                } else {
                        DEBUG(10,("handle_aio_write_complete: "
                                  "aio_write_behind completed for file %s\n",
-                                 fsp->fsp_name ));
+                                 fsp_str_dbg(fsp)));
                }
                return 0;
        }
@@ -424,7 +424,7 @@ static int handle_aio_write_complete(struct aio_extra *aio_ex)
        if(nwritten == -1) {
                DEBUG( 3,( "handle_aio_write: file %s wanted %u bytes. "
                           "nwritten == %d. Error = %s\n",
-                          fsp->fsp_name, (unsigned int)numtowrite,
+                          fsp_str_dbg(fsp), (unsigned int)numtowrite,
                           (int)nwritten, strerror(errno) ));
 
                /* If errno is ECANCELED then don't return anything to the
@@ -456,7 +456,7 @@ static int handle_aio_write_complete(struct aio_extra *aio_ex)
                                   ERRHRD, ERRdiskfull);
                        srv_set_message(outbuf,0,0,true);
                        DEBUG(5,("handle_aio_write: sync_file for %s returned %s\n",
-                               fsp->fsp_name, nt_errstr(status) ));
+                                fsp_str_dbg(fsp), nt_errstr(status)));
                }
 
                aio_ex->fsp->fh->pos = aio_ex->acb.aio_offset + nwritten;
@@ -472,7 +472,7 @@ static int handle_aio_write_complete(struct aio_extra *aio_ex)
 
        DEBUG(10,("handle_aio_write_complete: scheduled aio_write completed "
                  "for file %s, offset %.0f, requested %u, written = %u\n",
-                 fsp->fsp_name, (double)aio_ex->acb.aio_offset,
+                 fsp_str_dbg(fsp), (double)aio_ex->acb.aio_offset,
                  (unsigned int)numtowrite, (unsigned int)nwritten ));
 
        return ret;
@@ -496,7 +496,7 @@ static bool handle_aio_completed(struct aio_extra *aio_ex, int *perr)
        if (SMB_VFS_AIO_ERROR(aio_ex->fsp, &aio_ex->acb) == EINPROGRESS) {
                DEBUG(10,( "handle_aio_completed: operation mid %u still in "
                           "process for file %s\n",
-                          aio_ex->req->mid, aio_ex->fsp->fsp_name ));
+                          aio_ex->req->mid, fsp_str_dbg(aio_ex->fsp)));
                return False;
        }
 
index 4c61428692dc48d45ca76600d2e5cddd140f73b8..e752194ca5e385e678974da874026afd4fccf7e5 100644 (file)
@@ -202,7 +202,7 @@ bool push_blocking_lock_request( struct byte_range_lock *br_lck,
                "expiry time (%u sec. %u usec) (+%d msec) for fnum = %d, name = %s\n",
                (unsigned int)blr->expire_time.tv_sec,
                (unsigned int)blr->expire_time.tv_usec, lock_timeout,
-               blr->fsp->fnum, blr->fsp->fsp_name ));
+               blr->fsp->fnum, fsp_str_dbg(blr->fsp)));
 
        return True;
 }
@@ -418,8 +418,9 @@ static bool process_lockingX(struct blocking_lock_record *blr)
                 * Success - we got all the locks.
                 */
 
-               DEBUG(3,("process_lockingX file = %s, fnum=%d type=%d num_locks=%d\n",
-                        fsp->fsp_name, fsp->fnum, (unsigned int)locktype, num_locks) );
+               DEBUG(3,("process_lockingX file = %s, fnum=%d type=%d "
+                        "num_locks=%d\n", fsp_str_dbg(fsp), fsp->fnum,
+                        (unsigned int)locktype, num_locks));
 
                reply_lockingX_success(blr);
                return True;
@@ -442,7 +443,7 @@ static bool process_lockingX(struct blocking_lock_record *blr)
 
        DEBUG(10,("process_lockingX: only got %d locks of %d needed for file %s, fnum = %d. \
 Waiting....\n", 
-                 blr->lock_num, num_locks, fsp->fsp_name, fsp->fnum));
+                blr->lock_num, num_locks, fsp_str_dbg(fsp), fsp->fnum));
 
        return False;
 }
@@ -533,7 +534,7 @@ void cancel_pending_lock_requests_by_fid(files_struct *fsp, struct byte_range_lo
 
                DEBUG(10, ("remove_pending_lock_requests_by_fid - removing "
                           "request type %d for file %s fnum = %d\n",
-                          blr->req->cmd, fsp->fsp_name, fsp->fnum));
+                          blr->req->cmd, fsp_str_dbg(fsp), fsp->fnum));
 
                blr_cancelled = blocking_lock_cancel(fsp,
                                     blr->lock_pid,
@@ -583,7 +584,7 @@ void remove_pending_lock_requests_by_mid(int mid)
                if (br_lck) {
                        DEBUG(10, ("remove_pending_lock_requests_by_mid - "
                                   "removing request type %d for file %s fnum "
-                                  "= %d\n", blr->req->cmd, fsp->fsp_name,
+                                  "= %d\n", blr->req->cmd, fsp_str_dbg(fsp),
                                   fsp->fnum ));
 
                        brl_lock_cancel(br_lck,
@@ -703,7 +704,7 @@ void process_blocking_lock_queue(void)
                                DEBUG(5,("process_blocking_lock_queue: "
                                         "pending lock fnum = %d for file %s "
                                         "timed out.\n", blr->fsp->fnum,
-                                        blr->fsp->fsp_name ));
+                                        fsp_str_dbg(blr->fsp)));
 
                                brl_lock_cancel(br_lck,
                                        blr->lock_pid,
index a0672f3949faa3a35f09d2acda7bf8e262de660e..f878aaa0568b3f137ee40b668cf056d13c62477f 100644 (file)
@@ -36,90 +36,102 @@ static NTSTATUS check_magic(struct files_struct *fsp)
        TALLOC_CTX *ctx = NULL;
        const char *p;
        struct connection_struct *conn = fsp->conn;
+       char *fname = NULL;
+       NTSTATUS status;
 
        if (!*lp_magicscript(SNUM(conn))) {
                return NT_STATUS_OK;
        }
 
-       DEBUG(5,("checking magic for %s\n",fsp->fsp_name));
+       DEBUG(5,("checking magic for %s\n", fsp_str_dbg(fsp)));
+
+       ctx = talloc_stackframe();
+
+       status = get_full_smb_filename(ctx, fsp->fsp_name, &fname);
+       if (!NT_STATUS_IS_OK(status)) {
+               goto out;
+       }
 
-       if (!(p = strrchr_m(fsp->fsp_name,'/'))) {
-               p = fsp->fsp_name;
+       if (!(p = strrchr_m(fname,'/'))) {
+               p = fname;
        } else {
                p++;
        }
 
        if (!strequal(lp_magicscript(SNUM(conn)),p)) {
-               return NT_STATUS_OK;
+               status = NT_STATUS_OK;
+               goto out;
        }
 
-       ctx = talloc_stackframe();
-
        if (*lp_magicoutput(SNUM(conn))) {
                magic_output = lp_magicoutput(SNUM(conn));
        } else {
                magic_output = talloc_asprintf(ctx,
                                "%s.out",
-                               fsp->fsp_name);
+                               fname);
        }
        if (!magic_output) {
-               TALLOC_FREE(ctx);
-               return NT_STATUS_NO_MEMORY;
+               status = NT_STATUS_NO_MEMORY;
+               goto out;
        }
 
        /* Ensure we don't depend on user's PATH. */
-       p = talloc_asprintf(ctx, "./%s", fsp->fsp_name);
+       p = talloc_asprintf(ctx, "./%s", fname);
        if (!p) {
-               TALLOC_FREE(ctx);
-               return NT_STATUS_NO_MEMORY;
+               status = NT_STATUS_NO_MEMORY;
+               goto out;
        }
 
-       if (chmod(fsp->fsp_name,0755) == -1) {
-               TALLOC_FREE(ctx);
-               return map_nt_error_from_unix(errno);
+       if (chmod(fname, 0755) == -1) {
+               status = map_nt_error_from_unix(errno);
+               goto out;
        }
        ret = smbrun(p,&tmp_fd);
        DEBUG(3,("Invoking magic command %s gave %d\n",
                p,ret));
 
-       unlink(fsp->fsp_name);
+       unlink(fname);
        if (ret != 0 || tmp_fd == -1) {
                if (tmp_fd != -1) {
                        close(tmp_fd);
                }
-               TALLOC_FREE(ctx);
-               return NT_STATUS_UNSUCCESSFUL;
+               status = NT_STATUS_UNSUCCESSFUL;
+               goto out;
        }
        outfd = open(magic_output, O_CREAT|O_EXCL|O_RDWR, 0600);
        if (outfd == -1) {
                int err = errno;
                close(tmp_fd);
-               TALLOC_FREE(ctx);
-               return map_nt_error_from_unix(err);
+               status = map_nt_error_from_unix(err);
+               goto out;
        }
 
        if (sys_fstat(tmp_fd,&st) == -1) {
                int err = errno;
                close(tmp_fd);
                close(outfd);
-               TALLOC_FREE(ctx);
-               return map_nt_error_from_unix(err);
+               status = map_nt_error_from_unix(err);
+               goto out;
        }
 
        if (transfer_file(tmp_fd,outfd,(SMB_OFF_T)st.st_ex_size) == (SMB_OFF_T)-1) {
                int err = errno;
                close(tmp_fd);
                close(outfd);
-               TALLOC_FREE(ctx);
-               return map_nt_error_from_unix(err);
+               status = map_nt_error_from_unix(err);
+               goto out;
        }
        close(tmp_fd);
        if (close(outfd) == -1) {
-               TALLOC_FREE(ctx);
-               return map_nt_error_from_unix(errno);
+               status = map_nt_error_from_unix(errno);
+               goto out;
        }
+
+       status = NT_STATUS_OK;
+
+ out:
        TALLOC_FREE(ctx);
-       return NT_STATUS_OK;
+       return status;
 }
 
 /****************************************************************************
@@ -261,18 +273,10 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp,
        bool delete_file = false;
        bool changed_user = false;
        struct share_mode_lock *lck = NULL;
-       struct smb_filename *smb_fname = NULL;
-       char *fname = NULL;
        NTSTATUS status = NT_STATUS_OK;
        int ret;
        struct file_id id;
 
-       status = create_synthetic_smb_fname_split(talloc_tos(), fsp->fsp_name,
-                                                 NULL, &smb_fname);
-       if (!NT_STATUS_IS_OK(status)) {
-               goto done;
-       }
-
        /*
         * Lock the share entries, and determine if we should delete
         * on close. If so delete whilst the lock is still in effect.
@@ -284,7 +288,7 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp,
 
        if (lck == NULL) {
                DEBUG(0, ("close_remove_share_mode: Could not get share mode "
-                         "lock for file %s\n", smb_fname_str_dbg(smb_fname)));
+                         "lock for file %s\n", fsp_str_dbg(fsp)));
                status = NT_STATUS_INVALID_PARAMETER;
                goto done;
        }
@@ -296,7 +300,7 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp,
        if (!del_share_mode(lck, fsp)) {
                DEBUG(0, ("close_remove_share_mode: Could not delete share "
                          "entry for file %s\n",
-                         smb_fname_str_dbg(smb_fname)));
+                         fsp_str_dbg(fsp)));
        }
 
        if (fsp->initial_delete_on_close && (lck->delete_token == NULL)) {
@@ -354,7 +358,7 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp,
         */
 
        DEBUG(5,("close_remove_share_mode: file %s. Delete on close was set "
-                "- deleting file.\n", smb_fname_str_dbg(smb_fname)));
+                "- deleting file.\n", fsp_str_dbg(fsp)));
 
        /*
         * Don't try to update the write time when we delete the file
@@ -366,7 +370,7 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp,
 
                DEBUG(5,("close_remove_share_mode: file %s. "
                        "Change user to uid %u\n",
-                       smb_fname_str_dbg(smb_fname),
+                       fsp_str_dbg(fsp),
                        (unsigned int)lck->delete_token->uid));
 
                if (!push_sec_ctx()) {
@@ -387,30 +391,30 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp,
           hasn't been renamed. */
 
        if (fsp->posix_open) {
-               ret = SMB_VFS_LSTAT(conn, smb_fname);
+               ret = SMB_VFS_LSTAT(conn, fsp->fsp_name);
        } else {
-               ret = SMB_VFS_STAT(conn, smb_fname);
+               ret = SMB_VFS_STAT(conn, fsp->fsp_name);
        }
 
        if (ret != 0) {
                DEBUG(5,("close_remove_share_mode: file %s. Delete on close "
                         "was set and stat failed with error %s\n",
-                        smb_fname_str_dbg(smb_fname), strerror(errno)));
+                        fsp_str_dbg(fsp), strerror(errno)));
                /*
                 * Don't save the errno here, we ignore this error
                 */
                goto done;
        }
 
-       id = vfs_file_id_from_sbuf(conn, &smb_fname->st);
+       id = vfs_file_id_from_sbuf(conn, &fsp->fsp_name->st);
 
        if (!file_id_equal(&fsp->file_id, &id)) {
                DEBUG(5,("close_remove_share_mode: file %s. Delete on close "
                         "was set and dev and/or inode does not match\n",
-                        smb_fname_str_dbg(smb_fname)));
+                        fsp_str_dbg(fsp)));
                DEBUG(5,("close_remove_share_mode: file %s. stored file_id %s, "
                         "stat file_id %s\n",
-                        smb_fname_str_dbg(smb_fname),
+                        fsp_str_dbg(fsp),
                         file_id_string_tos(&fsp->file_id),
                         file_id_string_tos(&id)));
                /*
@@ -420,9 +424,9 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp,
        }
 
        if ((conn->fs_capabilities & FILE_NAMED_STREAMS)
-           && !is_ntfs_stream_smb_fname(smb_fname)) {
+           && !is_ntfs_stream_smb_fname(fsp->fsp_name)) {
 
-               status = delete_all_streams(conn, smb_fname->base_name);
+               status = delete_all_streams(conn, fsp->fsp_name->base_name);
 
                if (!NT_STATUS_IS_OK(status)) {
                        DEBUG(5, ("delete_all_streams failed: %s\n",
@@ -432,7 +436,7 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp,
        }
 
 
-       if (SMB_VFS_UNLINK(conn, smb_fname) != 0) {
+       if (SMB_VFS_UNLINK(conn, fsp->fsp_name) != 0) {
                /*
                 * This call can potentially fail as another smbd may
                 * have had the file open with delete on close set and
@@ -443,21 +447,14 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp,
 
                DEBUG(5,("close_remove_share_mode: file %s. Delete on close "
                         "was set and unlink failed with error %s\n",
-                        smb_fname_str_dbg(smb_fname), strerror(errno)));
+                        fsp_str_dbg(fsp), strerror(errno)));
 
                status = map_nt_error_from_unix(errno);
        }
 
-       status = get_full_smb_filename(talloc_tos(), smb_fname, &fname);
-       if (!NT_STATUS_IS_OK(status)) {
-               goto done;
-       }
-
        notify_fname(conn, NOTIFY_ACTION_REMOVED,
                     FILE_NOTIFY_CHANGE_FILE_NAME,
-                    fname);
-
-       TALLOC_FREE(fname);
+                    fsp->fsp_name->base_name);
 
        /* As we now have POSIX opens which can unlink
         * with other open files we may have taken
@@ -476,7 +473,6 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp,
        }
 
        TALLOC_FREE(lck);
-       TALLOC_FREE(smb_fname);
        return status;
 }
 
@@ -499,7 +495,6 @@ void set_close_write_time(struct files_struct *fsp, struct timespec ts)
 
 static NTSTATUS update_write_time_on_close(struct files_struct *fsp)
 {
-       struct smb_filename *smb_fname = NULL;
        struct smb_file_time ft;
        NTSTATUS status;
        int ret = -1;
@@ -514,43 +509,32 @@ static NTSTATUS update_write_time_on_close(struct files_struct *fsp)
                fsp->close_write_time = timespec_current();
        }
 
-       /* XXX: Remove when fsp->fsp_name is converted to smb_filename. */
-       status = create_synthetic_smb_fname_split(talloc_tos(), fsp->fsp_name,
-                                                 NULL, &smb_fname);
-       if (!NT_STATUS_IS_OK(status)) {
-               goto out;
-       }
-
        /* Ensure we have a valid stat struct for the source. */
        if (fsp->fh->fd != -1) {
-               ret = SMB_VFS_FSTAT(fsp, &smb_fname->st);
+               ret = SMB_VFS_FSTAT(fsp, &fsp->fsp_name->st);
        } else {
                if (fsp->posix_open) {
-                       ret = SMB_VFS_LSTAT(fsp->conn, smb_fname);
+                       ret = SMB_VFS_LSTAT(fsp->conn, fsp->fsp_name);
                } else {
-                       ret = SMB_VFS_STAT(fsp->conn, smb_fname);
+                       ret = SMB_VFS_STAT(fsp->conn, fsp->fsp_name);
                }
        }
 
        if (ret == -1) {
-               status = map_nt_error_from_unix(errno);
-               goto out;
+               return map_nt_error_from_unix(errno);
        }
 
-       if (!VALID_STAT(smb_fname->st)) {
+       if (!VALID_STAT(fsp->fsp_name->st)) {
                /* if it doesn't seem to be a real file */
-               status = NT_STATUS_OK;
-               goto out;
+               return NT_STATUS_OK;
        }
 
        ft.mtime = fsp->close_write_time;
-       status = smb_set_file_time(fsp->conn, fsp, smb_fname, &ft, true);
+       status = smb_set_file_time(fsp->conn, fsp, fsp->fsp_name, &ft, true);
        if (!NT_STATUS_IS_OK(status)) {
-               goto out;
+               return status;
        }
 
- out:
-       TALLOC_FREE(smb_fname);
        return status;
 }
 
@@ -647,7 +631,7 @@ static NTSTATUS close_normal_file(struct smb_request *req, files_struct *fsp,
        status = ntstatus_keeperror(status, tmp);
 
        DEBUG(2,("%s closed file %s (numopen=%d) %s\n",
-               conn->server_info->unix_name,fsp->fsp_name,
+               conn->server_info->unix_name, fsp_str_dbg(fsp),
                conn->num_files_open - 1,
                nt_errstr(status) ));
 
@@ -663,16 +647,9 @@ static NTSTATUS close_directory(struct smb_request *req, files_struct *fsp,
                                enum file_close_type close_type)
 {
        struct share_mode_lock *lck = NULL;
-       struct smb_filename *smb_dname = NULL;
        bool delete_dir = False;
        NTSTATUS status = NT_STATUS_OK;
 
-       status = create_synthetic_smb_fname_split(talloc_tos(), fsp->fsp_name,
-                                                 NULL, &smb_dname);
-       if (!NT_STATUS_IS_OK(status)) {
-               goto out;
-       }
-
        /*
         * NT can set delete_on_close of the last open
         * reference to a directory also.
@@ -683,14 +660,14 @@ static NTSTATUS close_directory(struct smb_request *req, files_struct *fsp,
 
        if (lck == NULL) {
                DEBUG(0, ("close_directory: Could not get share mode lock for "
-                         "%s\n", smb_fname_str_dbg(smb_dname)));
+                         "%s\n", fsp_str_dbg(fsp)));
                status = NT_STATUS_INVALID_PARAMETER;
                goto out;
        }
 
        if (!del_share_mode(lck, fsp)) {
                DEBUG(0, ("close_directory: Could not delete share entry for "
-                         "%s\n", smb_fname_str_dbg(smb_dname)));
+                         "%s\n", fsp_str_dbg(fsp)));
        }
 
        if (fsp->initial_delete_on_close) {
@@ -704,7 +681,7 @@ static NTSTATUS close_directory(struct smb_request *req, files_struct *fsp,
                        become_user(fsp->conn, fsp->vuid);
                        became_user = True;
                }
-               send_stat_cache_delete_message(fsp->fsp_name);
+               send_stat_cache_delete_message(fsp->fsp_name->base_name);
                set_delete_on_close_lck(lck, True, &current_user.ut);
                if (became_user) {
                        unbecome_user();
@@ -747,11 +724,12 @@ static NTSTATUS close_directory(struct smb_request *req, files_struct *fsp,
 
                TALLOC_FREE(lck);
 
-               status = rmdir_internals(talloc_tos(), fsp->conn, smb_dname);
+               status = rmdir_internals(talloc_tos(), fsp->conn,
+                                        fsp->fsp_name);
 
                DEBUG(5,("close_directory: %s. Delete on close was set - "
                         "deleting directory returned %s.\n",
-                        smb_fname_str_dbg(smb_dname), nt_errstr(status)));
+                        fsp_str_dbg(fsp), nt_errstr(status)));
 
                /* unbecome user. */
                pop_sec_ctx();
@@ -774,7 +752,7 @@ static NTSTATUS close_directory(struct smb_request *req, files_struct *fsp,
 
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(0, ("Could not close dir! fname=%s, fd=%d, err=%d=%s\n",
-                         smb_fname_str_dbg(smb_dname), fsp->fh->fd, errno,
+                         fsp_str_dbg(fsp), fsp->fh->fd, errno,
                          strerror(errno)));
        }
 
@@ -786,7 +764,6 @@ static NTSTATUS close_directory(struct smb_request *req, files_struct *fsp,
 
  out:
        TALLOC_FREE(lck);
-       TALLOC_FREE(smb_dname);
        return status;
 }
 
index d3df80ad9177c1a485673768a4caae936827edad..bd0c7df95974a3cc0427276d160fde063074aae5 100644 (file)
@@ -845,7 +845,7 @@ bool update_write_time(struct files_struct *fsp)
        }
 
        notify_fname(fsp->conn, NOTIFY_ACTION_MODIFIED,
-                       FILE_NOTIFY_CHANGE_LAST_WRITE, fsp->fsp_name);
+                    FILE_NOTIFY_CHANGE_LAST_WRITE, fsp->fsp_name->base_name);
 
        return true;
 }
index 60cef09b3baec87f691add07bc1f54749876a8cf..bd609d3e867798e42163e8d0136f9756b9356cdb 100644 (file)
@@ -103,7 +103,7 @@ tryagain:
        }
 
        DEBUG(10,("read_file (%s): pos = %.0f, size = %lu, returned %lu\n",
-               fsp->fsp_name, (double)pos, (unsigned long)n, (long)ret ));
+                 fsp_str_dbg(fsp), (double)pos, (unsigned long)n, (long)ret));
 
        fsp->fh->pos += ret;
        fsp->fh->position_information = fsp->fh->pos;
@@ -136,7 +136,7 @@ static ssize_t real_write_file(struct smb_request *req,
        }
 
        DEBUG(10,("real_write_file (%s): pos = %.0f, size = %lu, returned %ld\n",
-               fsp->fsp_name, (double)pos, (unsigned long)n, (long)ret ));
+                 fsp_str_dbg(fsp), (double)pos, (unsigned long)n, (long)ret));
 
        if (ret != -1) {
                fsp->fh->pos += ret;
@@ -164,8 +164,9 @@ static int wcp_file_size_change(files_struct *fsp)
        wcp->file_size = wcp->offset + wcp->data_size;
        ret = SMB_VFS_FTRUNCATE(fsp, wcp->file_size);
        if (ret == -1) {
-               DEBUG(0,("wcp_file_size_change (%s): ftruncate of size %.0f error %s\n",
-                       fsp->fsp_name, (double)wcp->file_size, strerror(errno) ));
+               DEBUG(0,("wcp_file_size_change (%s): ftruncate of size %.0f "
+                        "error %s\n", fsp_str_dbg(fsp),
+                        (double)wcp->file_size, strerror(errno)));
        }
        return ret;
 }
@@ -179,7 +180,7 @@ static void update_write_time_handler(struct event_context *ctx,
 
        /* Remove the timed event handler. */
        TALLOC_FREE(fsp->update_write_time_event);
-       DEBUG(5, ("Update write time on %s\n", fsp->fsp_name));
+       DEBUG(5, ("Update write time on %s\n", fsp_str_dbg(fsp)));
 
        /* change the write time if not already changed by someone else */
        update_write_time(fsp);
@@ -244,7 +245,8 @@ void trigger_write_time_update_immediate(struct files_struct *fsp)
         }
 
        TALLOC_FREE(fsp->update_write_time_event);
-       DEBUG(5, ("Update write time immediate on %s\n", fsp->fsp_name));
+       DEBUG(5, ("Update write time immediate on %s\n",
+                 fsp_str_dbg(fsp)));
 
        fsp->update_write_time_triggered = true;
 
@@ -285,28 +287,17 @@ ssize_t write_file(struct smb_request *req,
        }
 
        if (!fsp->modified) {
-               struct smb_filename *smb_fname = NULL;
-               NTSTATUS status;
-
                fsp->modified = True;
 
-               status = create_synthetic_smb_fname_split(talloc_tos(),
-                                                         fsp->fsp_name, NULL,
-                                                         &smb_fname);
-               if (!NT_STATUS_IS_OK(status)) {
-                       errno = map_errno_from_nt_status(status);
-                       return -1;
-               }
-
-               if (SMB_VFS_FSTAT(fsp, &smb_fname->st) == 0) {
+               if (SMB_VFS_FSTAT(fsp, &fsp->fsp_name->st) == 0) {
                        int dosmode;
                        trigger_write_time_update(fsp);
-                       dosmode = dos_mode(fsp->conn, smb_fname);
+                       dosmode = dos_mode(fsp->conn, fsp->fsp_name);
                        if ((lp_store_dos_attributes(SNUM(fsp->conn)) ||
                                        MAP_ARCHIVE(fsp->conn)) &&
                                        !IS_DOS_ARCHIVE(dosmode)) {
-                               file_set_dosmode(fsp->conn, smb_fname,
-                                               dosmode | aARCH, NULL, false);
+                               file_set_dosmode(fsp->conn, fsp->fsp_name,
+                                                dosmode | aARCH, NULL, false);
                        }
 
                        /*
@@ -316,11 +307,10 @@ ssize_t write_file(struct smb_request *req,
 
                        if (EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type) && !wcp) {
                                setup_write_cache(fsp,
-                                                 smb_fname->st.st_ex_size);
+                                                fsp->fsp_name->st.st_ex_size);
                                wcp = fsp->wcp;
                        }
                }
-               TALLOC_FREE(smb_fname);
        }
 
 #ifdef WITH_PROFILE
@@ -382,8 +372,10 @@ nonop=%u allocated=%u active=%u direct=%u perfect=%u readhits=%u\n",
                return total_written;
        }
 
-       DEBUG(9,("write_file (%s)(fd=%d pos=%.0f size=%u) wcp->offset=%.0f wcp->data_size=%u\n",
-               fsp->fsp_name, fsp->fh->fd, (double)pos, (unsigned int)n, (double)wcp->offset, (unsigned int)wcp->data_size));
+       DEBUG(9,("write_file (%s)(fd=%d pos=%.0f size=%u) wcp->offset=%.0f "
+                "wcp->data_size=%u\n", fsp_str_dbg(fsp), fsp->fh->fd,
+                (double)pos, (unsigned int)n, (double)wcp->offset,
+                (unsigned int)wcp->data_size));
 
        fsp->fh->pos = pos + n;
 
@@ -828,7 +820,8 @@ void delete_write_cache(files_struct *fsp)
        SAFE_FREE(wcp->data);
        SAFE_FREE(fsp->wcp);
 
-       DEBUG(10,("delete_write_cache: File %s deleted write cache\n", fsp->fsp_name ));
+       DEBUG(10,("delete_write_cache: File %s deleted write cache\n",
+                 fsp_str_dbg(fsp)));
 }
 
 /****************************************************************************
@@ -871,7 +864,7 @@ static bool setup_write_cache(files_struct *fsp, SMB_OFF_T file_size)
        allocated_write_caches++;
 
        DEBUG(10,("setup_write_cache: File %s allocated write cache size %lu\n",
-               fsp->fsp_name, (unsigned long)wcp->alloc_size ));
+                 fsp_str_dbg(fsp), (unsigned long)wcp->alloc_size));
 
        return True;
 }
@@ -888,7 +881,7 @@ void set_filelen_write_cache(files_struct *fsp, SMB_OFF_T file_size)
                        char *msg;
                        if (asprintf(&msg, "set_filelen_write_cache: size change "
                                 "on file %s with write cache size = %lu\n",
-                                fsp->fsp_name,
+                                fsp->fsp_name->base_name,
                                 (unsigned long)fsp->wcp->data_size) != -1) {
                                smb_panic(msg);
                        } else {
@@ -970,7 +963,13 @@ NTSTATUS sync_file(connection_struct *conn, files_struct *fsp, bool write_throug
 int fsp_stat(files_struct *fsp, SMB_STRUCT_STAT *pst)
 {
        if (fsp->fh->fd == -1) {
-               return vfs_stat_smb_fname(fsp->conn, fsp->fsp_name, pst);
+               int ret;
+
+               ret = SMB_VFS_STAT(fsp->conn, fsp->fsp_name);
+               if (ret != -1) {
+                       *pst = fsp->fsp_name->st;
+               }
+               return ret;
        } else {
                return SMB_VFS_FSTAT(fsp, pst);
        }
index 48d2288468d93f301f44a3a9a242e16aa6adba01..8bd914bf0df4b0bd9a8e7bfdff06565fef3657ce 100644 (file)
@@ -44,6 +44,7 @@ NTSTATUS file_new(struct smb_request *req, connection_struct *conn,
 {
        int i;
        files_struct *fsp;
+       NTSTATUS status;
 
        /* we want to give out file handles differently on each new
           connection because of a common bug in MS clients where they try to
@@ -100,8 +101,18 @@ NTSTATUS file_new(struct smb_request *req, connection_struct *conn,
        fsp->fnum = i + FILE_HANDLE_OFFSET;
        SMB_ASSERT(fsp->fnum < 65536);
 
-       string_set(&fsp->fsp_name,"");
-       
+       /*
+        * Create an smb_filename with "" for the base_name.  There are very
+        * few NULL checks, so make sure it's initialized with something. to
+        * be safe until an audit can be done.
+        */
+       status = create_synthetic_smb_fname(fsp, "", NULL, NULL,
+                                           &fsp->fsp_name);
+       if (!NT_STATUS_IS_OK(status)) {
+               TALLOC_FREE(fsp);
+               TALLOC_FREE(fsp->fh);
+       }
+
        DLIST_ADD(Files, fsp);
 
        DEBUG(5,("allocated file structure %d, fnum = %d (%d used)\n",
@@ -241,8 +252,9 @@ void file_dump_open_table(void)
        files_struct *fsp;
 
        for (fsp=Files;fsp;fsp=fsp->next,count++) {
-               DEBUG(10,("Files[%d], fnum = %d, name %s, fd = %d, gen = %lu, fileid=%s\n",
-                       count, fsp->fnum, fsp->fsp_name, fsp->fh->fd, (unsigned long)fsp->fh->gen_id,
+               DEBUG(10,("Files[%d], fnum = %d, name %s, fd = %d, gen = %lu, "
+                         "fileid=%s\n", count, fsp->fnum, fsp_str_dbg(fsp),
+                         fsp->fh->fd, (unsigned long)fsp->fh->gen_id,
                          file_id_string_tos(&fsp->file_id)));
        }
 }
@@ -288,8 +300,10 @@ files_struct *file_find_dif(struct file_id id, unsigned long gen_id)
                        if ((fsp->fh->fd == -1) &&
                            (fsp->oplock_type != NO_OPLOCK) &&
                            (fsp->oplock_type != FAKE_LEVEL_II_OPLOCK)) {
-                               DEBUG(0,("file_find_dif: file %s file_id = %s, gen = %u \
-oplock_type = %u is a stat open with oplock type !\n", fsp->fsp_name, 
+                               DEBUG(0,("file_find_dif: file %s file_id = "
+                                        "%s, gen = %u oplock_type = %u is a "
+                                        "stat open with oplock type !\n",
+                                        fsp_str_dbg(fsp),
                                         file_id_string_tos(&fsp->file_id),
                                         (unsigned int)fsp->fh->gen_id,
                                         (unsigned int)fsp->oplock_type ));
@@ -390,10 +404,11 @@ bool file_find_subpath(files_struct *dir_fsp)
 {
        files_struct *fsp;
        size_t dlen;
-       char *d_fullname = talloc_asprintf(talloc_tos(),
-                                       "%s/%s",
-                                       dir_fsp->conn->connectpath,
-                                       dir_fsp->fsp_name);
+       char *d_fullname;
+
+       d_fullname = talloc_asprintf(talloc_tos(), "%s/%s",
+                                    dir_fsp->conn->connectpath,
+                                    dir_fsp->fsp_name->base_name);
 
        if (!d_fullname) {
                return false;
@@ -411,7 +426,7 @@ bool file_find_subpath(files_struct *dir_fsp)
                d1_fullname = talloc_asprintf(talloc_tos(),
                                        "%s/%s",
                                        fsp->conn->connectpath,
-                                       fsp->fsp_name);
+                                       fsp->fsp_name->base_name);
 
                if (strnequal(d_fullname, d1_fullname, dlen)) {
                        TALLOC_FREE(d_fullname);
@@ -449,8 +464,6 @@ void file_free(struct smb_request *req, files_struct *fsp)
 {
        DLIST_REMOVE(Files, fsp);
 
-       string_free(&fsp->fsp_name);
-
        TALLOC_FREE(fsp->fake_file_handle);
 
        if (fsp->fh->ref_count == 1) {
@@ -500,6 +513,7 @@ void file_free(struct smb_request *req, files_struct *fsp)
           information */
        ZERO_STRUCTP(fsp);
 
+       /* fsp->fsp_name is a talloc child and is free'd automatically. */
        TALLOC_FREE(fsp);
 }
 
@@ -546,7 +560,7 @@ files_struct *file_fsp(struct smb_request *req, uint16 fid)
  Duplicate the file handle part for a DOS or FCB open.
 ****************************************************************************/
 
-void dup_file_fsp(struct smb_request *req, files_struct *from,
+NTSTATUS dup_file_fsp(struct smb_request *req, files_struct *from,
                      uint32 access_mask, uint32 share_access,
                      uint32 create_options, files_struct *to)
 {
@@ -575,5 +589,34 @@ void dup_file_fsp(struct smb_request *req, files_struct *from,
        to->modified = from->modified;
        to->is_directory = from->is_directory;
        to->aio_write_behind = from->aio_write_behind;
-        string_set(&to->fsp_name,from->fsp_name);
+       return fsp_set_smb_fname(to, from->fsp_name);
+}
+
+/**
+ * Return a debug string using the debug_ctx().  This can only be called from
+ * DEBUG() macros due to the debut_ctx().
+ */
+const char *fsp_str_dbg(const struct files_struct *fsp)
+{
+       return smb_fname_str_dbg(fsp->fsp_name);
+}
+
+/**
+ * The only way that the fsp->fsp_name field should ever be set.
+ */
+NTSTATUS fsp_set_smb_fname(struct files_struct *fsp,
+                          const struct smb_filename *smb_fname_in)
+{
+       NTSTATUS status;
+       struct smb_filename *smb_fname_new;
+
+       status = copy_smb_filename(fsp, smb_fname_in, &smb_fname_new);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
+
+       TALLOC_FREE(fsp->fsp_name);
+       fsp->fsp_name = smb_fname_new;
+
+       return NT_STATUS_OK;
 }
index 1067dab074877cbc680948f1a0ac2bcbbbbf1608..96a411dd704d8bd042c07392e8b1605d15b59184 100644 (file)
@@ -454,7 +454,7 @@ static void api_fd_reply(connection_struct *conn, uint16 vuid,
        }
 
        DEBUG(3,("Got API command 0x%x on pipe \"%s\" (pnum %x)\n",
-                subcommand, fsp->fsp_name, pnum));
+                subcommand, fsp_str_dbg(fsp), pnum));
 
        DEBUG(10, ("api_fd_reply: p:%p max_trans_reply: %d\n", fsp, mdrcnt));
 
index ded888c021bd55903788ddee781c7dc910ec4658..8f37923865bedfaa444490203bfa7b171ae2e57c 100644 (file)
@@ -182,7 +182,7 @@ void change_notify_reply(connection_struct *conn,
 static void notify_callback(void *private_data, const struct notify_event *e)
 {
        files_struct *fsp = (files_struct *)private_data;
-       DEBUG(10, ("notify_callback called for %s\n", fsp->fsp_name));
+       DEBUG(10, ("notify_callback called for %s\n", fsp_str_dbg(fsp)));
        notify_fsp(fsp, e->action, e->path);
 }
 
@@ -200,8 +200,9 @@ NTSTATUS change_notify_create(struct files_struct *fsp, uint32 filter,
                return NT_STATUS_NO_MEMORY;
        }
 
+       /* Do notify operations on the base_name. */
        if (asprintf(&fullpath, "%s/%s", fsp->conn->connectpath,
-                    fsp->fsp_name) == -1) {
+                    fsp->fsp_name->base_name) == -1) {
                DEBUG(0, ("asprintf failed\n"));
                TALLOC_FREE(fsp->notify);
                return NT_STATUS_NO_MEMORY;
@@ -236,7 +237,7 @@ NTSTATUS change_notify_add_request(struct smb_request *req,
        struct smbd_server_connection *sconn = smbd_server_conn;
 
        DEBUG(10, ("change_notify_add_request: Adding request for %s: "
-                  "max_param = %d\n", fsp->fsp_name, (int)max_param));
+                  "max_param = %d\n", fsp_str_dbg(fsp), (int)max_param));
 
        if (!(request = talloc(NULL, struct notify_change_request))
            || !(map = talloc(request, struct notify_mid_map))) {
index b65af26ecaf570cf6f1efcaf70eaeab92667a2d1..ff76b7a21f46af121278908a99888b30cb9903eb 100644 (file)
@@ -794,7 +794,7 @@ static NTSTATUS set_sd(files_struct *fsp, uint8 *data, uint32 sd_len,
        security_acl_map_generic(psd->sacl, &file_generic_mapping);
 
        if (DEBUGLEVEL >= 10) {
-               DEBUG(10,("set_sd for file %s\n", fsp->fsp_name ));
+               DEBUG(10,("set_sd for file %s\n", fsp_str_dbg(fsp)));
                NDR_PRINT_DEBUG(security_descriptor, psd);
        }
 
@@ -1523,7 +1523,7 @@ static void call_nt_transact_notify_change(connection_struct *conn,
 
                DEBUG(3,("call_nt_transact_notify_change: notify change "
                         "called on %s, filter = %s, recursive = %d\n",
-                        fsp->fsp_name, filter_string, recursive));
+                        fsp_str_dbg(fsp), filter_string, recursive));
 
                TALLOC_FREE(filter_string);
        }
@@ -1626,7 +1626,7 @@ static void call_nt_transact_rename(connection_struct *conn,
        send_nt_replies(conn, req, NT_STATUS_OK, NULL, 0, NULL, 0);
 
        DEBUG(3,("nt transact rename from = %s, to = %s ignored!\n",
-                fsp->fsp_name, new_name));
+                fsp_str_dbg(fsp), new_name));
 
        return;
 }
@@ -1684,8 +1684,9 @@ static void call_nt_transact_query_security_desc(connection_struct *conn,
 
        security_info_wanted = IVAL(params,4);
 
-       DEBUG(3,("call_nt_transact_query_security_desc: file = %s, info_wanted = 0x%x\n", fsp->fsp_name,
-                       (unsigned int)security_info_wanted ));
+       DEBUG(3,("call_nt_transact_query_security_desc: file = %s, "
+                "info_wanted = 0x%x\n", fsp_str_dbg(fsp),
+                (unsigned int)security_info_wanted));
 
        params = nttrans_realloc(ppparams, 4);
        if(params == NULL) {
@@ -1722,7 +1723,8 @@ static void call_nt_transact_query_security_desc(connection_struct *conn,
        DEBUG(3,("call_nt_transact_query_security_desc: sd_size = %lu.\n",(unsigned long)sd_size));
 
        if (DEBUGLEVEL >= 10) {
-               DEBUG(10,("call_nt_transact_query_security_desc for file %s\n", fsp->fsp_name));
+               DEBUG(10,("call_nt_transact_query_security_desc for file %s\n",
+                         fsp_str_dbg(fsp)));
                NDR_PRINT_DEBUG(security_descriptor, psd);
        }
 
@@ -1796,8 +1798,8 @@ static void call_nt_transact_set_security_desc(connection_struct *conn,
 
        security_info_sent = IVAL(params,4);
 
-       DEBUG(3,("call_nt_transact_set_security_desc: file = %s, sent 0x%x\n", fsp->fsp_name,
-               (unsigned int)security_info_sent ));
+       DEBUG(3,("call_nt_transact_set_security_desc: file = %s, sent 0x%x\n",
+                fsp_str_dbg(fsp), (unsigned int)security_info_sent));
 
        if (data_count == 0) {
                reply_doserror(req, ERRDOS, ERRnoaccess);
@@ -2021,7 +2023,7 @@ static void call_nt_transact_ioctl(connection_struct *conn,
                cur_pdata+=12;
 
                DEBUG(10,("FSCTL_GET_SHADOW_COPY_DATA: %u volumes for path[%s].\n",
-                       shadow_data->num_volumes,fsp->fsp_name));
+                         shadow_data->num_volumes, fsp_str_dbg(fsp)));
                if (labels && shadow_data->labels) {
                        for (i=0;i<shadow_data->num_volumes;i++) {
                                srvstr_push(pdata, req->flags2,
index 404461fb5edab8c99e8989a1a6b7436e8f510738..33763d202de8322e3ba2200a454a9ea058dec260 100644 (file)
@@ -219,13 +219,13 @@ void change_file_owner_to_parent(connection_struct *conn,
        if (ret == -1) {
                DEBUG(0,("change_file_owner_to_parent: failed to fchown "
                         "file %s to parent directory uid %u. Error "
-                        "was %s\n", fsp->fsp_name,
+                        "was %s\n", fsp_str_dbg(fsp),
                         (unsigned int)smb_fname_parent->st.st_ex_uid,
                         strerror(errno) ));
        }
 
        DEBUG(10,("change_file_owner_to_parent: changed new file %s to "
-                 "parent directory uid %u.\n", fsp->fsp_name,
+                 "parent directory uid %u.\n", fsp_str_dbg(fsp),
                  (unsigned int)smb_fname_parent->st.st_ex_uid));
 
        TALLOC_FREE(smb_fname_parent);
@@ -350,7 +350,6 @@ static NTSTATUS open_file(files_struct *fsp,
                          uint32 access_mask, /* client requested access mask. */
                          uint32 open_access_mask) /* what we're actually using in the open. */
 {
-       char *path = NULL;
        NTSTATUS status = NT_STATUS_OK;
        int accmode = (flags & O_ACCMODE);
        int local_flags = flags;
@@ -435,7 +434,7 @@ static NTSTATUS open_file(files_struct *fsp,
                         * wildcard characters are allowed in stream names
                         * only test the basefilename
                         */
-                       wild = fsp->base_fsp->fsp_name;
+                       wild = fsp->base_fsp->fsp_name->base_name;
                } else {
                        wild = smb_fname->base_name;
                }
@@ -615,16 +614,13 @@ static NTSTATUS open_file(files_struct *fsp,
                       conn->case_sensitive)) {
                fsp->aio_write_behind = True;
        }
-
-       status = get_full_smb_filename(talloc_tos(), smb_fname,
-                                      &path);
+       status = fsp_set_smb_fname(fsp, smb_fname);
        if (!NT_STATUS_IS_OK(status)) {
+               fd_close(fsp);
+               errno = map_errno_from_nt_status(status);
                return status;
        }
 
-       string_set(&fsp->fsp_name, path);
-       TALLOC_FREE(path);
-
        fsp->wcp = NULL; /* Write cache pointer. */
 
        DEBUG(2,("%s opened file %s read=%s write=%s (numopen=%d)\n",
@@ -796,7 +792,8 @@ static void validate_my_share_entries(int num,
                str = talloc_asprintf(talloc_tos(),
                        "validate_my_share_entries: "
                        "file %s, oplock_type = 0x%x, op_type = 0x%x\n",
-                        fsp->fsp_name, (unsigned int)fsp->oplock_type,
+                        fsp->fsp_name->base_name,
+                        (unsigned int)fsp->oplock_type,
                         (unsigned int)share_entry->op_type );
                smb_panic(str);
        }
@@ -1030,7 +1027,7 @@ static bool delay_for_oplocks(struct share_mode_lock *lck,
        }
 
        DEBUG(10,("delay_for_oplocks: oplock type 0x%x on file %s\n",
-               fsp->oplock_type, fsp->fsp_name));
+                 fsp->oplock_type, fsp_str_dbg(fsp)));
 
        /* No delay. */
        return false;
@@ -1153,13 +1150,6 @@ NTSTATUS fcb_or_dos_open(struct smb_request *req,
                                     uint32 create_options)
 {
        files_struct *fsp;
-       char *fname = NULL;
-       NTSTATUS status;
-
-       status = get_full_smb_filename(talloc_tos(), smb_fname, &fname);
-       if (!NT_STATUS_IS_OK(status)) {
-               return status;
-       }
 
        DEBUG(5,("fcb_or_dos_open: attempting old open semantics for "
                 "file %s.\n", smb_fname_str_dbg(smb_fname)));
@@ -1169,7 +1159,7 @@ NTSTATUS fcb_or_dos_open(struct smb_request *req,
 
                DEBUG(10,("fcb_or_dos_open: checking file %s, fd = %d, "
                          "vuid = %u, file_pid = %u, private_options = 0x%x "
-                         "access_mask = 0x%x\n", fsp->fsp_name,
+                         "access_mask = 0x%x\n", fsp_str_dbg(fsp),
                          fsp->fh->fd, (unsigned int)fsp->vuid,
                          (unsigned int)fsp->file_pid,
                          (unsigned int)fsp->fh->private_options,
@@ -1181,7 +1171,9 @@ NTSTATUS fcb_or_dos_open(struct smb_request *req,
                    (fsp->fh->private_options & (NTCREATEX_OPTIONS_PRIVATE_DENY_DOS |
                                                 NTCREATEX_OPTIONS_PRIVATE_DENY_FCB)) &&
                    (fsp->access_mask & FILE_WRITE_DATA) &&
-                   strequal(fsp->fsp_name, fname)) {
+                   strequal(fsp->fsp_name->base_name, smb_fname->base_name) &&
+                   strequal(fsp->fsp_name->stream_name,
+                            smb_fname->stream_name)) {
                        DEBUG(10,("fcb_or_dos_open: file match\n"));
                        break;
                }
@@ -1199,10 +1191,8 @@ NTSTATUS fcb_or_dos_open(struct smb_request *req,
        }
 
        /* We need to duplicate this fsp. */
-       dup_file_fsp(req, fsp, access_mask, share_access,
-                       create_options, fsp_to_dup_into);
-
-       return NT_STATUS_OK;
+       return dup_file_fsp(req, fsp, access_mask, share_access,
+                           create_options, fsp_to_dup_into);
 }
 
 /****************************************************************************
@@ -2612,8 +2602,10 @@ static NTSTATUS open_directory(connection_struct *conn,
        fsp->sent_oplock_break = NO_BREAK_SENT;
        fsp->is_directory = True;
        fsp->posix_open = (file_attributes & FILE_FLAG_POSIX_SEMANTICS) ? True : False;
-
-       string_set(&fsp->fsp_name, smb_dname->base_name);
+       status = fsp_set_smb_fname(fsp, smb_dname);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
 
        mtimespec = smb_dname->st.st_ex_mtime;
 
@@ -2731,6 +2723,11 @@ void msg_file_was_renamed(struct messaging_context *msg,
        bn_len = strlen(base_name);
        stream_name = sharepath + sp_len + 1 + bn_len + 1;
 
+       /* stream_name must always be NULL if there is no stream. */
+       if (stream_name[0] == '\0') {
+               stream_name = NULL;
+       }
+
        status = create_synthetic_smb_fname(talloc_tos(), base_name,
                                            stream_name, NULL, &smb_fname);
        if (!NT_STATUS_IS_OK(status)) {
@@ -2744,18 +2741,14 @@ void msg_file_was_renamed(struct messaging_context *msg,
 
        for(fsp = file_find_di_first(id); fsp; fsp = file_find_di_next(fsp)) {
                if (memcmp(fsp->conn->connectpath, sharepath, sp_len) == 0) {
-                       char *newname = NULL;
 
                        DEBUG(10,("msg_file_was_renamed: renaming file fnum %d from %s -> %s\n",
-                               fsp->fnum, fsp->fsp_name,
+                               fsp->fnum, fsp_str_dbg(fsp),
                                smb_fname_str_dbg(smb_fname)));
-                       status = get_full_smb_filename(talloc_tos(),
-                                                      smb_fname, &newname);
+                       status = fsp_set_smb_fname(fsp, smb_fname);
                        if (!NT_STATUS_IS_OK(status)) {
                                goto out;
                        }
-                       string_set(&fsp->fsp_name, newname);
-                       TALLOC_FREE(newname);
                } else {
                        /* TODO. JRA. */
                        /* Now we have the complete path we can work out if this is
@@ -2766,7 +2759,7 @@ void msg_file_was_renamed(struct messaging_context *msg,
                                fsp->conn->connectpath,
                                sharepath,
                                fsp->fnum,
-                               fsp->fsp_name,
+                               fsp_str_dbg(fsp),
                                smb_fname_str_dbg(smb_fname)));
                }
         }
@@ -2927,7 +2920,7 @@ NTSTATUS open_streams_for_delete(connection_struct *conn,
                }
 
                DEBUG(10, ("Closing stream # %d, %s\n", i,
-                          streams[i]->fsp_name));
+                          fsp_str_dbg(streams[i])));
                close_file(NULL, streams[i], NORMAL_CLOSE);
        }
 
@@ -3327,6 +3320,11 @@ NTSTATUS get_relative_fid_filename(connection_struct *conn,
 
        dir_fsp = file_fsp(req, root_dir_fid);
 
+       if (is_ntfs_stream_smb_fname(dir_fsp->fsp_name)) {
+               status = NT_STATUS_INVALID_HANDLE;
+               goto out;
+       }
+
        if (dir_fsp == NULL) {
                status = NT_STATUS_INVALID_HANDLE;
                goto out;
@@ -3355,7 +3353,7 @@ NTSTATUS get_relative_fid_filename(connection_struct *conn,
                goto out;
        }
 
-       if (ISDOT(dir_fsp->fsp_name)) {
+       if (ISDOT(dir_fsp->fsp_name->base_name)) {
                /*
                 * We're at the toplevel dir, the final file name
                 * must not contain ./, as this is filtered out
@@ -3368,7 +3366,7 @@ NTSTATUS get_relative_fid_filename(connection_struct *conn,
                        goto out;
                }
        } else {
-               size_t dir_name_len = strlen(dir_fsp->fsp_name);
+               size_t dir_name_len = strlen(dir_fsp->fsp_name->base_name);
 
                /*
                 * Copy in the base directory name.
@@ -3380,7 +3378,7 @@ NTSTATUS get_relative_fid_filename(connection_struct *conn,
                        status = NT_STATUS_NO_MEMORY;
                        goto out;
                }
-               memcpy(parent_fname, dir_fsp->fsp_name,
+               memcpy(parent_fname, dir_fsp->fsp_name->base_name,
                    dir_name_len+1);
 
                /*
index e9b2a6cf95f14dd92c087a8c21b22351357fd4a3..dd8d5372fb4995de476627243a1fe15dbbb5f98c 100644 (file)
@@ -81,7 +81,7 @@ bool set_file_oplock(files_struct *fsp, int oplock_type)
 
        DEBUG(5,("set_file_oplock: granted oplock on file %s, %s/%lu, "
                    "tv_sec = %x, tv_usec = %x\n",
-                fsp->fsp_name, file_id_string_tos(&fsp->file_id),
+                fsp_str_dbg(fsp), file_id_string_tos(&fsp->file_id),
                 fsp->fh->gen_id, (int)fsp->open_time.tv_sec,
                 (int)fsp->open_time.tv_usec ));
 
@@ -158,14 +158,15 @@ bool remove_oplock(files_struct *fsp)
                                  NULL);
        if (lck == NULL) {
                DEBUG(0,("remove_oplock: failed to lock share entry for "
-                        "file %s\n", fsp->fsp_name ));
+                        "file %s\n", fsp_str_dbg(fsp)));
                return False;
        }
        ret = remove_share_oplock(lck, fsp);
        if (!ret) {
                DEBUG(0,("remove_oplock: failed to remove share oplock for "
                         "file %s fnum %d, %s\n",
-                        fsp->fsp_name, fsp->fnum, file_id_string_tos(&fsp->file_id)));
+                        fsp_str_dbg(fsp), fsp->fnum,
+                        file_id_string_tos(&fsp->file_id)));
        }
        release_file_oplock(fsp);
        TALLOC_FREE(lck);
@@ -184,14 +185,15 @@ bool downgrade_oplock(files_struct *fsp)
                                  NULL);
        if (lck == NULL) {
                DEBUG(0,("downgrade_oplock: failed to lock share entry for "
-                        "file %s\n", fsp->fsp_name ));
+                        "file %s\n", fsp_str_dbg(fsp)));
                return False;
        }
        ret = downgrade_share_oplock(lck, fsp);
        if (!ret) {
                DEBUG(0,("downgrade_oplock: failed to downgrade share oplock "
                         "for file %s fnum %d, file_id %s\n",
-                        fsp->fsp_name, fsp->fnum, file_id_string_tos(&fsp->file_id)));
+                        fsp_str_dbg(fsp), fsp->fnum,
+                        file_id_string_tos(&fsp->file_id)));
        }
 
        downgrade_file_oplock(fsp);
@@ -294,7 +296,8 @@ static files_struct *initial_break_processing(struct file_id id, unsigned long f
 
        if(fsp->oplock_type == NO_OPLOCK) {
                if( DEBUGLVL( 3 ) ) {
-                       dbgtext( "initial_break_processing: file %s ", fsp->fsp_name );
+                       dbgtext( "initial_break_processing: file %s ",
+                                fsp_str_dbg(fsp));
                        dbgtext( "(file_id = %s gen_id = %lu) has no oplock.\n",
                                 file_id_string_tos(&id), fsp->fh->gen_id );
                        dbgtext( "Allowing break to succeed regardless.\n" );
@@ -314,7 +317,8 @@ static void oplock_timeout_handler(struct event_context *ctx,
 
        /* Remove the timed event handler. */
        TALLOC_FREE(fsp->oplock_timeout);
-       DEBUG(0, ("Oplock break failed for file %s -- replying anyway\n", fsp->fsp_name));
+       DEBUG(0, ("Oplock break failed for file %s -- replying anyway\n",
+                 fsp_str_dbg(fsp)));
        global_client_failed_oplock_break = True;
        remove_oplock(fsp);
        reply_to_oplock_break_requests(fsp);
@@ -375,7 +379,7 @@ void break_level2_to_none_async(files_struct *fsp)
 
        DEBUG(10,("process_oplock_async_level2_break_message: sending break "
                  "to none message for fid %d, file %s\n", fsp->fnum,
-                 fsp->fsp_name));
+                 fsp_str_dbg(fsp)));
 
        /* Now send a break to none message to our client. */
        break_msg = new_break_smb_message(NULL, fsp, OPLOCKLEVEL_NONE);
@@ -506,7 +510,7 @@ static void process_oplock_break_message(struct messaging_context *msg_ctx,
            !EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type)) {
                DEBUG(3, ("Already downgraded oplock on %s: %s\n",
                          file_id_string_tos(&fsp->file_id),
-                         fsp->fsp_name));
+                         fsp_str_dbg(fsp)));
                /* We just send the same message back. */
                messaging_send_buf(msg_ctx, src, MSG_SMB_BREAK_RESPONSE,
                                   (uint8 *)data->data,
@@ -740,7 +744,7 @@ static void contend_level2_oplocks_begin_default(files_struct *fsp,
                                  NULL);
        if (lck == NULL) {
                DEBUG(0,("release_level_2_oplocks_on_change: failed to lock "
-                        "share mode entry for file %s.\n", fsp->fsp_name ));
+                        "share mode entry for file %s.\n", fsp_str_dbg(fsp)));
                return;
        }
 
index 89b8e0f7b58489c738c8d1f693c24e06f222bd72..dd32177988891d940e227242f06d35daa42aca03 100644 (file)
@@ -212,7 +212,8 @@ static bool irix_set_kernel_oplock(struct kernel_oplocks *_ctx,
                        DEBUG(0,("irix_set_kernel_oplock: Unable to get "
                                 "kernel oplock on file %s, file_id %s "
                                 "gen_id = %ul. Error was %s\n", 
-                                fsp->fsp_name, file_id_string_tos(&fsp->file_id), 
+                                fsp_str_dbg(fsp),
+                                file_id_string_tos(&fsp->file_id),
                                 fsp->fh->gen_id,
                                 strerror(errno) ));
                } else {
@@ -220,7 +221,7 @@ static bool irix_set_kernel_oplock(struct kernel_oplocks *_ctx,
                                 "file %s, fd = %d, file_id = %s, "
                                 "gen_id = %ul. Another process had the file "
                                 "open.\n",
-                                fsp->fsp_name, fsp->fh->fd,
+                                fsp_str_dbg(fsp), fsp->fh->fd,
                                 file_id_string_tos(&fsp->file_id),
                                 fsp->fh->gen_id ));
                }
@@ -229,7 +230,7 @@ static bool irix_set_kernel_oplock(struct kernel_oplocks *_ctx,
        
        DEBUG(10,("irix_set_kernel_oplock: got kernel oplock on file %s, file_id = %s "
                  "gen_id = %ul\n",
-                 fsp->fsp_name, file_id_string_tos(&fsp->file_id),
+                 fsp_str_dbg(fsp), file_id_string_tos(&fsp->file_id),
                  fsp->fh->gen_id));
 
        return True;
@@ -250,7 +251,8 @@ static void irix_release_kernel_oplock(struct kernel_oplocks *_ctx,
                int state = sys_fcntl_long(fsp->fh->fd, F_OPLKACK, -1);
                dbgtext("irix_release_kernel_oplock: file %s, file_id = %s"
                        "gen_id = %ul, has kernel oplock state "
-                       "of %x.\n", fsp->fsp_name, file_id_string_tos(&fsp->file_id),
+                       "of %x.\n", fsp_str_dbg(fsp),
+                       file_id_string_tos(&fsp->file_id),
                         fsp->fh->gen_id, state );
        }
 
@@ -263,7 +265,8 @@ static void irix_release_kernel_oplock(struct kernel_oplocks *_ctx,
                                "removing kernel oplock on file " );
                        dbgtext("%s, file_id = %s gen_id = %ul. "
                                "Error was %s\n",
-                               fsp->fsp_name, file_id_string_tos(&fsp->file_id),
+                               fsp_str_dbg(fsp),
+                               file_id_string_tos(&fsp->file_id),
                                fsp->fh->gen_id,
                                strerror(errno) );
                }
index 273fbfdc01e7ec33ab44cc22b6c1cf997df150c4..b4a5495e4b10b2b679d6d095bc0263db9fe64d4e 100644 (file)
@@ -111,7 +111,7 @@ static bool linux_set_kernel_oplock(struct kernel_oplocks *ctx,
        if ( SMB_VFS_LINUX_SETLEASE(fsp, F_WRLCK) == -1) {
                DEBUG(3,("linux_set_kernel_oplock: Refused oplock on file %s, "
                         "fd = %d, file_id = %s. (%s)\n",
-                        fsp->fsp_name, fsp->fh->fd, 
+                        fsp_str_dbg(fsp), fsp->fh->fd,
                         file_id_string_tos(&fsp->file_id),
                         strerror(errno)));
                return False;
@@ -119,7 +119,7 @@ static bool linux_set_kernel_oplock(struct kernel_oplocks *ctx,
        
        DEBUG(3,("linux_set_kernel_oplock: got kernel oplock on file %s, "
                 "file_id = %s gen_id = %lu\n",
-                fsp->fsp_name, file_id_string_tos(&fsp->file_id),
+                fsp_str_dbg(fsp), file_id_string_tos(&fsp->file_id),
                 fsp->fh->gen_id));
 
        return True;
@@ -140,7 +140,8 @@ static void linux_release_kernel_oplock(struct kernel_oplocks *ctx,
                int state = fcntl(fsp->fh->fd, F_GETLEASE, 0);
                dbgtext("linux_release_kernel_oplock: file %s, file_id = %s "
                        "gen_id = %lu has kernel oplock state "
-                       "of %x.\n", fsp->fsp_name, file_id_string_tos(&fsp->file_id),
+                       "of %x.\n", fsp_str_dbg(fsp),
+                       file_id_string_tos(&fsp->file_id),
                        fsp->fh->gen_id, state );
        }
 
@@ -152,7 +153,7 @@ static void linux_release_kernel_oplock(struct kernel_oplocks *ctx,
                        dbgtext("linux_release_kernel_oplock: Error when "
                                "removing kernel oplock on file " );
                        dbgtext("%s, file_id = %s, gen_id = %lu. "
-                               "Error was %s\n", fsp->fsp_name,
+                               "Error was %s\n", fsp_str_dbg(fsp),
                                file_id_string_tos(&fsp->file_id),
                                fsp->fh->gen_id, strerror(errno) );
                }
index 497cfc7b5455a221c3864dbb0f8f6576ddd32076..a73100abdf05b566ff2df55097b584a6b5db44a7 100644 (file)
@@ -74,7 +74,8 @@ const char *onefs_cb_record_str_dbg(const struct onefs_callback_record *r)
        switch (r->state) {
        case ONEFS_OPEN_FILE:
                result = talloc_asprintf(dbg_ctx(), "cb record %llu for file "
-                                        "%s", r->id, r->data.fsp->fsp_name);
+                                        "%s", r->id,
+                                        fsp_str_dbg(r->data.fsp));
        case ONEFS_WAITING_FOR_OPLOCK:
                result = talloc_asprintf(dbg_ctx(), "cb record %llu for "
                                         "pending mid %d", r->id,
@@ -299,7 +300,7 @@ static void oplock_break_to_none_handler(uint64_t id)
        }
 
        DEBUG(10, ("oplock_break_to_none_handler called for file %s\n",
-                  cb->data.fsp->fsp_name));
+                  cb->data.fsp_str_dbg(fsp)));
 
        init_share_mode_entry(&sme, cb, FORCE_OPLOCK_BREAK_TO_NONE);
        share_mode_entry_to_message(msg, &sme);
@@ -336,7 +337,7 @@ static void oplock_break_to_level_two_handler(uint64_t id)
        }
 
        DEBUG(10, ("oplock_break_to_level_two_handler called for file %s\n",
-                  cb->data.fsp->fsp_name));
+                  cb->data.fsp_str_dbg(fsp)));
 
        init_share_mode_entry(&sme, cb, LEVEL_II_OPLOCK);
        share_mode_entry_to_message(msg, &sme);
@@ -377,7 +378,7 @@ static void oplock_revoked_handler(uint64_t id)
        SMB_ASSERT(fsp->oplock_timeout == NULL);
 
        DEBUG(0,("Level 1 oplock break failed for file %s. Forcefully "
-                "revoking oplock\n", fsp->fsp_name));
+                "revoking oplock\n", fsp_str_dbg(fsp)));
 
        global_client_failed_oplock_break = True;
        remove_oplock(fsp);
@@ -501,7 +502,7 @@ static void onefs_release_kernel_oplock(struct kernel_oplocks *_ctx,
        enum oplock_type oplock = onefs_samba_oplock_to_oplock(oplock_type);
 
        DEBUG(10, ("onefs_release_kernel_oplock: Releasing %s to type %s\n",
-                  fsp->fsp_name, onefs_oplock_str(oplock)));
+                  fsp_str_dbg(fsp), onefs_oplock_str(oplock)));
 
        if (fsp->fh->fd == -1) {
                DEBUG(1, ("no fd\n"));
index 799568d0d5d67bdf00580fe783642f3dfc6bf41c..091db099872a89ea5353c16b93b36c9a897dc9c0 100644 (file)
@@ -37,6 +37,7 @@ NTSTATUS open_np_file(struct smb_request *smb_req, const char *name,
 {
        struct connection_struct *conn = smb_req->conn;
        struct files_struct *fsp;
+       struct smb_filename *smb_fname = NULL;
        NTSTATUS status;
 
        status = file_new(smb_req, conn, &fsp);
@@ -50,7 +51,19 @@ NTSTATUS open_np_file(struct smb_request *smb_req, const char *name,
        fsp->vuid = smb_req->vuid;
        fsp->can_lock = false;
        fsp->access_mask = FILE_READ_DATA | FILE_WRITE_DATA;
-       string_set(&fsp->fsp_name, name);
+
+       status = create_synthetic_smb_fname(talloc_tos(), name, NULL, NULL,
+                                           &smb_fname);
+               if (!NT_STATUS_IS_OK(status)) {
+               file_free(smb_req, fsp);
+               return status;
+       }
+       status = fsp_set_smb_fname(fsp, smb_fname);
+       TALLOC_FREE(smb_fname);
+       if (!NT_STATUS_IS_OK(status)) {
+               file_free(smb_req, fsp);
+               return status;
+       }
 
        status = np_open(NULL, name, conn->client_address,
                         conn->server_info, &fsp->fake_file_handle);
@@ -179,7 +192,7 @@ void reply_pipe_write(struct smb_request *req)
        data = req->buf + 3;
 
        DEBUG(6, ("reply_pipe_write: %x name: %s len: %d\n", (int)fsp->fnum,
-                 fsp->fsp_name, (int)state->numtowrite));
+                 fsp_str_dbg(fsp), (int)state->numtowrite));
 
        subreq = np_write_send(state, smbd_event_context(),
                               fsp->fake_file_handle, data, state->numtowrite);
@@ -275,7 +288,7 @@ void reply_pipe_write_and_X(struct smb_request *req)
                 == (PIPE_START_MESSAGE|PIPE_RAW_MODE));
 
        DEBUG(6, ("reply_pipe_write_and_X: %x name: %s len: %d\n",
-                 (int)fsp->fnum, fsp->fsp_name, (int)state->numtowrite));
+                 (int)fsp->fnum, fsp_str_dbg(fsp), (int)state->numtowrite));
 
        data = (uint8_t *)smb_base(req->inbuf) + smb_doff;
 
index 76eee9b56aa560bf8566248cc04ed2455b3ee14f..fb2cda40ce0019e68aa2103df802ececf47aa426 100644 (file)
@@ -256,15 +256,16 @@ static void store_inheritance_attributes(files_struct *fsp,
                ret = SMB_VFS_FSETXATTR(fsp, SAMBA_POSIX_INHERITANCE_EA_NAME,
                                pai_buf, store_size, 0);
        } else {
-               ret = SMB_VFS_SETXATTR(fsp->conn,fsp->fsp_name, SAMBA_POSIX_INHERITANCE_EA_NAME,
-                               pai_buf, store_size, 0);
+               ret = SMB_VFS_SETXATTR(fsp->conn, fsp->fsp_name->base_name,
+                                      SAMBA_POSIX_INHERITANCE_EA_NAME,
+                                      pai_buf, store_size, 0);
        }
 
        SAFE_FREE(pai_buf);
 
        DEBUG(10,("store_inheritance_attribute: type 0x%x for file %s\n",
                (unsigned int)sd_type,
-               fsp->fsp_name));
+               fsp_str_dbg(fsp)));
 
        if (ret == -1 && !no_acl_syscall_error(errno)) {
                DEBUG(1,("store_inheritance_attribute: Error %s\n", strerror(errno) ));
@@ -599,8 +600,10 @@ static struct pai_val *fload_inherited_info(files_struct *fsp)
                        ret = SMB_VFS_FGETXATTR(fsp, SAMBA_POSIX_INHERITANCE_EA_NAME,
                                        pai_buf, pai_buf_size);
                } else {
-                       ret = SMB_VFS_GETXATTR(fsp->conn,fsp->fsp_name,SAMBA_POSIX_INHERITANCE_EA_NAME,
-                                       pai_buf, pai_buf_size);
+                       ret = SMB_VFS_GETXATTR(fsp->conn,
+                                              fsp->fsp_name->base_name,
+                                              SAMBA_POSIX_INHERITANCE_EA_NAME,
+                                              pai_buf, pai_buf_size);
                }
 
                if (ret == -1) {
@@ -618,7 +621,8 @@ static struct pai_val *fload_inherited_info(files_struct *fsp)
                }
        } while (ret == -1);
 
-       DEBUG(10,("load_inherited_info: ret = %lu for file %s\n", (unsigned long)ret, fsp->fsp_name));
+       DEBUG(10,("load_inherited_info: ret = %lu for file %s\n",
+                 (unsigned long)ret, fsp_str_dbg(fsp)));
 
        if (ret == -1) {
                /* No attribute or not supported. */
@@ -637,8 +641,7 @@ static struct pai_val *fload_inherited_info(files_struct *fsp)
 
        if (paiv) {
                DEBUG(10,("load_inherited_info: ACL type is 0x%x for file %s\n",
-                       (unsigned int)paiv->sd_type,
-                       fsp->fsp_name));
+                         (unsigned int)paiv->sd_type, fsp_str_dbg(fsp)));
        }
 
        SAFE_FREE(pai_buf);
@@ -1727,8 +1730,12 @@ static bool create_canon_ace_lists(files_struct *fsp,
                                        got_dir_allow = True;
 
                                if ((current_ace->attr == DENY_ACE) && got_dir_allow) {
-                                       DEBUG(0,("create_canon_ace_lists: malformed ACL in inheritable ACL ! \
-Deny entry after Allow entry. Failing to set on file %s.\n", fsp->fsp_name ));
+                                       DEBUG(0,("create_canon_ace_lists: "
+                                                "malformed ACL in "
+                                                "inheritable ACL! Deny entry "
+                                                "after Allow entry. Failing "
+                                                "to set on file %s.\n",
+                                                fsp_str_dbg(fsp)));
                                        free_canon_ace_list(file_ace);
                                        free_canon_ace_list(dir_ace);
                                        return False;
@@ -1785,8 +1792,10 @@ Deny entry after Allow entry. Failing to set on file %s.\n", fsp->fsp_name ));
                                got_file_allow = True;
 
                        if ((current_ace->attr == DENY_ACE) && got_file_allow) {
-                               DEBUG(0,("create_canon_ace_lists: malformed ACL in file ACL ! \
-Deny entry after Allow entry. Failing to set on file %s.\n", fsp->fsp_name ));
+                               DEBUG(0,("create_canon_ace_lists: malformed "
+                                        "ACL in file ACL ! Deny entry after "
+                                        "Allow entry. Failing to set on file "
+                                        "%s.\n", fsp_str_dbg(fsp)));
                                free_canon_ace_list(file_ace);
                                free_canon_ace_list(dir_ace);
                                return False;
@@ -2169,17 +2178,8 @@ static mode_t create_default_mode(files_struct *fsp, bool interitable_mode)
        mode_t mode;
 
        if (interitable_mode) {
-               struct smb_filename *smb_fname = NULL;
-               NTSTATUS status;
-
-               status = create_synthetic_smb_fname_split(talloc_tos(),
-                                                         fsp->fsp_name, NULL,
-                                                         &smb_fname);
-               if (!NT_STATUS_IS_OK(status)) {
-                       return 0;
-               }
-               mode = unix_mode(fsp->conn, FILE_ATTRIBUTE_ARCHIVE, smb_fname,
-                                NULL);
+               mode = unix_mode(fsp->conn, FILE_ATTRIBUTE_ARCHIVE,
+                                fsp->fsp_name, NULL);
        } else {
                mode = S_IRUSR;
        }
@@ -2602,14 +2602,9 @@ static bool set_canon_ace_list(files_struct *fsp,
        SMB_ACL_TYPE_T the_acl_type = (default_ace ? SMB_ACL_TYPE_DEFAULT : SMB_ACL_TYPE_ACCESS);
        bool needs_mask = False;
        mode_t mask_perms = 0;
-       struct smb_filename *smb_fname = NULL;
-       NTSTATUS status;
 
-       status = create_synthetic_smb_fname_split(talloc_tos(), fsp->fsp_name,
-                                                 psbuf, &smb_fname);
-       if (!NT_STATUS_IS_OK(status)) {
-               goto fail;
-       }
+       /* Use the psbuf that was passed in. */
+       fsp->fsp_name->st = *psbuf;
 
 #if defined(POSIX_ACL_NEEDS_MASK)
        /* HP-UX always wants to have a mask (called "class" there). */
@@ -2767,7 +2762,7 @@ static bool set_canon_ace_list(files_struct *fsp,
         */
 
        if(default_ace || fsp->is_directory || fsp->fh->fd == -1) {
-               if (SMB_VFS_SYS_ACL_SET_FILE(conn, smb_fname->base_name,
+               if (SMB_VFS_SYS_ACL_SET_FILE(conn, fsp->fsp_name->base_name,
                                             the_acl_type, the_acl) == -1) {
                        /*
                         * Some systems allow all the above calls and only fail with no ACL support
@@ -2777,17 +2772,17 @@ static bool set_canon_ace_list(files_struct *fsp,
                                *pacl_set_support = False;
                        }
 
-                       if (acl_group_override(conn, smb_fname)) {
+                       if (acl_group_override(conn, fsp->fsp_name)) {
                                int sret;
 
                                DEBUG(5,("set_canon_ace_list: acl group "
                                         "control on and current user in file "
                                         "%s primary group.\n",
-                                        smb_fname_str_dbg(smb_fname)));
+                                        fsp_str_dbg(fsp)));
 
                                become_root();
                                sret = SMB_VFS_SYS_ACL_SET_FILE(conn,
-                                   smb_fname->base_name, the_acl_type,
+                                   fsp->fsp_name->base_name, the_acl_type,
                                    the_acl);
                                unbecome_root();
                                if (sret == 0) {
@@ -2801,8 +2796,7 @@ static bool set_canon_ace_list(files_struct *fsp,
                                         "file %s (%s).\n",
                                         the_acl_type == SMB_ACL_TYPE_DEFAULT ?
                                         "directory default" : "file",
-                                        smb_fname_str_dbg(smb_fname),
-                                        strerror(errno)));
+                                        fsp_str_dbg(fsp), strerror(errno)));
                                goto fail;
                        }
                }
@@ -2816,13 +2810,13 @@ static bool set_canon_ace_list(files_struct *fsp,
                                *pacl_set_support = False;
                        }
 
-                       if (acl_group_override(conn, smb_fname)) {
+                       if (acl_group_override(conn, fsp->fsp_name)) {
                                int sret;
 
                                DEBUG(5,("set_canon_ace_list: acl group "
                                         "control on and current user in file "
                                         "%s primary group.\n",
-                                        smb_fname_str_dbg(smb_fname)));
+                                        fsp_str_dbg(fsp)));
 
                                become_root();
                                sret = SMB_VFS_SYS_ACL_SET_FD(fsp, the_acl);
@@ -2836,8 +2830,7 @@ static bool set_canon_ace_list(files_struct *fsp,
                                DEBUG(2,("set_canon_ace_list: "
                                         "sys_acl_set_file failed for file %s "
                                         "(%s).\n",
-                                        smb_fname_str_dbg(smb_fname),
-                                        strerror(errno) ));
+                                        fsp_str_dbg(fsp), strerror(errno)));
                                goto fail;
                        }
                }
@@ -2850,7 +2843,6 @@ static bool set_canon_ace_list(files_struct *fsp,
        if (the_acl != NULL) {
                SMB_VFS_SYS_ACL_FREE_ACL(conn, the_acl);
        }
-       TALLOC_FREE(smb_fname);
 
        return ret;
 }
@@ -2906,8 +2898,9 @@ static bool convert_canon_ace_to_posix_perms( files_struct *fsp, canon_ace *file
        mode_t or_bits;
 
        if (ace_count != 3) {
-               DEBUG(3,("convert_canon_ace_to_posix_perms: Too many ACE entries for file %s to convert to \
-posix perms.\n", fsp->fsp_name ));
+               DEBUG(3,("convert_canon_ace_to_posix_perms: Too many ACE "
+                        "entries for file %s to convert to posix perms.\n",
+                        fsp_str_dbg(fsp)));
                return False;
        }
 
@@ -2921,8 +2914,8 @@ posix perms.\n", fsp->fsp_name ));
        }
 
        if (!owner_ace || !group_ace || !other_ace) {
-               DEBUG(3,("convert_canon_ace_to_posix_perms: Can't get standard entries for file %s.\n",
-                               fsp->fsp_name ));
+               DEBUG(3,("convert_canon_ace_to_posix_perms: Can't get "
+                        "standard entries for file %s.\n", fsp_str_dbg(fsp)));
                return False;
        }
 
@@ -2956,9 +2949,10 @@ posix perms.\n", fsp->fsp_name ));
 
        *posix_perms = (((*posix_perms) & and_bits)|or_bits);
 
-       DEBUG(10,("convert_canon_ace_to_posix_perms: converted u=%o,g=%o,w=%o to perm=0%o for file %s.\n",
-               (int)owner_ace->perms, (int)group_ace->perms, (int)other_ace->perms, (int)*posix_perms,
-               fsp->fsp_name ));
+       DEBUG(10,("convert_canon_ace_to_posix_perms: converted u=%o,g=%o,w=%o "
+                 "to perm=0%o for file %s.\n", (int)owner_ace->perms,
+                 (int)group_ace->perms, (int)other_ace->perms,
+                 (int)*posix_perms, fsp_str_dbg(fsp)));
 
        return True;
 }
@@ -3351,11 +3345,12 @@ NTSTATUS posix_fget_nt_acl(struct files_struct *fsp, uint32_t security_info,
 
        *ppdesc = NULL;
 
-       DEBUG(10,("posix_fget_nt_acl: called for file %s\n", fsp->fsp_name ));
+       DEBUG(10,("posix_fget_nt_acl: called for file %s\n",
+                 fsp_str_dbg(fsp)));
 
        /* can it happen that fsp_name == NULL ? */
        if (fsp->is_directory ||  fsp->fh->fd == -1) {
-               return posix_get_nt_acl(fsp->conn, fsp->fsp_name,
+               return posix_get_nt_acl(fsp->conn, fsp->fsp_name->base_name,
                                        security_info, ppdesc);
        }
 
@@ -3369,8 +3364,9 @@ NTSTATUS posix_fget_nt_acl(struct files_struct *fsp, uint32_t security_info,
 
        pal = fload_inherited_info(fsp);
 
-       return posix_get_nt_acl_common(fsp->conn, fsp->fsp_name, &sbuf, pal,
-                                      posix_acl, NULL, security_info, ppdesc);
+       return posix_get_nt_acl_common(fsp->conn, fsp->fsp_name->base_name,
+                                      &sbuf, pal, posix_acl, NULL,
+                                      security_info, ppdesc);
 }
 
 NTSTATUS posix_get_nt_acl(struct connection_struct *conn, const char *name,
@@ -3514,7 +3510,8 @@ NTSTATUS append_parent_acl(files_struct *fsp,
                return NT_STATUS_NO_MEMORY;
        }
 
-       if (!parent_dirname(mem_ctx, fsp->fsp_name, &parent_name, NULL)) {
+       if (!parent_dirname(mem_ctx, fsp->fsp_name->base_name, &parent_name,
+                           NULL)) {
                return NT_STATUS_NO_MEMORY;
        }
 
@@ -3596,7 +3593,7 @@ NTSTATUS append_parent_acl(files_struct *fsp,
                                        "ignoring non container "
                                        "inherit flags %u on ACE with sid %s "
                                        "from parent %s\n",
-                                       fsp->fsp_name,
+                                       fsp_str_dbg(fsp),
                                        (unsigned int)se->flags,
                                        sid_string_dbg(&se->trustee),
                                        parent_name));
@@ -3609,7 +3606,7 @@ NTSTATUS append_parent_acl(files_struct *fsp,
                                        "ignoring non object "
                                        "inherit flags %u on ACE with sid %s "
                                        "from parent %s\n",
-                                       fsp->fsp_name,
+                                       fsp_str_dbg(fsp),
                                        (unsigned int)se->flags,
                                        sid_string_dbg(&se->trustee),
                                        parent_name));
@@ -3633,7 +3630,7 @@ NTSTATUS append_parent_acl(files_struct *fsp,
                                DEBUG(10,("append_parent_acl: path %s "
                                        "ignoring ACE with protected sid %s "
                                        "from parent %s\n",
-                                       fsp->fsp_name,
+                                       fsp_str_dbg(fsp),
                                        sid_string_dbg(&se->trustee),
                                        parent_name));
                                continue;
@@ -3671,7 +3668,7 @@ NTSTATUS append_parent_acl(files_struct *fsp,
                DEBUG(10,("append_parent_acl: path %s "
                        "inheriting ACE with sid %s "
                        "from parent %s\n",
-                       fsp->fsp_name,
+                       fsp_str_dbg(fsp),
                        sid_string_dbg(&se->trustee),
                        parent_name));
        }
@@ -3707,21 +3704,13 @@ NTSTATUS set_nt_acl(files_struct *fsp, uint32 security_info_sent, const SEC_DESC
        bool set_acl_as_root = false;
        bool acl_set_support = false;
        bool ret = false;
-       struct smb_filename *smb_fname = NULL;
-
-       status = create_synthetic_smb_fname_split(talloc_tos(), fsp->fsp_name,
-                                                 NULL, &smb_fname);
-       if (!NT_STATUS_IS_OK(status)) {
-               goto out;
-       }
 
        DEBUG(10,("set_nt_acl: called for file %s\n",
-                 smb_fname_str_dbg(smb_fname)));
+                 fsp_str_dbg(fsp)));
 
        if (!CAN_WRITE(conn)) {
                DEBUG(10,("set acl rejected on read-only share\n"));
-               status = NT_STATUS_MEDIA_WRITE_PROTECTED;
-               goto out;
+               return NT_STATUS_MEDIA_WRITE_PROTECTED;
        }
 
        /*
@@ -3729,19 +3718,17 @@ NTSTATUS set_nt_acl(files_struct *fsp, uint32 security_info_sent, const SEC_DESC
         */
 
        if(fsp->is_directory || fsp->fh->fd == -1) {
-               if(SMB_VFS_STAT(fsp->conn, smb_fname) != 0) {
-                       status = map_nt_error_from_unix(errno);
-                       goto out;
+               if(SMB_VFS_STAT(fsp->conn, fsp->fsp_name) != 0) {
+                       return map_nt_error_from_unix(errno);
                }
        } else {
-               if(SMB_VFS_FSTAT(fsp, &smb_fname->st) != 0) {
-                       status = map_nt_error_from_unix(errno);
-                       goto out;
+               if(SMB_VFS_FSTAT(fsp, &fsp->fsp_name->st) != 0) {
+                       return map_nt_error_from_unix(errno);
                }
        }
 
        /* Save the original element we check against. */
-       orig_mode = smb_fname->st.st_ex_mode;
+       orig_mode = fsp->fsp_name->st.st_ex_mode;
 
        /*
         * Unpack the user/group/world id's.
@@ -3749,7 +3736,7 @@ NTSTATUS set_nt_acl(files_struct *fsp, uint32 security_info_sent, const SEC_DESC
 
        status = unpack_nt_owners( SNUM(conn), &user, &grp, security_info_sent, psd);
        if (!NT_STATUS_IS_OK(status)) {
-               goto out;
+               return status;
        }
 
        /*
@@ -3758,24 +3745,22 @@ NTSTATUS set_nt_acl(files_struct *fsp, uint32 security_info_sent, const SEC_DESC
         * Noticed by Simo.
         */
 
-       if (((user != (uid_t)-1) && (smb_fname->st.st_ex_uid != user)) ||
-           (( grp != (gid_t)-1) && (smb_fname->st.st_ex_gid != grp))) {
+       if (((user != (uid_t)-1) && (fsp->fsp_name->st.st_ex_uid != user)) ||
+           (( grp != (gid_t)-1) && (fsp->fsp_name->st.st_ex_gid != grp))) {
 
                DEBUG(3,("set_nt_acl: chown %s. uid = %u, gid = %u.\n",
-                        smb_fname_str_dbg(smb_fname), (unsigned int)user,
-                        (unsigned int)grp ));
+                        fsp_str_dbg(fsp), (unsigned int)user,
+                        (unsigned int)grp));
 
-               if(try_chown(fsp->conn, smb_fname, user, grp) == -1) {
+               if(try_chown(fsp->conn, fsp->fsp_name, user, grp) == -1) {
                        DEBUG(3,("set_nt_acl: chown %s, %u, %u failed. Error "
-                                "= %s.\n", smb_fname_str_dbg(smb_fname),
+                                "= %s.\n", fsp_str_dbg(fsp),
                                 (unsigned int)user, (unsigned int)grp,
                                 strerror(errno)));
                        if (errno == EPERM) {
-                               status = NT_STATUS_INVALID_OWNER;
-                               goto out;
+                               return NT_STATUS_INVALID_OWNER;
                        }
-                       status = map_nt_error_from_unix(errno);
-                       goto out;
+                       return map_nt_error_from_unix(errno);
                }
 
                /*
@@ -3784,25 +3769,24 @@ NTSTATUS set_nt_acl(files_struct *fsp, uint32 security_info_sent, const SEC_DESC
                 */
 
                if(fsp->is_directory) {
-                       if(SMB_VFS_STAT(fsp->conn, smb_fname) != 0) {
-                               status = map_nt_error_from_unix(errno);
-                               goto out;
+                       if(SMB_VFS_STAT(fsp->conn, fsp->fsp_name) != 0) {
+                               return map_nt_error_from_unix(errno);
                        }
                } else {
 
                        int sret;
 
                        if(fsp->fh->fd == -1)
-                               sret = SMB_VFS_STAT(fsp->conn, smb_fname);
+                               sret = SMB_VFS_STAT(fsp->conn, fsp->fsp_name);
                        else
-                               sret = SMB_VFS_FSTAT(fsp, &smb_fname->st);
+                               sret = SMB_VFS_FSTAT(fsp, &fsp->fsp_name->st);
 
                        if(sret != 0)
                                return map_nt_error_from_unix(errno);
                }
 
                /* Save the original element we check against. */
-               orig_mode = smb_fname->st.st_ex_mode;
+               orig_mode = fsp->fsp_name->st.st_ex_mode;
 
                /* If we successfully chowned, we know we must
                 * be able to set the acl, so do it as root.
@@ -3810,24 +3794,22 @@ NTSTATUS set_nt_acl(files_struct *fsp, uint32 security_info_sent, const SEC_DESC
                set_acl_as_root = true;
        }
 
-       create_file_sids(&smb_fname->st, &file_owner_sid, &file_grp_sid);
+       create_file_sids(&fsp->fsp_name->st, &file_owner_sid, &file_grp_sid);
 
-       acl_perms = unpack_canon_ace(fsp, &smb_fname->st, &file_owner_sid,
+       acl_perms = unpack_canon_ace(fsp, &fsp->fsp_name->st, &file_owner_sid,
                                     &file_grp_sid, &file_ace_list,
                                     &dir_ace_list, security_info_sent, psd);
 
        /* Ignore W2K traverse DACL set. */
        if (!file_ace_list && !dir_ace_list) {
-               status = NT_STATUS_OK;
-               goto out;
+               return NT_STATUS_OK;
        }
 
        if (!acl_perms) {
                DEBUG(3,("set_nt_acl: cannot set permissions\n"));
                free_canon_ace_list(file_ace_list);
                free_canon_ace_list(dir_ace_list);
-               status = NT_STATUS_ACCESS_DENIED;
-               goto out;
+               return NT_STATUS_ACCESS_DENIED;
        }
 
        /*
@@ -3837,8 +3819,7 @@ NTSTATUS set_nt_acl(files_struct *fsp, uint32 security_info_sent, const SEC_DESC
        if(!(security_info_sent & DACL_SECURITY_INFORMATION) || (psd->dacl == NULL)) {
                free_canon_ace_list(file_ace_list);
                free_canon_ace_list(dir_ace_list);
-               status = NT_STATUS_OK;
-               goto out;
+               return NT_STATUS_OK;
        }
 
        /*
@@ -3851,18 +3832,17 @@ NTSTATUS set_nt_acl(files_struct *fsp, uint32 security_info_sent, const SEC_DESC
                        become_root();
                }
                ret = set_canon_ace_list(fsp, file_ace_list, false,
-                                        &smb_fname->st, &acl_set_support);
+                                        &fsp->fsp_name->st, &acl_set_support);
                if (set_acl_as_root) {
                        unbecome_root();
                }
                if (acl_set_support && ret == false) {
                        DEBUG(3,("set_nt_acl: failed to set file acl on file "
-                                "%s (%s).\n", smb_fname_str_dbg(smb_fname),
+                                "%s (%s).\n", fsp_str_dbg(fsp),
                                 strerror(errno)));
                        free_canon_ace_list(file_ace_list);
                        free_canon_ace_list(dir_ace_list);
-                       status = map_nt_error_from_unix(errno);
-                       goto out;
+                       return map_nt_error_from_unix(errno);
                }
        }
 
@@ -3872,7 +3852,7 @@ NTSTATUS set_nt_acl(files_struct *fsp, uint32 security_info_sent, const SEC_DESC
                                become_root();
                        }
                        ret = set_canon_ace_list(fsp, dir_ace_list, true,
-                                                &smb_fname->st,
+                                                &fsp->fsp_name->st,
                                                 &acl_set_support);
                        if (set_acl_as_root) {
                                unbecome_root();
@@ -3880,12 +3860,10 @@ NTSTATUS set_nt_acl(files_struct *fsp, uint32 security_info_sent, const SEC_DESC
                        if (ret == false) {
                                DEBUG(3,("set_nt_acl: failed to set default "
                                         "acl on directory %s (%s).\n",
-                                        smb_fname_str_dbg(smb_fname),
-                                        strerror(errno) ));
+                                        fsp_str_dbg(fsp), strerror(errno)));
                                free_canon_ace_list(file_ace_list);
                                free_canon_ace_list(dir_ace_list);
-                               status = map_nt_error_from_unix(errno);
-                               goto out;
+                               return map_nt_error_from_unix(errno);
                        }
                } else {
                        int sret = -1;
@@ -3898,23 +3876,23 @@ NTSTATUS set_nt_acl(files_struct *fsp, uint32 security_info_sent, const SEC_DESC
                                become_root();
                        }
                        sret = SMB_VFS_SYS_ACL_DELETE_DEF_FILE(conn,
-                           smb_fname->base_name);
+                           fsp->fsp_name->base_name);
                        if (set_acl_as_root) {
                                unbecome_root();
                        }
                        if (sret == -1) {
-                               if (acl_group_override(conn, smb_fname)) {
+                               if (acl_group_override(conn, fsp->fsp_name)) {
                                        DEBUG(5,("set_nt_acl: acl group "
                                                 "control on and current user "
                                                 "in file %s primary group. "
                                                 "Override delete_def_acl\n",
-                                               smb_fname_str_dbg(smb_fname)));
+                                                fsp_str_dbg(fsp)));
 
                                        become_root();
                                        sret =
                                            SMB_VFS_SYS_ACL_DELETE_DEF_FILE(
                                                    conn,
-                                                   smb_fname->base_name);
+                                                   fsp->fsp_name->base_name);
                                        unbecome_root();
                                }
 
@@ -3922,8 +3900,7 @@ NTSTATUS set_nt_acl(files_struct *fsp, uint32 security_info_sent, const SEC_DESC
                                        DEBUG(3,("set_nt_acl: sys_acl_delete_def_file failed (%s)\n", strerror(errno)));
                                        free_canon_ace_list(file_ace_list);
                                        free_canon_ace_list(dir_ace_list);
-                                       status = map_nt_error_from_unix(errno);
-                                       goto out;
+                                       return map_nt_error_from_unix(errno);
                                }
                        }
                }
@@ -3954,52 +3931,48 @@ NTSTATUS set_nt_acl(files_struct *fsp, uint32 security_info_sent, const SEC_DESC
                        free_canon_ace_list(dir_ace_list);
                        DEBUG(3,("set_nt_acl: failed to convert file acl to "
                                 "posix permissions for file %s.\n",
-                                smb_fname_str_dbg(smb_fname)));
-                       status = NT_STATUS_ACCESS_DENIED;
-                       goto out;
+                                fsp_str_dbg(fsp)));
+                       return NT_STATUS_ACCESS_DENIED;
                }
 
                if (orig_mode != posix_perms) {
                        int sret = -1;
 
                        DEBUG(3,("set_nt_acl: chmod %s. perms = 0%o.\n",
-                                smb_fname_str_dbg(smb_fname),
-                                (unsigned int)posix_perms));
+                                fsp_str_dbg(fsp), (unsigned int)posix_perms));
 
                        if (set_acl_as_root) {
                                become_root();
                        }
-                       sret = SMB_VFS_CHMOD(conn, smb_fname->base_name,
+                       sret = SMB_VFS_CHMOD(conn, fsp->fsp_name->base_name,
                                             posix_perms);
                        if (set_acl_as_root) {
                                unbecome_root();
                        }
                        if(sret == -1) {
-                               if (acl_group_override(conn, smb_fname)) {
+                               if (acl_group_override(conn, fsp->fsp_name)) {
                                        DEBUG(5,("set_nt_acl: acl group "
                                                 "control on and current user "
                                                 "in file %s primary group. "
                                                 "Override chmod\n",
-                                               smb_fname_str_dbg(smb_fname)));
+                                                fsp_str_dbg(fsp)));
 
                                        become_root();
-                                       sret =
-                                           SMB_VFS_CHMOD(conn,
-                                                         smb_fname->base_name,
-                                                         posix_perms);
+                                       sret = SMB_VFS_CHMOD(conn,
+                                           fsp->fsp_name->base_name,
+                                           posix_perms);
                                        unbecome_root();
                                }
 
                                if (sret == -1) {
                                        DEBUG(3,("set_nt_acl: chmod %s, 0%o "
                                                 "failed. Error = %s.\n",
-                                                smb_fname_str_dbg(smb_fname),
+                                                fsp_str_dbg(fsp),
                                                 (unsigned int)posix_perms,
                                                 strerror(errno)));
                                        free_canon_ace_list(file_ace_list);
                                        free_canon_ace_list(dir_ace_list);
-                                       status = map_nt_error_from_unix(errno);
-                                       goto out;
+                                       return map_nt_error_from_unix(errno);
                                }
                        }
                }
@@ -4008,10 +3981,7 @@ NTSTATUS set_nt_acl(files_struct *fsp, uint32 security_info_sent, const SEC_DESC
        free_canon_ace_list(file_ace_list);
        free_canon_ace_list(dir_ace_list);
 
-       status = NT_STATUS_OK;
- out:
-       TALLOC_FREE(smb_fname);
-       return status;
+       return NT_STATUS_OK;
 }
 
 /****************************************************************************
@@ -4614,6 +4584,7 @@ SEC_DESC *get_nt_acl_no_snum( TALLOC_CTX *ctx, const char *fname)
        connection_struct *conn;
        files_struct finfo;
        struct fd_handle fh;
+       NTSTATUS status;
 
        conn = TALLOC_ZERO_P(ctx, connection_struct);
        if (conn == NULL) {
@@ -4644,16 +4615,24 @@ SEC_DESC *get_nt_acl_no_snum( TALLOC_CTX *ctx, const char *fname)
        finfo.conn = conn;
        finfo.fh = &fh;
        finfo.fh->fd = -1;
-       finfo.fsp_name = CONST_DISCARD(char *,fname);
+
+       status = create_synthetic_smb_fname(talloc_tos(), fname, NULL, NULL,
+                                           &finfo.fsp_name);
+       if (!NT_STATUS_IS_OK(status)) {
+               conn_free_internal( conn );
+               return NULL;
+       }
 
        if (!NT_STATUS_IS_OK(SMB_VFS_FGET_NT_ACL( &finfo, DACL_SECURITY_INFORMATION, &psd))) {
                DEBUG(0,("get_nt_acl_no_snum: get_nt_acl returned zero.\n"));
+               TALLOC_FREE(finfo.fsp_name);
                conn_free_internal( conn );
                return NULL;
        }
 
        ret_sd = dup_sec_desc( ctx, psd );
 
+       TALLOC_FREE(finfo.fsp_name);
        conn_free_internal( conn );
 
        return ret_sd;
index a6e35c734259f4e3c619f3bbdc79e64dad3c40db..46fdd4adde79119d5d8dedacbbde818e850fed37 100644 (file)
@@ -1812,7 +1812,8 @@ void reply_open(struct smb_request *req)
        mtime = convert_timespec_to_time_t(smb_fname->st.st_ex_mtime);
 
        if (fattr & aDIR) {
-               DEBUG(3,("attempt to open a directory %s\n",fsp->fsp_name));
+               DEBUG(3,("attempt to open a directory %s\n",
+                        fsp_str_dbg(fsp)));
                close_file(req, fsp, ERROR_CLOSE);
                reply_doserror(req, ERRDOS,ERRnoaccess);
                goto out;
@@ -2313,9 +2314,9 @@ void reply_ctemp(struct smb_request *req)
        SSVAL(req->outbuf,smb_vwv0,fsp->fnum);
 
        /* the returned filename is relative to the directory */
-       s = strrchr_m(fsp->fsp_name, '/');
+       s = strrchr_m(fsp->fsp_name->base_name, '/');
        if (!s) {
-               s = fsp->fsp_name;
+               s = fsp->fsp_name->base_name;
        } else {
                s++;
        }
@@ -2341,8 +2342,8 @@ void reply_ctemp(struct smb_request *req)
                      CVAL(req->outbuf,smb_flg)|CORE_OPLOCK_GRANTED);
        }
 
-       DEBUG( 2, ( "reply_ctemp: created temp file %s\n", fsp->fsp_name ) );
-       DEBUG( 3, ( "reply_ctemp %s fd=%d umode=0%o\n", fsp->fsp_name,
+       DEBUG(2, ("reply_ctemp: created temp file %s\n", fsp_str_dbg(fsp)));
+       DEBUG(3, ("reply_ctemp %s fd=%d umode=0%o\n", fsp_str_dbg(fsp),
                    fsp->fh->fd, (unsigned int)smb_fname->st.st_ex_mode));
  out:
        TALLOC_FREE(smb_fname);
@@ -2357,22 +2358,13 @@ void reply_ctemp(struct smb_request *req)
 static NTSTATUS can_rename(connection_struct *conn, files_struct *fsp,
                           uint16 dirtype, SMB_STRUCT_STAT *pst)
 {
-       struct smb_filename *smb_fname = NULL;
-       NTSTATUS status;
        uint32 fmode;
 
        if (!CAN_WRITE(conn)) {
                return NT_STATUS_MEDIA_WRITE_PROTECTED;
        }
 
-       status = create_synthetic_smb_fname_split(talloc_tos(), fsp->fsp_name,
-                                                 pst, &smb_fname);
-       if (!NT_STATUS_IS_OK(status)) {
-               return status;
-       }
-
-       fmode = dos_mode(conn, smb_fname);
-       TALLOC_FREE(smb_fname);
+       fmode = dos_mode(conn, fsp->fsp_name);
        if ((fmode & ~dirtype) & (aHIDDEN | aSYSTEM)) {
                return NT_STATUS_NO_SUCH_FILE;
        }
@@ -2866,7 +2858,7 @@ static void sendfile_short_send(files_struct *fsp,
        if (nread < headersize) {
                DEBUG(0,("sendfile_short_send: sendfile failed to send "
                        "header for file %s (%s). Terminating\n",
-                       fsp->fsp_name, strerror(errno) ));
+                       fsp_str_dbg(fsp), strerror(errno)));
                exit_server_cleanly("sendfile_short_send failed");
        }
 
@@ -2880,7 +2872,7 @@ static void sendfile_short_send(files_struct *fsp,
                }
 
                DEBUG(0,("sendfile_short_send: filling truncated file %s "
-                       "with zeros !\n", fsp->fsp_name));
+                       "with zeros !\n", fsp_str_dbg(fsp)));
 
                while (nread < smb_maxcnt) {
                        /*
@@ -2975,15 +2967,19 @@ static void send_file_readbraw(connection_struct *conn,
                                DEBUG(0,("send_file_readbraw: sendfile not available. Faking..\n"));
 
                                if (fake_sendfile(fsp, startpos, nread) == -1) {
-                                       DEBUG(0,("send_file_readbraw: fake_sendfile failed for file %s (%s).\n",
-                                               fsp->fsp_name, strerror(errno) ));
+                                       DEBUG(0,("send_file_readbraw: "
+                                                "fake_sendfile failed for "
+                                                "file %s (%s).\n",
+                                                fsp_str_dbg(fsp),
+                                                strerror(errno)));
                                        exit_server_cleanly("send_file_readbraw fake_sendfile failed");
                                }
                                return;
                        }
 
-                       DEBUG(0,("send_file_readbraw: sendfile failed for file %s (%s). Terminating\n",
-                               fsp->fsp_name, strerror(errno) ));
+                       DEBUG(0,("send_file_readbraw: sendfile failed for "
+                                "file %s (%s). Terminating\n",
+                                fsp_str_dbg(fsp), strerror(errno)));
                        exit_server_cleanly("send_file_readbraw sendfile failed");
                } else if (sendfile_read == 0) {
                        /*
@@ -2995,7 +2991,7 @@ static void send_file_readbraw(connection_struct *conn,
                         */
                        DEBUG(3, ("send_file_readbraw: sendfile sent zero "
                                  "bytes falling back to the normal read: "
-                                 "%s\n", fsp->fsp_name));
+                                 "%s\n", fsp_str_dbg(fsp)));
                        goto normal_readbraw;
                }
 
@@ -3507,8 +3503,11 @@ static void send_file_readX(connection_struct *conn, struct smb_request *req,
                                nread = fake_sendfile(fsp, startpos,
                                                      smb_maxcnt);
                                if (nread == -1) {
-                                       DEBUG(0,("send_file_readX: fake_sendfile failed for file %s (%s).\n",
-                                               fsp->fsp_name, strerror(errno) ));
+                                       DEBUG(0,("send_file_readX: "
+                                                "fake_sendfile failed for "
+                                                "file %s (%s).\n",
+                                                fsp_str_dbg(fsp),
+                                                strerror(errno)));
                                        exit_server_cleanly("send_file_readX: fake_sendfile failed");
                                }
                                DEBUG( 3, ( "send_file_readX: fake_sendfile fnum=%d max=%d nread=%d\n",
@@ -3517,8 +3516,9 @@ static void send_file_readX(connection_struct *conn, struct smb_request *req,
                                goto strict_unlock;
                        }
 
-                       DEBUG(0,("send_file_readX: sendfile failed for file %s (%s). Terminating\n",
-                               fsp->fsp_name, strerror(errno) ));
+                       DEBUG(0,("send_file_readX: sendfile failed for file "
+                                "%s (%s). Terminating\n", fsp_str_dbg(fsp),
+                                strerror(errno)));
                        exit_server_cleanly("send_file_readX sendfile failed");
                } else if (nread == 0) {
                        /*
@@ -3530,7 +3530,7 @@ static void send_file_readX(connection_struct *conn, struct smb_request *req,
                         */
                        DEBUG(3, ("send_file_readX: sendfile sent zero bytes "
                                  "falling back to the normal read: %s\n",
-                                 fsp->fsp_name));
+                                 fsp_str_dbg(fsp)));
                        goto normal_read;
                }
 
@@ -3560,14 +3560,16 @@ normal_read:
                /* Send out the header. */
                if (write_data(smbd_server_fd(), (char *)headerbuf,
                               sizeof(headerbuf)) != sizeof(headerbuf)) {
-                       DEBUG(0,("send_file_readX: write_data failed for file %s (%s). Terminating\n",
-                               fsp->fsp_name, strerror(errno) ));
+                       DEBUG(0,("send_file_readX: write_data failed for file "
+                                "%s (%s). Terminating\n", fsp_str_dbg(fsp),
+                                strerror(errno)));
                        exit_server_cleanly("send_file_readX sendfile failed");
                }
                nread = fake_sendfile(fsp, startpos, smb_maxcnt);
                if (nread == -1) {
-                       DEBUG(0,("send_file_readX: fake_sendfile failed for file %s (%s).\n",
-                               fsp->fsp_name, strerror(errno) ));
+                       DEBUG(0,("send_file_readX: fake_sendfile failed for "
+                                "file %s (%s).\n", fsp_str_dbg(fsp),
+                                strerror(errno)));
                        exit_server_cleanly("send_file_readX: fake_sendfile failed");
                }
                goto strict_unlock;
@@ -3914,7 +3916,7 @@ void reply_writebraw(struct smb_request *req)
        status = sync_file(conn, fsp, write_through);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(5,("reply_writebraw: sync_file for %s returned %s\n",
-                       fsp->fsp_name, nt_errstr(status) ));
+                        fsp_str_dbg(fsp), nt_errstr(status)));
                reply_nterror(req, status);
                error_to_writebrawerr(req);
                goto strict_unlock;
@@ -4024,7 +4026,7 @@ void reply_writeunlock(struct smb_request *req)
        status = sync_file(conn, fsp, False /* write through */);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(5,("reply_writeunlock: sync_file for %s returned %s\n",
-                       fsp->fsp_name, nt_errstr(status) ));
+                        fsp_str_dbg(fsp), nt_errstr(status)));
                reply_nterror(req, status);
                goto strict_unlock;
        }
@@ -4158,7 +4160,7 @@ void reply_write(struct smb_request *req)
        status = sync_file(conn, fsp, False);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(5,("reply_write: sync_file for %s returned %s\n",
-                       fsp->fsp_name, nt_errstr(status) ));
+                        fsp_str_dbg(fsp), nt_errstr(status)));
                reply_nterror(req, status);
                goto strict_unlock;
        }
@@ -4441,7 +4443,7 @@ void reply_write_and_X(struct smb_request *req)
        status = sync_file(conn, fsp, write_through);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(5,("reply_write_and_X: sync_file for %s returned %s\n",
-                       fsp->fsp_name, nt_errstr(status) ));
+                        fsp_str_dbg(fsp), nt_errstr(status)));
                reply_nterror(req, status);
                goto strict_unlock;
        }
@@ -4577,7 +4579,7 @@ void reply_flush(struct smb_request *req)
                NTSTATUS status = sync_file(conn, fsp, True);
                if (!NT_STATUS_IS_OK(status)) {
                        DEBUG(5,("reply_flush: sync_file for %s returned %s\n",
-                               fsp->fsp_name, nt_errstr(status) ));
+                               fsp_str_dbg(fsp), nt_errstr(status)));
                        reply_nterror(req, status);
                        END_PROFILE(SMBflush);
                        return;
@@ -4745,8 +4747,8 @@ void reply_writeclose(struct smb_request *req)
         */
 
        if (numtowrite) {
-               DEBUG(3,("reply_writeclose: zero length write doesn't close file %s\n",
-                       fsp->fsp_name ));
+               DEBUG(3,("reply_writeclose: zero length write doesn't close "
+                        "file %s\n", fsp_str_dbg(fsp)));
                close_status = close_file(req, fsp, NORMAL_CLOSE);
        }
 
@@ -5743,7 +5745,6 @@ static void rename_open_files(connection_struct *conn,
 {
        files_struct *fsp;
        bool did_rename = False;
-       char *fname_dst = NULL;
        NTSTATUS status;
 
        for(fsp = file_find_di_first(lck->id); fsp;
@@ -5757,17 +5758,13 @@ static void rename_open_files(connection_struct *conn,
                }
                DEBUG(10, ("rename_open_files: renaming file fnum %d "
                           "(file_id %s) from %s -> %s\n", fsp->fnum,
-                          file_id_string_tos(&fsp->file_id), fsp->fsp_name,
+                          file_id_string_tos(&fsp->file_id), fsp_str_dbg(fsp),
                           smb_fname_str_dbg(smb_fname_dst)));
 
-               status = get_full_smb_filename(talloc_tos(), smb_fname_dst,
-                                              &fname_dst);
-               if (!NT_STATUS_IS_OK(status)) {
-                       return;
+               status = fsp_set_smb_fname(fsp, smb_fname_dst);
+               if (NT_STATUS_IS_OK(status)) {
+                       did_rename = True;
                }
-               string_set(&fsp->fsp_name, fname_dst);
-               did_rename = True;
-               TALLOC_FREE(fname_dst);
        }
 
        if (!did_rename) {
@@ -5899,17 +5896,12 @@ NTSTATUS rename_internals_fsp(connection_struct *conn,
        }
 
        /* Make a copy of the src and dst smb_fname structs */
-       status = copy_smb_filename(ctx, smb_fname_dst_in, &smb_fname_dst);
+       status = copy_smb_filename(ctx, fsp->fsp_name, &smb_fname_src);
        if (!NT_STATUS_IS_OK(status)) {
                goto out;
        }
 
-       /*
-        * This will be replaced with copy_smb_filename() when fsp->fsp_name
-        * is converted to store an smb_filename struct.
-        */
-       status = create_synthetic_smb_fname_split(ctx, fsp->fsp_name, NULL,
-                                                 &smb_fname_src);
+       status = copy_smb_filename(ctx, smb_fname_dst_in, &smb_fname_dst);
        if (!NT_STATUS_IS_OK(status)) {
                goto out;
        }
@@ -7273,7 +7265,7 @@ NTSTATUS smbd_do_locking(struct smb_request *req,
                          (double)e->offset,
                          (double)e->count,
                          (unsigned int)e->smbpid,
-                         fsp->fsp_name));
+                         fsp_str_dbg(fsp)));
 
                if (e->brltype != UNLOCK_LOCK) {
                        /* this can only happen with SMB2 */
@@ -7312,7 +7304,7 @@ NTSTATUS smbd_do_locking(struct smb_request *req,
                          (double)e->offset,
                          (double)e->count,
                          (unsigned int)e->smbpid,
-                         fsp->fsp_name,
+                         fsp_str_dbg(fsp),
                          (int)timeout));
 
                if (type & LOCKING_ANDX_CANCEL_LOCK) {
@@ -7528,7 +7520,8 @@ void reply_lockingX(struct smb_request *req)
                        DEBUG(5,("reply_lockingX: Error : oplock break from "
                                 "client for fnum = %d (oplock=%d) and no "
                                 "oplock granted on this file (%s).\n",
-                                fsp->fnum, fsp->oplock_type, fsp->fsp_name));
+                                fsp->fnum, fsp->oplock_type,
+                                fsp_str_dbg(fsp)));
 
                        /* if this is a pure oplock break request then don't
                         * send a reply */
@@ -7551,7 +7544,7 @@ void reply_lockingX(struct smb_request *req)
 
                if (!result) {
                        DEBUG(0, ("reply_lockingX: error in removing "
-                                 "oplock on file %s\n", fsp->fsp_name));
+                                 "oplock on file %s\n", fsp_str_dbg(fsp)));
                        /* Hmmm. Is this panic justified? */
                        smb_panic("internal tdb error");
                }
@@ -7708,7 +7701,6 @@ void reply_readbs(struct smb_request *req)
 void reply_setattrE(struct smb_request *req)
 {
        connection_struct *conn = req->conn;
-       struct smb_filename *smb_fname = NULL;
        struct smb_file_time ft;
        files_struct *fsp;
        NTSTATUS status;
@@ -7728,14 +7720,6 @@ void reply_setattrE(struct smb_request *req)
                goto out;
        }
 
-       /* XXX: Remove when fsp->fsp_name is converted to smb_filename. */
-       status = create_synthetic_smb_fname_split(talloc_tos(), fsp->fsp_name,
-                                                 NULL, &smb_fname);
-       if (!NT_STATUS_IS_OK(status)) {
-               reply_nterror(req, status);
-               goto out;
-       }
-
        /*
         * Convert the DOS times into unix times.
         */
@@ -7756,7 +7740,7 @@ void reply_setattrE(struct smb_request *req)
 
        /* Ensure we have a valid stat struct for the source. */
        if (fsp->fh->fd != -1) {
-               if (SMB_VFS_FSTAT(fsp, &smb_fname->st) == -1) {
+               if (SMB_VFS_FSTAT(fsp, &fsp->fsp_name->st) == -1) {
                        status = map_nt_error_from_unix(errno);
                        reply_nterror(req, status);
                        goto out;
@@ -7765,9 +7749,9 @@ void reply_setattrE(struct smb_request *req)
                int ret = -1;
 
                if (fsp->posix_open) {
-                       ret = SMB_VFS_LSTAT(conn, smb_fname);
+                       ret = SMB_VFS_LSTAT(conn, fsp->fsp_name);
                } else {
-                       ret = SMB_VFS_STAT(conn, smb_fname);
+                       ret = SMB_VFS_STAT(conn, fsp->fsp_name);
                }
                if (ret == -1) {
                        status = map_nt_error_from_unix(errno);
@@ -7776,7 +7760,7 @@ void reply_setattrE(struct smb_request *req)
                }
        }
 
-       status = smb_set_file_time(conn, fsp, smb_fname, &ft, true);
+       status = smb_set_file_time(conn, fsp, fsp->fsp_name, &ft, true);
        if (!NT_STATUS_IS_OK(status)) {
                reply_doserror(req, ERRDOS, ERRnoaccess);
                goto out;
@@ -7836,8 +7820,6 @@ void reply_getattrE(struct smb_request *req)
        int mode;
        files_struct *fsp;
        struct timespec create_ts;
-       struct smb_filename *smb_fname = NULL;
-       NTSTATUS status;
 
        START_PROFILE(SMBgetattrE);
 
@@ -7862,16 +7844,9 @@ void reply_getattrE(struct smb_request *req)
                return;
        }
 
-       status = create_synthetic_smb_fname_split(talloc_tos(), fsp->fsp_name,
-                                                 &sbuf, &smb_fname);
-       if (!NT_STATUS_IS_OK(status)) {
-               reply_nterror(req, status);
-               END_PROFILE(SMBgetattrE);
-               return;
-       }
+       fsp->fsp_name->st = sbuf;
 
-       mode = dos_mode(conn, smb_fname);
-       TALLOC_FREE(smb_fname);
+       mode = dos_mode(conn, fsp->fsp_name);
 
        /*
         * Convert the times into dos times. Set create
index a46b36e2bbbd199368c1941d6602e0b96054adbe..acb5da775133076b21edc7765bdae206301865b4 100644 (file)
@@ -121,7 +121,7 @@ static NTSTATUS smbd_smb2_close(struct smbd_smb2_request *req,
        status = close_file(smbreq, fsp, NORMAL_CLOSE);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(5,("smbd_smb2_close: close_file[%s]: %s\n",
-                       fsp->fsp_name, nt_errstr(status)));
+                        fsp_str_dbg(fsp), nt_errstr(status)));
                return status;
        }
 
index bdff1939e5f7447e86b0456ad9bfed334acf5a05..7337a345fd6a8ce807daef2a17eabeed4abc22f0 100644 (file)
@@ -259,7 +259,6 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
        files_struct *result;
        int info;
        SMB_STRUCT_STAT sbuf;
-       struct smb_filename *smb_fname = NULL;
 
        req = tevent_req_create(mem_ctx, &state,
                                struct smbd_smb2_create_state);
@@ -316,6 +315,8 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
                }
                info = FILE_WAS_CREATED;
        } else {
+               struct smb_filename *smb_fname = NULL;
+
                /* these are ignored for SMB2 */
                in_create_options &= ~(0x10);/* NTCREATEX_OPTIONS_SYNC_ALERT */
                in_create_options &= ~(0x20);/* NTCREATEX_OPTIONS_ASYNC_ALERT */
@@ -328,6 +329,7 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
                                        NULL);
                if (!NT_STATUS_IS_OK(status)) {
                        tevent_req_nterror(req, status);
+                       TALLOC_FREE(smb_fname);
                        goto out;
                }
 
@@ -348,19 +350,11 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
                                             &info);
                if (!NT_STATUS_IS_OK(status)) {
                        tevent_req_nterror(req, status);
+                       TALLOC_FREE(smb_fname);
                        goto out;
                }
                sbuf = smb_fname->st;
-       }
-
-       if (!smb_fname) {
-               status = create_synthetic_smb_fname_split(talloc_tos(),
-                                                         result->fsp_name,
-                                                         &sbuf, &smb_fname);
-               if (!NT_STATUS_IS_OK(status)) {
-                       tevent_req_nterror(req, status);
-                       goto out;
-               }
+               TALLOC_FREE(smb_fname);
        }
 
        smb2req->compat_chain_fsp = smbreq->chain_fsp;
@@ -379,7 +373,7 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
        state->out_allocation_size      = sbuf.st_ex_blksize * sbuf.st_ex_blocks;
        state->out_end_of_file          = sbuf.st_ex_size;
        state->out_file_attributes      = dos_mode(result->conn,
-                                                  smb_fname);
+                                                  result->fsp_name);
        if (state->out_file_attributes == 0) {
                state->out_file_attributes = FILE_ATTRIBUTE_NORMAL;
        }
@@ -387,7 +381,6 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX *mem_ctx,
 
        tevent_req_done(req);
  out:
-       TALLOC_FREE(smb_fname);
        return tevent_req_post(req, ev);
 }
 
index 8ce683923b570a8daaaa9be29b538c867b12404d..1d3ae2eb06b3484e4ee85e277bf03844be1afff0 100644 (file)
@@ -176,7 +176,7 @@ static struct tevent_req *smbd_smb2_flush_send(TALLOC_CTX *mem_ctx,
        status = sync_file(smbreq->conn, fsp, true);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(5,("smbd_smb2_flush: sync_file for %s returned %s\n",
-                       fsp->fsp_name, nt_errstr(status)));
+                        fsp_str_dbg(fsp), nt_errstr(status)));
                tevent_req_nterror(req, status);
                return tevent_req_post(req, ev);
        }
index f8c2d41e3100b337fc3aae93a339d7ba4ed896db..dda79c209f329549e0132d17bf0a704174dd8030 100644 (file)
@@ -244,7 +244,6 @@ static struct tevent_req *smbd_smb2_getinfo_send(TALLOC_CTX *mem_ctx,
                uint16_t file_info_level;
                char *data = NULL;
                unsigned int data_size = 0;
-               struct smb_filename *smb_fname = NULL;
                bool delete_pending = false;
                struct timespec write_time_ts;
                struct file_id fileid;
@@ -271,15 +270,6 @@ static struct tevent_req *smbd_smb2_getinfo_send(TALLOC_CTX *mem_ctx,
                        break;
                }
 
-               status = create_synthetic_smb_fname_split(state,
-                                                         fsp->fsp_name,
-                                                         NULL,
-                                                         &smb_fname);
-               if (!NT_STATUS_IS_OK(status)) {
-                       tevent_req_nterror(req, status);
-                       return tevent_req_post(req, ev);
-               }
-
                if (fsp->fake_file_handle) {
                        /*
                         * This is actually for the QUOTA_FAKE_FILE --metze
@@ -296,34 +286,34 @@ static struct tevent_req *smbd_smb2_getinfo_send(TALLOC_CTX *mem_ctx,
 
                        if (INFO_LEVEL_IS_UNIX(file_info_level)) {
                                /* Always do lstat for UNIX calls. */
-                               if (SMB_VFS_LSTAT(conn, smb_fname)) {
+                               if (SMB_VFS_LSTAT(conn, fsp->fsp_name)) {
                                        DEBUG(3,("smbd_smb2_getinfo_send: "
                                                 "SMB_VFS_LSTAT of %s failed "
-                                                "(%s)\n",
-                                                smb_fname_str_dbg(smb_fname),
+                                                "(%s)\n", fsp_str_dbg(fsp),
                                                 strerror(errno)));
                                        status = map_nt_error_from_unix(errno);
                                        tevent_req_nterror(req, status);
                                        return tevent_req_post(req, ev);
                                }
-                       } else if (SMB_VFS_STAT(conn, smb_fname)) {
+                       } else if (SMB_VFS_STAT(conn, fsp->fsp_name)) {
                                DEBUG(3,("smbd_smb2_getinfo_send: "
                                         "SMB_VFS_STAT of %s failed (%s)\n",
-                                        smb_fname_str_dbg(smb_fname),
+                                        fsp_str_dbg(fsp),
                                         strerror(errno)));
                                status = map_nt_error_from_unix(errno);
                                tevent_req_nterror(req, status);
                                return tevent_req_post(req, ev);
                        }
 
-                       fileid = vfs_file_id_from_sbuf(conn, &smb_fname->st);
+                       fileid = vfs_file_id_from_sbuf(conn,
+                                                      &fsp->fsp_name->st);
                        get_file_infos(fileid, &delete_pending, &write_time_ts);
                } else {
                        /*
                         * Original code - this is an open file.
                         */
 
-                       if (SMB_VFS_FSTAT(fsp, &smb_fname->st) != 0) {
+                       if (SMB_VFS_FSTAT(fsp, &fsp->fsp_name->st) != 0) {
                                DEBUG(3, ("smbd_smb2_getinfo_send: "
                                          "fstat of fnum %d failed (%s)\n",
                                          fsp->fnum, strerror(errno)));
@@ -331,14 +321,15 @@ static struct tevent_req *smbd_smb2_getinfo_send(TALLOC_CTX *mem_ctx,
                                tevent_req_nterror(req, status);
                                return tevent_req_post(req, ev);
                        }
-                       fileid = vfs_file_id_from_sbuf(conn, &smb_fname->st);
+                       fileid = vfs_file_id_from_sbuf(conn,
+                                                      &fsp->fsp_name->st);
                        get_file_infos(fileid, &delete_pending, &write_time_ts);
                }
 
                status = smbd_do_qfilepathinfo(conn, state,
                                               file_info_level,
                                               fsp,
-                                              smb_fname,
+                                              fsp->fsp_name,
                                               delete_pending,
                                               write_time_ts,
                                               ms_dfs_link,
index 7ab93ce574b368657f89043432cb19e8c7223d6f..f6d83aeeed921b2b6ef55c1dc64aa516cf66b660 100644 (file)
@@ -231,7 +231,7 @@ static struct tevent_req *smbd_smb2_notify_send(TALLOC_CTX *mem_ctx,
 
                DEBUG(3,("smbd_smb2_notify_send: notify change "
                         "called on %s, filter = %s, recursive = %d\n",
-                        fsp->fsp_name, filter_string, recursive));
+                        fsp_str_dbg(fsp), filter_string, recursive));
 
                TALLOC_FREE(filter_string);
        }
index c9f281f73eceeae1efd36ac56810a4e9b5006608..42993511ec56fb01e4b497aac8dcb67b9678dfb8 100644 (file)
@@ -281,13 +281,13 @@ static struct tevent_req *smbd_smb2_read_send(TALLOC_CTX *mem_ctx,
 
        if (nread < 0) {
                DEBUG(5,("smbd_smb2_read: read_file[%s] nread[%lld]\n",
-                       fsp->fsp_name, (long long)nread));
+                        fsp_str_dbg(fsp), (long long)nread));
                tevent_req_nterror(req, NT_STATUS_ACCESS_DENIED);
                return tevent_req_post(req, ev);
        }
        if (nread == 0 && in_length != 0) {
                DEBUG(5,("smbd_smb2_read: read_file[%s] end of file\n",
-                       fsp->fsp_name));
+                        fsp_str_dbg(fsp)));
                tevent_req_nterror(req, NT_STATUS_END_OF_FILE);
                return tevent_req_post(req, ev);
        }
index 2974695c9f8abf973e678a91507e8dffc14a3a08..08c4a7f5bf8b563e62d410d9ce4fd6f3aba47a7e 100644 (file)
@@ -209,7 +209,6 @@ static struct tevent_req *smbd_smb2_setinfo_send(TALLOC_CTX *mem_ctx,
        case 0x01:/* SMB2_SETINFO_FILE */
        {
                uint16_t file_info_level;
-               struct smb_filename *smb_fname = NULL;
                char *data;
                int data_size;
                int ret_size = 0;
@@ -221,15 +220,6 @@ static struct tevent_req *smbd_smb2_setinfo_send(TALLOC_CTX *mem_ctx,
                        file_info_level = 0xFF00 + in_file_info_class;
                }
 
-               status = create_synthetic_smb_fname_split(state,
-                                                         fsp->fsp_name,
-                                                         NULL,
-                                                         &smb_fname);
-               if (!NT_STATUS_IS_OK(status)) {
-                       tevent_req_nterror(req, status);
-                       return tevent_req_post(req, ev);
-               }
-
                if (fsp->is_directory || fsp->fh->fd == -1) {
                        /*
                         * This is actually a SETFILEINFO on a directory
@@ -238,21 +228,20 @@ static struct tevent_req *smbd_smb2_setinfo_send(TALLOC_CTX *mem_ctx,
                         */
                        if (INFO_LEVEL_IS_UNIX(file_info_level)) {
                                /* Always do lstat for UNIX calls. */
-                               if (SMB_VFS_LSTAT(conn, smb_fname)) {
+                               if (SMB_VFS_LSTAT(conn, fsp->fsp_name)) {
                                        DEBUG(3,("smbd_smb2_setinfo_send: "
                                                 "SMB_VFS_LSTAT of %s failed "
-                                                "(%s)\n",
-                                                smb_fname_str_dbg(smb_fname),
+                                                "(%s)\n", fsp_str_dbg(fsp),
                                                 strerror(errno)));
                                        status = map_nt_error_from_unix(errno);
                                        tevent_req_nterror(req, status);
                                        return tevent_req_post(req, ev);
                                }
                        } else {
-                               if (SMB_VFS_STAT(conn, smb_fname) != 0) {
+                               if (SMB_VFS_STAT(conn, fsp->fsp_name) != 0) {
                                        DEBUG(3,("smbd_smb2_setinfo_send: "
                                                 "fileinfo of %s failed (%s)\n",
-                                                smb_fname_str_dbg(smb_fname),
+                                                fsp_str_dbg(fsp),
                                                 strerror(errno)));
                                        status = map_nt_error_from_unix(errno);
                                        tevent_req_nterror(req, status);
@@ -270,7 +259,7 @@ static struct tevent_req *smbd_smb2_setinfo_send(TALLOC_CTX *mem_ctx,
 
                                DEBUG(3,("smbd_smb2_setinfo_send: "
                                         "Cancelling print job (%s)\n",
-                                        fsp->fsp_name));
+                                        fsp_str_dbg(fsp)));
 
                                tevent_req_done(req);
                                return tevent_req_post(req, ev);
@@ -284,7 +273,7 @@ static struct tevent_req *smbd_smb2_setinfo_send(TALLOC_CTX *mem_ctx,
                         * Original code - this is an open file.
                         */
 
-                       if (SMB_VFS_FSTAT(fsp, &smb_fname->st) != 0) {
+                       if (SMB_VFS_FSTAT(fsp, &fsp->fsp_name->st) != 0) {
                                DEBUG(3,("smbd_smb2_setinfo_send: fstat "
                                         "of fnum %d failed (%s)\n", fsp->fnum,
                                         strerror(errno)));
@@ -307,7 +296,7 @@ static struct tevent_req *smbd_smb2_setinfo_send(TALLOC_CTX *mem_ctx,
                status = smbd_do_setfilepathinfo(conn, smbreq, state,
                                                 file_info_level,
                                                 fsp,
-                                                smb_fname,
+                                                fsp->fsp_name,
                                                 &data,
                                                 data_size,
                                                 &ret_size);
index 31460a01a17e01e3feece1a5bd21b7692231442f..f1606be62354fd9d967af73b1c10972bf7b42424 100644 (file)
@@ -272,14 +272,14 @@ static struct tevent_req *smbd_smb2_write_send(TALLOC_CTX *mem_ctx,
 
        if (((nwritten == 0) && (in_data.length != 0)) || (nwritten < 0)) {
                DEBUG(5,("smbd_smb2_write: write_file[%s] disk full\n",
-                       fsp->fsp_name));
+                        fsp_str_dbg(fsp)));
                SMB_VFS_STRICT_UNLOCK(conn, fsp, &lock);
                tevent_req_nterror(req, NT_STATUS_DISK_FULL);
                return tevent_req_post(req, ev);
        }
 
        DEBUG(3,("smbd_smb2_write: fnum=[%d/%s] length=%d offset=%d wrote=%d\n",
-               fsp->fnum, fsp->fsp_name, (int)in_data.length,
+               fsp->fnum, fsp_str_dbg(fsp), (int)in_data.length,
                (int)in_offset, (int)nwritten));
 
        if (in_flags & 0x00000001) {
@@ -289,7 +289,7 @@ static struct tevent_req *smbd_smb2_write_send(TALLOC_CTX *mem_ctx,
        status = sync_file(conn, fsp, write_through);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(5,("smbd_smb2_write: sync_file for %s returned %s\n",
-                       fsp->fsp_name, nt_errstr(status)));
+                       fsp_str_dbg(fsp), nt_errstr(status)));
                SMB_VFS_STRICT_UNLOCK(conn, fsp, &lock);
                tevent_req_nterror(req, status);
                return tevent_req_post(req, ev);
index 122114c24f68e6b2cbc9b930dc9a3e1d1c668e77..e2efed331d621ec5b8a636811b68adbd4c043896 100644 (file)
@@ -502,8 +502,9 @@ NTSTATUS set_ea(connection_struct *conn, files_struct *fsp,
                if (ea_list->ea.value.length == 0) {
                        /* Remove the attribute. */
                        if (fsp && (fsp->fh->fd != -1)) {
-                               DEBUG(10,("set_ea: deleting ea name %s on file %s by file descriptor.\n",
-                                       unix_ea_name, fsp->fsp_name));
+                               DEBUG(10,("set_ea: deleting ea name %s on "
+                                         "file %s by file descriptor.\n",
+                                         unix_ea_name, fsp_str_dbg(fsp)));
                                ret = SMB_VFS_FREMOVEXATTR(fsp, unix_ea_name);
                        } else {
                                DEBUG(10,("set_ea: deleting ea name %s on file %s.\n",
@@ -520,8 +521,9 @@ NTSTATUS set_ea(connection_struct *conn, files_struct *fsp,
 #endif
                } else {
                        if (fsp && (fsp->fh->fd != -1)) {
-                               DEBUG(10,("set_ea: setting ea name %s on file %s by file descriptor.\n",
-                                       unix_ea_name, fsp->fsp_name));
+                               DEBUG(10,("set_ea: setting ea name %s on file "
+                                         "%s by file descriptor.\n",
+                                         unix_ea_name, fsp_str_dbg(fsp)));
                                ret = SMB_VFS_FSETXATTR(fsp, unix_ea_name,
                                                        ea_list->ea.value.data, ea_list->ea.value.length, 0);
                        } else {
@@ -1148,7 +1150,8 @@ static void call_trans2open(connection_struct *conn,
        SIVAL(params,20,inode);
        SSVAL(params,24,0); /* Padding. */
        if (flags & 8) {
-               uint32 ea_size = estimate_ea_size(conn, fsp, fsp->fsp_name);
+               uint32 ea_size = estimate_ea_size(conn, fsp,
+                                                 fsp->fsp_name->base_name);
                SIVAL(params, 26, ea_size);
        } else {
                SIVAL(params, 26, 0);
@@ -4584,7 +4587,11 @@ NTSTATUS smbd_do_qfilepathinfo(connection_struct *conn,
 
                                if (S_ISDIR(sbuf.st_ex_mode)) {
                                        if (fsp && fsp->is_directory) {
-                                               def_acl = SMB_VFS_SYS_ACL_GET_FILE(conn, fsp->fsp_name, SMB_ACL_TYPE_DEFAULT);
+                                               def_acl =
+                                                   SMB_VFS_SYS_ACL_GET_FILE(
+                                                           conn,
+                                                           fsp->fsp_name->base_name,
+                                                           SMB_ACL_TYPE_DEFAULT);
                                        } else {
                                                def_acl = SMB_VFS_SYS_ACL_GET_FILE(conn, fname, SMB_ACL_TYPE_DEFAULT);
                                        }
@@ -4791,14 +4798,8 @@ static void call_trans2qfilepathinfo(connection_struct *conn,
                        return;
                }
 
-               fname = talloc_strdup(talloc_tos(),fsp->fsp_name);
-               if (!fname) {
-                       reply_nterror(req, NT_STATUS_NO_MEMORY);
-                       return;
-               }
-
-               status = create_synthetic_smb_fname_split(talloc_tos(), fname,
-                                                         NULL, &smb_fname);
+               status = copy_smb_filename(talloc_tos(), fsp->fsp_name,
+                                          &smb_fname);
                if (!NT_STATUS_IS_OK(status)) {
                        reply_nterror(req, status);
                        return;
@@ -5524,8 +5525,9 @@ static NTSTATUS smb_file_position_information(connection_struct *conn,
        }
 #endif /* LARGE_SMB_OFF_T */
 
-       DEBUG(10,("smb_file_position_information: Set file position information for file %s to %.0f\n",
-               fsp->fsp_name, (double)position_information ));
+       DEBUG(10,("smb_file_position_information: Set file position "
+                 "information for file %s to %.0f\n", fsp_str_dbg(fsp),
+                 (double)position_information));
        fsp->fh->position_information = position_information;
        return NT_STATUS_OK;
 }
@@ -5736,8 +5738,8 @@ static NTSTATUS smb_file_rename_information(connection_struct *conn,
 
                /* Create an smb_fname to call rename_internals_fsp() with. */
                status = create_synthetic_smb_fname(talloc_tos(),
-                                                   fsp->base_fsp->fsp_name,
-                                                   newname, NULL, &smb_fname);
+                   fsp->base_fsp->fsp_name->base_name, newname, NULL,
+                   &smb_fname);
                if (!NT_STATUS_IS_OK(status)) {
                        goto out;
                }
@@ -5754,7 +5756,7 @@ static NTSTATUS smb_file_rename_information(connection_struct *conn,
 
                /* Create a char * to call rename_internals() with. */
                base_name = talloc_asprintf(ctx, "%s%s",
-                                          fsp->base_fsp->fsp_name,
+                                          fsp->base_fsp->fsp_name->base_name,
                                           newname);
                if (!base_name) {
                        status = NT_STATUS_NO_MEMORY;
@@ -5811,13 +5813,15 @@ static NTSTATUS smb_file_rename_information(connection_struct *conn,
        }
 
        if (fsp) {
-               DEBUG(10,("smb_file_rename_information: SMB_FILE_RENAME_INFORMATION (fnum %d) %s -> %s\n",
-                       fsp->fnum, fsp->fsp_name, base_name ));
+               DEBUG(10,("smb_file_rename_information: "
+                         "SMB_FILE_RENAME_INFORMATION (fnum %d) %s -> %s\n",
+                         fsp->fnum, fsp_str_dbg(fsp), base_name));
                status = rename_internals_fsp(conn, fsp, smb_fname, 0,
                                              overwrite);
        } else {
-               DEBUG(10,("smb_file_rename_information: SMB_FILE_RENAME_INFORMATION %s -> %s\n",
-                       fname, base_name ));
+               DEBUG(10,("smb_file_rename_information: "
+                         "SMB_FILE_RENAME_INFORMATION %s -> %s\n",
+                         fname, base_name));
                status = rename_internals(ctx, conn, req, fname, base_name, 0,
                                        overwrite, False, dest_has_wcard,
                                        FILE_WRITE_ATTRIBUTES);
@@ -5872,7 +5876,7 @@ static NTSTATUS smb_set_posix_acl(connection_struct *conn,
        }
 
        DEBUG(10,("smb_set_posix_acl: file %s num_file_acls = %u, num_def_acls = %u\n",
-               fname ? fname : fsp->fsp_name,
+               fname ? fname : fsp_str_dbg(fsp),
                (unsigned int)num_file_acls,
                (unsigned int)num_def_acls));
 
@@ -5959,7 +5963,7 @@ static NTSTATUS smb_set_posix_lock(connection_struct *conn,
 
        DEBUG(10,("smb_set_posix_lock: file %s, lock_type = %u,"
                        "lock_pid = %u, count = %.0f, offset = %.0f\n",
-               fsp->fsp_name,
+               fsp_str_dbg(fsp),
                (unsigned int)lock_type,
                (unsigned int)lock_pid,
                (double)count,
@@ -7033,7 +7037,7 @@ static NTSTATUS smb_posix_unlink(connection_struct *conn,
                                  NULL);
        if (lck == NULL) {
                DEBUG(0, ("smb_posix_unlink: Could not get share mode "
-                       "lock for file %s\n", fsp->fsp_name));
+                         "lock for file %s\n", fsp_str_dbg(fsp)));
                close_file(req, fsp, NORMAL_CLOSE);
                return NT_STATUS_INVALID_PARAMETER;
        }
@@ -7370,14 +7374,8 @@ static void call_trans2setfilepathinfo(connection_struct *conn,
                }
                info_level = SVAL(params,2);
 
-               fname = talloc_strdup(talloc_tos(),fsp->fsp_name);
-               if (!fname) {
-                       reply_nterror(req, NT_STATUS_NO_MEMORY);
-                       return;
-               }
-
-               status = create_synthetic_smb_fname_split(talloc_tos(), fname,
-                                                         NULL, &smb_fname);
+               status = copy_smb_filename(talloc_tos(), fsp->fsp_name,
+                                          &smb_fname);
                if (!NT_STATUS_IS_OK(status)) {
                        reply_nterror(req, status);
                        return;
@@ -7417,7 +7415,9 @@ static void call_trans2setfilepathinfo(connection_struct *conn,
                        if ((info_level == SMB_SET_FILE_DISPOSITION_INFO) && CVAL(pdata,0)) {
                                fsp->fh->private_options |= FILE_DELETE_ON_CLOSE;
 
-                               DEBUG(3,("call_trans2setfilepathinfo: Cancelling print job (%s)\n", fsp->fsp_name ));
+                               DEBUG(3,("call_trans2setfilepathinfo: "
+                                        "Cancelling print job (%s)\n",
+                                        fsp_str_dbg(fsp)));
 
                                SSVAL(params,0,0);
                                send_trans2_replies(conn, req, params, 2,
index 2b4124bf7b6030e14f3006d0e1c8a03451825be6..a2e3ec504c2a299e8a1cf7c2954c5aedfbd2d418 100644 (file)
@@ -487,10 +487,12 @@ int vfs_allocate_file_space(files_struct *fsp, uint64_t len)
         * Actually try and commit the space on disk....
         */
 
-       DEBUG(10,("vfs_allocate_file_space: file %s, len %.0f\n", fsp->fsp_name, (double)len ));
+       DEBUG(10,("vfs_allocate_file_space: file %s, len %.0f\n",
+                 fsp_str_dbg(fsp), (double)len));
 
        if (((SMB_OFF_T)len) < 0) {
-               DEBUG(0,("vfs_allocate_file_space: %s negative len requested.\n", fsp->fsp_name ));
+               DEBUG(0,("vfs_allocate_file_space: %s negative len "
+                        "requested.\n", fsp_str_dbg(fsp)));
                errno = EINVAL;
                return -1;
        }
@@ -505,8 +507,9 @@ int vfs_allocate_file_space(files_struct *fsp, uint64_t len)
        if (len < (uint64_t)st.st_ex_size) {
                /* Shrink - use ftruncate. */
 
-               DEBUG(10,("vfs_allocate_file_space: file %s, shrink. Current size %.0f\n",
-                               fsp->fsp_name, (double)st.st_ex_size ));
+               DEBUG(10,("vfs_allocate_file_space: file %s, shrink. Current "
+                         "size %.0f\n", fsp_str_dbg(fsp),
+                         (double)st.st_ex_size));
 
                contend_level2_oplocks_begin(fsp, LEVEL2_CONTEND_ALLOC_SHRINK);
 
@@ -530,13 +533,16 @@ int vfs_allocate_file_space(files_struct *fsp, uint64_t len)
 
        len -= st.st_ex_size;
        len /= 1024; /* Len is now number of 1k blocks needed. */
-       space_avail = get_dfree_info(conn,fsp->fsp_name,False,&bsize,&dfree,&dsize);
+       space_avail = get_dfree_info(conn, fsp->fsp_name->base_name, false,
+                                    &bsize, &dfree, &dsize);
        if (space_avail == (uint64_t)-1) {
                return -1;
        }
 
-       DEBUG(10,("vfs_allocate_file_space: file %s, grow. Current size %.0f, needed blocks = %.0f, space avail = %.0f\n",
-                       fsp->fsp_name, (double)st.st_ex_size, (double)len, (double)space_avail ));
+       DEBUG(10,("vfs_allocate_file_space: file %s, grow. Current size %.0f, "
+                 "needed blocks = %.0f, space avail = %.0f\n",
+                 fsp_str_dbg(fsp), (double)st.st_ex_size, (double)len,
+                 (double)space_avail));
 
        if (len > space_avail) {
                errno = ENOSPC;
@@ -558,14 +564,15 @@ int vfs_set_filelen(files_struct *fsp, SMB_OFF_T len)
 
        contend_level2_oplocks_begin(fsp, LEVEL2_CONTEND_SET_FILE_LEN);
 
-       DEBUG(10,("vfs_set_filelen: ftruncate %s to len %.0f\n", fsp->fsp_name, (double)len));
+       DEBUG(10,("vfs_set_filelen: ftruncate %s to len %.0f\n",
+                 fsp_str_dbg(fsp), (double)len));
        flush_write_cache(fsp, SIZECHANGE_FLUSH);
        if ((ret = SMB_VFS_FTRUNCATE(fsp, len)) != -1) {
                set_filelen_write_cache(fsp, len);
                notify_fname(fsp->conn, NOTIFY_ACTION_MODIFIED,
                             FILE_NOTIFY_CHANGE_SIZE
                             | FILE_NOTIFY_CHANGE_ATTRIBUTES,
-                            fsp->fsp_name);
+                            fsp->fsp_name->base_name);
        }
 
        contend_level2_oplocks_end(fsp, LEVEL2_CONTEND_SET_FILE_LEN);
@@ -600,8 +607,10 @@ int vfs_fill_sparse(files_struct *fsp, SMB_OFF_T len)
                return 0;
        }
 
-       DEBUG(10,("vfs_fill_sparse: write zeros in file %s from len %.0f to len %.0f (%.0f bytes)\n",
-               fsp->fsp_name, (double)st.st_ex_size, (double)len, (double)(len - st.st_ex_size)));
+       DEBUG(10,("vfs_fill_sparse: write zeros in file %s from len %.0f to "
+                 "len %.0f (%.0f bytes)\n", fsp_str_dbg(fsp),
+                 (double)st.st_ex_size, (double)len,
+                 (double)(len - st.st_ex_size)));
 
        contend_level2_oplocks_begin(fsp, LEVEL2_CONTEND_FILL_SPARSE);
 
@@ -625,8 +634,9 @@ int vfs_fill_sparse(files_struct *fsp, SMB_OFF_T len)
 
                pwrite_ret = SMB_VFS_PWRITE(fsp, sparse_buf, curr_write_size, offset + total);
                if (pwrite_ret == -1) {
-                       DEBUG(10,("vfs_fill_sparse: SMB_VFS_PWRITE for file %s failed with error %s\n",
-                               fsp->fsp_name, strerror(errno) ));
+                       DEBUG(10,("vfs_fill_sparse: SMB_VFS_PWRITE for file "
+                                 "%s failed with error %s\n",
+                                 fsp_str_dbg(fsp), strerror(errno)));
                        ret = -1;
                        goto out;
                }