summaryrefslogtreecommitdiffstats
path: root/sys/netsmb/smb_rq.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/netsmb/smb_rq.c')
-rw-r--r--sys/netsmb/smb_rq.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/sys/netsmb/smb_rq.c b/sys/netsmb/smb_rq.c
index c507cac..03c7eb6 100644
--- a/sys/netsmb/smb_rq.c
+++ b/sys/netsmb/smb_rq.c
@@ -114,6 +114,7 @@ smb_rq_new(struct smb_rq *rqp, u_char cmd)
struct smb_vc *vcp = rqp->sr_vc;
struct mbchain *mbp = &rqp->sr_rq;
int error;
+ u_int16_t flags2;
rqp->sr_sendcnt = 0;
mb_done(mbp);
@@ -125,11 +126,20 @@ smb_rq_new(struct smb_rq *rqp, u_char cmd)
mb_put_uint8(mbp, cmd);
mb_put_uint32le(mbp, 0); /* DosError */
mb_put_uint8(mbp, vcp->vc_hflags);
+ flags2 = vcp->vc_hflags2;
if (cmd == SMB_COM_TRANSACTION || cmd == SMB_COM_TRANSACTION_SECONDARY)
- mb_put_uint16le(mbp, (vcp->vc_hflags2 & ~SMB_FLAGS2_UNICODE));
- else
- mb_put_uint16le(mbp, vcp->vc_hflags2);
- mb_put_mem(mbp, tzero, 12, MB_MSYSTEM);
+ flags2 &= ~SMB_FLAGS2_UNICODE;
+ if (cmd == SMB_COM_NEGOTIATE)
+ flags2 &= ~SMB_FLAGS2_SECURITY_SIGNATURE;
+ mb_put_uint16le(mbp, flags2);
+ if ((flags2 & SMB_FLAGS2_SECURITY_SIGNATURE) == 0) {
+ mb_put_mem(mbp, tzero, 12, MB_MSYSTEM);
+ rqp->sr_rqsig = NULL;
+ } else {
+ mb_put_uint16le(mbp, 0 /*scred->sc_p->p_pid >> 16*/);
+ rqp->sr_rqsig = (u_int8_t *)mb_reserve(mbp, 8);
+ mb_put_uint16le(mbp, 0);
+ }
rqp->sr_rqtid = (u_int16_t*)mb_reserve(mbp, sizeof(u_int16_t));
mb_put_uint16le(mbp, 1 /*scred->sc_p->p_pid & 0xffff*/);
rqp->sr_rquid = (u_int16_t*)mb_reserve(mbp, sizeof(u_int16_t));
@@ -349,6 +359,10 @@ smb_rq_reply(struct smb_rq *rqp)
error = md_get_uint16le(mdp, &rqp->sr_rpuid);
error = md_get_uint16le(mdp, &rqp->sr_rpmid);
+ if (error == 0 &&
+ (rqp->sr_vc->vc_hflags2 & SMB_FLAGS2_SECURITY_SIGNATURE))
+ error = smb_rq_verify(rqp);
+
SMBSDEBUG("M:%04x, P:%04x, U:%04x, T:%04x, E: %d:%d\n",
rqp->sr_rpmid, rqp->sr_rppid, rqp->sr_rpuid, rqp->sr_rptid,
rqp->sr_errclass, rqp->sr_serror);
@@ -575,6 +589,7 @@ smb_t2_request_int(struct smb_t2rq *t2p)
return error;
rqp->sr_flags |= SMBR_MULTIPACKET;
t2p->t2_rq = rqp;
+ rqp->sr_t2 = t2p;
mbp = &rqp->sr_rq;
smb_rq_wstart(rqp);
mb_put_uint16le(mbp, totpcount);
@@ -649,6 +664,7 @@ smb_t2_request_int(struct smb_t2rq *t2p)
if (error)
goto bad;
while (leftpcount || leftdcount) {
+ t2p->t2_flags |= SMBT2_SECONDARY;
error = smb_rq_new(rqp, t2p->t_name ?
SMB_COM_TRANSACTION_SECONDARY : SMB_COM_TRANSACTION2_SECONDARY);
if (error)
OpenPOWER on IntegriCloud