/* trans2 setfileinfo implementation */ static NTSTATUS trans2_setfileinfo(struct smbsrv_request *req, struct trans_op *op) { struct smb_trans2 *trans = op->trans; union smb_setfileinfo *st; uint16_t level; struct ntvfs_handle *h; /* make sure we got enough parameters */ if (trans->in.params.length < 4) { return NT_STATUS_FOOBAR; } st = talloc(op, union smb_setfileinfo); NT_STATUS_HAVE_NO_MEMORY(st); h = smbsrv_pull_fnum(req, trans->in.params.data, 0); level = SVAL(trans->in.params.data, 2); st->generic.in.file.ntvfs = h; /* work out the backend level - we make it 1-1 in the header */ st->generic.level = (enum smb_setfileinfo_level)level; if (st->generic.level >= RAW_SFILEINFO_GENERIC) { return NT_STATUS_INVALID_LEVEL; } TRANS2_CHECK(trans2_parse_sfileinfo(req, st, &trans->in.data)); op->op_info = st; op->send_fn = trans2_simple_send; SMBSRV_CHECK_FILE_HANDLE_NTSTATUS(st->generic.in.file.ntvfs); return ntvfs_setfileinfo(req->ntvfs, st); }
struct ntvfs_handle *smbsrv_handle_search_by_wire_key(void *private_data, struct ntvfs_request *ntvfs, const DATA_BLOB *key) { struct smbsrv_request *req = talloc_get_type(ntvfs->frontend_data.private_data, struct smbsrv_request); if (key->length != 2) return NULL; return smbsrv_pull_fnum(req, key->data, 0); }
/* parse NTTRANS_CREATE request */ static NTSTATUS nttrans_create(struct smbsrv_request *req, struct nttrans_op *op) { struct smb_nttrans *trans = op->trans; union smb_open *io; uint16_t fname_len; uint32_t sd_length, ea_length; NTSTATUS status; uint8_t *params; enum ndr_err_code ndr_err; if (trans->in.params.length < 54) { return NT_STATUS_INVALID_PARAMETER; } /* parse the request */ io = talloc(op, union smb_open); NT_STATUS_HAVE_NO_MEMORY(io); io->ntcreatex.level = RAW_OPEN_NTTRANS_CREATE; params = trans->in.params.data; io->ntcreatex.in.flags = IVAL(params, 0); io->ntcreatex.in.root_fid.ntvfs = smbsrv_pull_fnum(req, params, 4); io->ntcreatex.in.access_mask = IVAL(params, 8); io->ntcreatex.in.alloc_size = BVAL(params, 12); io->ntcreatex.in.file_attr = IVAL(params, 20); io->ntcreatex.in.share_access = IVAL(params, 24); io->ntcreatex.in.open_disposition = IVAL(params, 28); io->ntcreatex.in.create_options = IVAL(params, 32); sd_length = IVAL(params, 36); ea_length = IVAL(params, 40); fname_len = IVAL(params, 44); io->ntcreatex.in.impersonation = IVAL(params, 48); io->ntcreatex.in.security_flags = CVAL(params, 52); io->ntcreatex.in.sec_desc = NULL; io->ntcreatex.in.ea_list = NULL; io->ntcreatex.in.query_maximal_access = false; io->ntcreatex.in.query_on_disk_id = false; io->ntcreatex.in.private_flags = 0; req_pull_string(&req->in.bufinfo, &io->ntcreatex.in.fname, params + 53, MIN(fname_len+1, trans->in.params.length - 53), STR_NO_RANGE_CHECK | STR_TERMINATE); if (!io->ntcreatex.in.fname) { return NT_STATUS_INVALID_PARAMETER; } if (sd_length > trans->in.data.length || ea_length > trans->in.data.length || (sd_length+ea_length) > trans->in.data.length) { return NT_STATUS_INVALID_PARAMETER; } /* this call has an optional security descriptor */ if (sd_length != 0) { DATA_BLOB blob; blob.data = trans->in.data.data; blob.length = sd_length; io->ntcreatex.in.sec_desc = talloc(io, struct security_descriptor); if (io->ntcreatex.in.sec_desc == NULL) { return NT_STATUS_NO_MEMORY; } ndr_err = ndr_pull_struct_blob(&blob, io, io->ntcreatex.in.sec_desc, (ndr_pull_flags_fn_t)ndr_pull_security_descriptor); if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { return ndr_map_error2ntstatus(ndr_err); } }