1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-10 01:18:15 +03:00

smbd: deal with fsp->aio_requests in close_directory()

Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Stefan Metzmacher <metze@samba.org>
This commit is contained in:
Ralph Boehme 2018-03-21 20:41:44 +01:00
parent 0e1d11eebd
commit 00a26ac985
2 changed files with 33 additions and 0 deletions

View File

@ -1085,6 +1085,31 @@ static NTSTATUS close_directory(struct smb_request *req, files_struct *fsp,
notify_status = NT_STATUS_OK;
}
if (fsp->num_aio_requests != 0) {
if (close_type != SHUTDOWN_CLOSE) {
/*
* We panic here because if we close() the fd while we
* have outstanding async I/O requests, an async IO
* request might use the fd. For directories the fd is
* read-only, so this is not as bad as with files, but
* still, better safe then sorry.
*/
DBG_ERR("fsp->num_aio_requests=%u\n",
fsp->num_aio_requests);
smb_panic("close with outstanding aio requests");
return NT_STATUS_INTERNAL_ERROR;
}
while (fsp->num_aio_requests != 0) {
/*
* The destructor of the req will remove itself from the
* fsp. Don't use TALLOC_FREE here, this will overwrite
* what the destructor just wrote into aio_requests[0].
*/
talloc_free(fsp->aio_requests[0]);
}
}
/*
* NT can set delete_on_close of the last open
* reference to a directory also.

View File

@ -253,6 +253,7 @@ static struct tevent_req *smbd_smb2_query_directory_send(TALLOC_CTX *mem_ctx,
struct tm tm;
char *p;
bool stop = false;
bool ok;
req = tevent_req_create(mem_ctx, &state,
struct smbd_smb2_query_directory_state);
@ -516,6 +517,13 @@ static struct tevent_req *smbd_smb2_query_directory_send(TALLOC_CTX *mem_ctx,
return tevent_req_post(req, ev);
}
ok = aio_add_req_to_fsp(fsp, req);
if (!ok) {
DBG_ERR("Could not add req to fsp\n");
tevent_req_nterror(req, NT_STATUS_INTERNAL_ERROR);
return tevent_req_post(req, ev);
}
return req;
}