summaryrefslogtreecommitdiff
path: root/source3/locking
diff options
context:
space:
mode:
Diffstat (limited to 'source3/locking')
-rw-r--r--source3/locking/brlock.c2
-rw-r--r--source3/locking/locking.c20
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 {