files_struct *result;
int info;
SMB_STRUCT_STAT sbuf;
+ struct smb_filename *smb_fname = NULL;
req = tevent_req_create(mem_ctx, &state,
struct smbd_smb2_create_state);
smbreq = smbd_smb2_fake_smb_request(smb2req);
if (tevent_req_nomem(smbreq, req)) {
- return tevent_req_post(req, ev);
+ goto out;
}
if (IS_IPC(smbreq->conn)) {
if (!lp_nt_pipe_support()) {
tevent_req_nterror(req, NT_STATUS_ACCESS_DENIED);
- return tevent_req_post(req, ev);
+ goto out;
}
/* Strip \\ off the name. */
status = open_np_file(smbreq, pipe_name, &result);
if (!NT_STATUS_IS_OK(status)) {
tevent_req_nterror(req, status);
- return tevent_req_post(req, ev);
+ goto out;
}
info = FILE_WAS_OPENED;
ZERO_STRUCT(sbuf);
status = file_new(smbreq, smbreq->conn, &result);
if(!NT_STATUS_IS_OK(status)) {
tevent_req_nterror(req, status);
- return tevent_req_post(req, ev);
+ goto out;
}
status = print_fsp_open(smbreq,
if (!NT_STATUS_IS_OK(status)) {
file_free(smbreq, result);
tevent_req_nterror(req, status);
- return tevent_req_post(req, ev);
+ goto out;
}
info = FILE_WAS_CREATED;
} else {
+ char *fname = NULL;
+
/* these are ignored for SMB2 */
in_create_options &= ~(0x10);/* NTCREATEX_OPTIONS_SYNC_ALERT */
in_create_options &= ~(0x20);/* NTCREATEX_OPTIONS_ASYNC_ALERT */
+ status = unix_convert(talloc_tos(), smbreq->conn, in_name,
+ &smb_fname, 0);
+ if (!NT_STATUS_IS_OK(status)) {
+ goto out;
+ }
+
+ status = get_full_smb_filename(talloc_tos(), smb_fname, &fname);
+ if (!NT_STATUS_IS_OK(status)) {
+ goto out;
+ }
+
status = SMB_VFS_CREATE_FILE(smbreq->conn,
smbreq,
0, /* root_dir_fid */
- in_name,
- CFF_DOS_PATH, /* create_file_flags */
+ fname,
+ 0, /* create_file_flags */
in_desired_access,
in_share_access,
in_create_disposition,
NULL, /* ea_list */
&result,
&info,
- &sbuf);
+ &smb_fname->st);
if (!NT_STATUS_IS_OK(status)) {
tevent_req_nterror(req, status);
- return tevent_req_post(req, ev);
+ goto out;
}
+ sbuf = smb_fname->st;
}
smb2req->compat_chain_fsp = smbreq->chain_fsp;
state->out_file_id_volatile = result->fnum;
tevent_req_done(req);
+ out:
+ TALLOC_FREE(smb_fname);
return tevent_req_post(req, ev);
}