void smb2srv_read_recv(struct smb2srv_request *req) { union smb_read *io; SMB2SRV_CHECK_BODY_SIZE(req, 0x30, True); SMB2SRV_TALLOC_IO_PTR(io, union smb_read); SMB2SRV_SETUP_NTVFS_REQUEST(smb2srv_read_send, NTVFS_ASYNC_STATE_MAY_ASYNC); io->smb2.level = RAW_READ_SMB2; io->smb2.in._pad = SVAL(req->in.body, 0x02); io->smb2.in.length = IVAL(req->in.body, 0x04); io->smb2.in.offset = BVAL(req->in.body, 0x08); io->smb2.in.file.ntvfs = smb2srv_pull_handle(req, req->in.body, 0x10); io->smb2.in.unknown1 = BVAL(req->in.body, 0x20); io->smb2.in.unknown2 = BVAL(req->in.body, 0x28); SMB2SRV_CHECK_FILE_HANDLE(io->smb2.in.file.ntvfs); /* preallocate the buffer for the backends */ io->smb2.out.data = data_blob_talloc(io, NULL, io->smb2.in.length); if (io->smb2.out.data.length != io->smb2.in.length) { SMB2SRV_CHECK(NT_STATUS_NO_MEMORY); } SMB2SRV_CALL_NTVFS_BACKEND(ntvfs_read(req->ntvfs, io)); }
void smb2srv_read_recv(struct smb2srv_request *req) { union smb_read *io; SMB2SRV_CHECK_BODY_SIZE(req, 0x30, true); /* MS-SMB2 2.2.19 read must have a single byte of zero */ if (req->in.body_size - req->in.body_fixed < 1) { smb2srv_send_error(req, NT_STATUS_INVALID_PARAMETER); return; } SMB2SRV_TALLOC_IO_PTR(io, union smb_read); SMB2SRV_SETUP_NTVFS_REQUEST(smb2srv_read_send, NTVFS_ASYNC_STATE_MAY_ASYNC); io->smb2.level = RAW_READ_SMB2; io->smb2.in._pad = SVAL(req->in.body, 0x02); io->smb2.in.length = IVAL(req->in.body, 0x04); io->smb2.in.offset = BVAL(req->in.body, 0x08); io->smb2.in.file.ntvfs = smb2srv_pull_handle(req, req->in.body, 0x10); io->smb2.in.min_count = IVAL(req->in.body, 0x20); io->smb2.in.channel = IVAL(req->in.body, 0x24); io->smb2.in.remaining = IVAL(req->in.body, 0x28); io->smb2.in.channel_offset = SVAL(req->in.body, 0x2C); io->smb2.in.channel_length = SVAL(req->in.body, 0x2E); SMB2SRV_CHECK_FILE_HANDLE(io->smb2.in.file.ntvfs); /* preallocate the buffer for the backends */ io->smb2.out.data = data_blob_talloc(io, NULL, io->smb2.in.length); if (io->smb2.out.data.length != io->smb2.in.length) { SMB2SRV_CHECK(NT_STATUS_NO_MEMORY); } SMB2SRV_CALL_NTVFS_BACKEND(ntvfs_read(req->ntvfs, io)); }