diff options
Diffstat (limited to 'source3/locking')
-rw-r--r-- | source3/locking/brlock.c | 2 | ||||
-rw-r--r-- | source3/locking/locking.c | 20 |
2 files changed, 15 insertions, 7 deletions
diff --git a/source3/locking/brlock.c b/source3/locking/brlock.c index ed1f73df5e..410fb3fc0b 100644 --- a/source3/locking/brlock.c +++ b/source3/locking/brlock.c @@ -367,6 +367,7 @@ BECOMES..... ZERO_STRUCTP(ul_new); ul_new->start = lock->start + lock->size; ul_new->size = ul_curr->start + ul_curr->size - ul_new->start; + ul_new->smbpid = ul_curr->smbpid; /* Add into the dlink list after the ul_curr point - NOT at ulhead. */ DLIST_ADD(ul_curr, ul_new); @@ -638,6 +639,7 @@ struct unlock_list *brl_getlocklist( TALLOC_CTX *ctx, SMB_DEV_T dev, SMB_INO_T i ZERO_STRUCTP(ul_new); ul_new->start = lock->start; ul_new->size = lock->size; + ul_new->smbpid = lock->context.smbpid; DLIST_ADD(ulist, ul_new); } diff --git a/source3/locking/locking.c b/source3/locking/locking.c index b6b34138e3..088693b6d4 100644 --- a/source3/locking/locking.c +++ b/source3/locking/locking.c @@ -37,6 +37,7 @@ #include "includes.h" extern int DEBUGLEVEL; +int global_smbpid; /* the locking database handle */ static TDB_CONTEXT *tdb; @@ -567,7 +568,7 @@ BOOL is_locked(files_struct *fsp,connection_struct *conn, return(False); ret = !brl_locktest(fsp->dev, fsp->inode, - fsp->smbpid, getpid(), conn->cnum, + global_smbpid, getpid(), conn->cnum, offset, count, lock_type); /* @@ -605,7 +606,7 @@ BOOL do_lock(files_struct *fsp,connection_struct *conn, if (OPEN_FSP(fsp) && fsp->can_lock && (fsp->conn == conn)) { ok = brl_lock(fsp->dev, fsp->inode, fsp->fnum, - fsp->smbpid, getpid(), conn->cnum, + global_smbpid, getpid(), conn->cnum, offset, count, lock_type); @@ -625,7 +626,7 @@ BOOL do_lock(files_struct *fsp,connection_struct *conn, * lock entry. */ (void)brl_unlock(fsp->dev, fsp->inode, fsp->fnum, - fsp->smbpid, getpid(), conn->cnum, + global_smbpid, getpid(), conn->cnum, offset, count); } } @@ -674,7 +675,7 @@ BOOL do_unlock(files_struct *fsp,connection_struct *conn, pid = getpid(); ok = brl_unlock(fsp->dev, fsp->inode, fsp->fnum, - fsp->smbpid, pid, conn->cnum, offset, count); + global_smbpid, pid, conn->cnum, offset, count); if (!ok) { DEBUG(10,("do_unlock: returning ERRlock.\n" )); @@ -705,6 +706,7 @@ BOOL do_unlock(files_struct *fsp,connection_struct *conn, ZERO_STRUCTP(ul); ul->start = offset; ul->size = count; + ul->smbpid = global_smbpid; DLIST_ADD(ulist, ul); @@ -770,12 +772,16 @@ void locking_close_file(files_struct *fsp) /* * Now unlock all of them. This will remove the brl entry also - * for each lock. + * for each lock. Note we need to make sure the global_smbpid matches + * the one associated with each lock in case the client plays games + * with smbpids (like smbtorture does :-). */ - for(; ul; ul = ul->next) + for(; ul; ul = ul->next) { + global_smbpid = ul->smbpid; do_unlock(fsp,fsp->conn,ul->size,ul->start,&eclass,&ecode); - + } + talloc_destroy(ul_ctx); } else { |