[PATCH] Fix terminate connection behavior for asynchronous endpoint with PUSH notification flavors

Julien Kerihuel j.kerihuel at openchange.org
Mon Mar 30 03:27:09 MDT 2015


Hi Metze,

On 30/03/15 08:05, Stefan (metze) Metzmacher wrote:
> Can you explain how dcerpc_server_asyncemsmdb_unbind() is triggered,
> I can't see it just looking at the capture.
>
> Thanks!
> metze
To trigger it, I am setting the state_flag during the bind operation on
the asyncemsmdb endpoint:

NTSTATUS dcerpc_server_asyncemsmdb_init(void);
NTSTATUS ndr_table_register(const struct ndr_interface_table *);

#define DCESRV_INTERFACE_ASYNCEMSMDB_UNBIND     dcerpc_server_asyncemsmdb_unbind
static NTSTATUS dcerpc_server_asyncemsmdb_unbind(struct dcesrv_connection_context *context, const struct dcesrv_interface *iface)
{
        OC_DEBUG(0, "DISCONNECTION FROM CLIENT\n");
        return NT_STATUS_OK;
}

#define DCESRV_INTERFACE_ASYNCEMSMDB_BIND       dcerpc_server_asyncemsmdb_bind
static NTSTATUS dcerpc_server_asyncemsmdb_bind(struct dcesrv_call_state *dce_call, const struct dcesrv_interface *iface)
{
	dce_call->state_flags |= DCESRV_CALL_STATE_FLAG_SKIP_PENDING_CALL;
	return NT_STATUS_OK;
}


In the dcerpc call of the interface, I'm setting the async flag, use
tevent_add_fd to listen on a custom socket for remote system
notification and only trigger dcesrv_reply call in the callback when
there is something to read:

static void EcDoAsyncWaitEx_handler(
[...]
        status = dcesrv_reply(p->dce_call);
	if (!NT_STATUS_IS_OK(status)) {
                OC_DEBUG(0, "EcDoAsyncWaitEx_handler: dcesrv_reply() failed - %s", nt_errstr(status));
        }
[...]
}

static NTSTATUS dcesrv_EcDoAsyncWaitEx(

[...]
	/* Set the asynchronous dcerpc flag on the connection */
	dce_call->state_flags |= DCESRV_CALL_STATE_FLAG_ASYNC;

[...]
        if (!p->fd_event) {
                p->fd_event = tevent_add_fd(dce_call->event_ctx,
                                            dce_call->event_ctx,
                                            p->fd,
                                            TEVENT_FD_READ,
                                            EcDoAsyncWaitEx_handler,
                                            p);
                if (p->fd_event == NULL) {
                        OC_DEBUG(0, "[asyncemsmdb] unable to subscribe for fd event in event loop");
                        return NT_STATUS_OK;
                }
        }
[...]
	return NT_STATUS_OK;
}


Now, because I call dcesrv_reply() from the callback, it means that I
have an outstanding pending call as long as I didn't receive a
notification on this custom p->fd socket from a remote system.

What is implemented in Samba is correct in all cases with regards to
pending calls except this one. In this case, and without this patch,
this connection is going to be considered broken 100% of the time.
What I want, it for this connection to behave normally upon
disconnection from client (close Outlook) and not be considered as a
broken connection.

Hope it helps getting the full picture.

Cheers,
Julien.

-- 
Julien Kerihuel
j.kerihuel at openchange.org
OpenChange Project Founder

Twitter: http://twitter.com/jkerihuel

GPG Fingerprint: 0B55 783D A781 6329 108A  B609 7EF6 FE11 A35F 1F79


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: OpenPGP digital signature
URL: <http://lists.samba.org/pipermail/samba-technical/attachments/20150330/7ff05c41/attachment.pgp>


More information about the samba-technical mailing list