summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/fs/smbsrv/smb_locking_andx.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/common/fs/smbsrv/smb_locking_andx.c')
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_locking_andx.c74
1 files changed, 9 insertions, 65 deletions
diff --git a/usr/src/uts/common/fs/smbsrv/smb_locking_andx.c b/usr/src/uts/common/fs/smbsrv/smb_locking_andx.c
index b58d3f9f0f..a09d5f80de 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_locking_andx.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_locking_andx.c
@@ -22,6 +22,7 @@
/*
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright 2020 Tintri by DDN, Inc. All rights reserved.
+ * Copyright 2022 RackTop Systems, Inc.
*/
/*
@@ -250,7 +251,6 @@ smb_com_locking_andx(smb_request_t *sr)
DWORD result;
int rc;
uint32_t ltype;
- uint32_t status;
smb_ofile_t *ofile;
uint16_t tmp_pid; /* locking uses 16-bit pids */
uint32_t lrv_tot;
@@ -288,18 +288,16 @@ smb_com_locking_andx(smb_request_t *sr)
ltype = SMB_LOCK_TYPE_READWRITE;
if (lock_type & LOCKING_ANDX_OPLOCK_RELEASE) {
- uint32_t NewLevel;
- if (oplock_level == 0)
- NewLevel = OPLOCK_LEVEL_NONE;
- else
- NewLevel = OPLOCK_LEVEL_TWO;
- status = smb_oplock_ack_break(sr, ofile, &NewLevel);
- if (status == NT_STATUS_OPLOCK_BREAK_IN_PROGRESS) {
- (void) smb_oplock_wait_break(sr, ofile->f_node, 0);
- status = 0;
- }
+ smb1_oplock_ack_break(sr, oplock_level);
if (unlock_num == 0 && lock_num == 0)
return (SDRC_NO_REPLY);
+ /*
+ * Don't allow combining other lock/unlock actions
+ * with an oplock ACK (normally don't get here).
+ */
+ smbsr_error(sr, NT_STATUS_INVALID_PARAMETER,
+ ERRDOS, ERROR_INVALID_PARAMETER);
+ return (SDRC_ERROR);
}
/*
@@ -413,57 +411,3 @@ out:
return (SDRC_ERROR);
return (SDRC_SUCCESS);
}
-
-/*
- * Compose an SMB1 Oplock Break Notification packet, including
- * the SMB1 header and everything, in sr->reply.
- * The caller will send it and free the request.
- */
-void
-smb1_oplock_break_notification(smb_request_t *sr, uint32_t NewLevel)
-{
- smb_ofile_t *ofile = sr->fid_ofile;
- uint16_t fid;
- uint8_t lock_type;
- uint8_t oplock_level;
-
- /*
- * Convert internal level to SMB1
- */
- switch (NewLevel) {
- default:
- ASSERT(0);
- /* FALLTHROUGH */
- case OPLOCK_LEVEL_NONE:
- oplock_level = 0;
- break;
-
- case OPLOCK_LEVEL_TWO:
- oplock_level = 1;
- break;
- }
-
- sr->smb_com = SMB_COM_LOCKING_ANDX;
- sr->smb_tid = ofile->f_tree->t_tid;
- sr->smb_pid = 0xFFFF;
- sr->smb_uid = 0;
- sr->smb_mid = 0xFFFF;
- fid = ofile->f_fid;
- lock_type = LOCKING_ANDX_OPLOCK_RELEASE;
-
- (void) smb_mbc_encodef(
- &sr->reply, "Mb19.wwwwbb3.wbb10.",
- /* "\xffSMB" M */
- sr->smb_com, /* b */
- /* status, flags, signature 19. */
- sr->smb_tid, /* w */
- sr->smb_pid, /* w */
- sr->smb_uid, /* w */
- sr->smb_mid, /* w */
- 8, /* word count b */
- 0xFF, /* AndX cmd b */
- /* AndX reserved, offset 3. */
- fid,
- lock_type,
- oplock_level);
-}