X-Git-Url: http://git.samba.org/samba.git/?a=blobdiff_plain;f=source4%2Fntvfs%2Fposix%2Fpvfs_lock.c;fp=source4%2Fntvfs%2Fposix%2Fpvfs_lock.c;h=989e3c56a4fafcdd97791a60d5df618ccedd65c5;hb=10d8f0086ba950de206f74cbdf062caeee913fde;hp=bf17ceb83b5e2a6602da52418e7ae0531c08d1ff;hpb=2da0be9d5e3e7bd91c145031a0bc238a010a9e97;p=bbaumbach%2Fsamba-autobuild%2F.git diff --git a/source4/ntvfs/posix/pvfs_lock.c b/source4/ntvfs/posix/pvfs_lock.c index bf17ceb83b5..989e3c56a4f 100644 --- a/source4/ntvfs/posix/pvfs_lock.c +++ b/source4/ntvfs/posix/pvfs_lock.c @@ -155,6 +155,7 @@ static void pvfs_pending_lock_continue(void *private, enum pvfs_wait_notice reas if (timed_out) { /* no more chances */ pvfs_lock_async_failed(pvfs, req, f, locks, pending->pending_lock, status); + talloc_free(pending); } else { /* we can try again */ DLIST_ADD(f->pending_list, pending); @@ -192,6 +193,7 @@ static void pvfs_pending_lock_continue(void *private, enum pvfs_wait_notice reas pending); if (pending->wait_handle == NULL) { pvfs_lock_async_failed(pvfs, req, f, locks, i, NT_STATUS_NO_MEMORY); + talloc_free(pending); } else { talloc_steal(pending, pending->wait_handle); DLIST_ADD(f->pending_list, pending); @@ -199,6 +201,7 @@ static void pvfs_pending_lock_continue(void *private, enum pvfs_wait_notice reas return; } pvfs_lock_async_failed(pvfs, req, f, locks, i, status); + talloc_free(pending); return; } @@ -208,6 +211,7 @@ static void pvfs_pending_lock_continue(void *private, enum pvfs_wait_notice reas /* we've managed to get all the locks. Tell the client */ req->async_states->status = NT_STATUS_OK; req->async_states->send_fn(req); + talloc_free(pending); } @@ -323,17 +327,20 @@ NTSTATUS pvfs_lock(struct ntvfs_module_context *ntvfs, } if (lck->lockx.in.mode & LOCKING_ANDX_CANCEL_LOCK) { + talloc_free(pending); return pvfs_lock_cancel(pvfs, req, lck, f); } if (lck->lockx.in.mode & LOCKING_ANDX_CHANGE_LOCKTYPE) { /* this seems to not be supported by any windows server, or used by any clients */ + talloc_free(pending); return NT_STATUS_DOS(ERRDOS, ERRnoatomiclocks); } if (lck->lockx.in.mode & LOCKING_ANDX_OPLOCK_RELEASE) { DEBUG(0,("received unexpected oplock break\n")); + talloc_free(pending); return NT_STATUS_NOT_IMPLEMENTED; } @@ -348,6 +355,7 @@ NTSTATUS pvfs_lock(struct ntvfs_module_context *ntvfs, locks[i].offset, locks[i].count); if (!NT_STATUS_IS_OK(status)) { + talloc_free(pending); return status; } f->lock_count--; @@ -375,6 +383,7 @@ NTSTATUS pvfs_lock(struct ntvfs_module_context *ntvfs, pvfs_pending_lock_continue, pending); if (pending->wait_handle == NULL) { + talloc_free(pending); return NT_STATUS_NO_MEMORY; } talloc_steal(pending, pending->wait_handle); @@ -394,10 +403,12 @@ NTSTATUS pvfs_lock(struct ntvfs_module_context *ntvfs, locks[i].count); f->lock_count--; } + talloc_free(pending); return status; } f->lock_count++; } + talloc_free(pending); return NT_STATUS_OK; }