static int vfswrap_getxattrat_state_destructor(
struct vfswrap_getxattrat_state *state)
{
+ /*
+ * This destructor only gets called if the request is still
+ * in flight, which is why we deny it by returning -1. We
+ * also set the req pointer to NULL so the _done function
+ * can detect the caller doesn't want the result anymore.
+ *
+ * Forcing the fsp closed by a SHUTDOWN_CLOSE can cause this.
+ */
+ state->req = NULL;
return -1;
}
TALLOC_FREE(subreq);
SMBPROFILE_BYTES_ASYNC_END(state->profile_bytes);
talloc_set_destructor(state, NULL);
+ if (req == NULL) {
+ /*
+ * We were shutdown closed in flight. No one wants the result,
+ * and state has been reparented to the NULL context, so just
+ * free it so we don't leak memory.
+ */
+ DBG_NOTICE("getxattr request abandoned in flight\n");
+ TALLOC_FREE(state);
+ return;
+ }
if (ret != 0) {
if (ret != EAGAIN) {
tevent_req_error(req, ret);