diff options
-rw-r--r-- | source3/smbd/oplock.c | 5 | ||||
-rw-r--r-- | source3/smbd/smb2_break.c | 6 |
2 files changed, 10 insertions, 1 deletions
diff --git a/source3/smbd/oplock.c b/source3/smbd/oplock.c index d00bcba32a..1ff1737a3f 100644 --- a/source3/smbd/oplock.c +++ b/source3/smbd/oplock.c @@ -320,7 +320,10 @@ static void oplock_timeout_handler(struct event_context *ctx, TALLOC_FREE(fsp->oplock_timeout); DEBUG(0, ("Oplock break failed for file %s -- replying anyway\n", fsp_str_dbg(fsp))); - global_client_failed_oplock_break = True; + /* Only set this for SMB1.. */ + if (!smbd_server_conn->allow_smb2) { + global_client_failed_oplock_break = True; + } remove_oplock(fsp); reply_to_oplock_break_requests(fsp); } diff --git a/source3/smbd/smb2_break.c b/source3/smbd/smb2_break.c index bd0fc566f0..a214da0f26 100644 --- a/source3/smbd/smb2_break.c +++ b/source3/smbd/smb2_break.c @@ -204,6 +204,12 @@ static struct tevent_req *smbd_smb2_oplock_break_send(TALLOC_CTX *mem_ctx, fsp_str_dbg(fsp), fsp->fnum )); + /* Are we awaiting a break message ? */ + if (fsp->oplock_timeout == NULL) { + tevent_req_nterror(req, NT_STATUS_INVALID_OPLOCK_PROTOCOL); + return tevent_req_post(req, ev); + } + if ((fsp->sent_oplock_break == BREAK_TO_NONE_SENT) || (break_to_none)) { result = remove_oplock(fsp); |