diff options
| -rw-r--r-- | source4/nbt_server/register.c | 57 | 
1 files changed, 36 insertions, 21 deletions
diff --git a/source4/nbt_server/register.c b/source4/nbt_server/register.c index b151fd285d..48a6319f6e 100644 --- a/source4/nbt_server/register.c +++ b/source4/nbt_server/register.c @@ -128,26 +128,31 @@ static void nbtd_start_refresh_timer(struct nbtd_iface_name *iname)  			name_refresh_handler, iname);  } +struct nbtd_register_name_state { +	struct nbtd_iface_name *iname; +	struct nbt_name_register_bcast io; +};  /*    a name registration has completed  */ -static void nbtd_register_handler(struct composite_context *creq) +static void nbtd_register_name_handler(struct composite_context *subreq)  { -	struct nbtd_iface_name *iname = talloc_get_type(creq->async.private_data,  -							struct nbtd_iface_name); +	struct nbtd_register_name_state *state = +		talloc_get_type_abort(subreq->async.private_data, +		struct nbtd_register_name_state); +	struct nbtd_iface_name *iname = state->iname;  	NTSTATUS status; -	TALLOC_CTX *tmp_ctx = talloc_new(iname); -	status = nbt_name_register_bcast_recv(creq); +	status = nbt_name_register_bcast_recv(subreq);  	if (NT_STATUS_IS_OK(status)) {  		/* good - nobody complained about our registration */  		iname->nb_flags |= NBT_NM_ACTIVE;  		DEBUG(3,("Registered %s with %s on interface %s\n", -			 nbt_name_string(tmp_ctx, &iname->name),  +			 nbt_name_string(state, &iname->name),  			 iname->iface->ip_address, iname->iface->bcast_address));  		iname->registration_time = timeval_current(); -		talloc_free(tmp_ctx); +		talloc_free(state);  		nbtd_start_refresh_timer(iname);  		return;  	} @@ -156,10 +161,10 @@ static void nbtd_register_handler(struct composite_context *creq)  	iname->nb_flags |= NBT_NM_CONFLICT;  	DEBUG(1,("Error registering %s with %s on interface %s - %s\n", -		 nbt_name_string(tmp_ctx, &iname->name), +		 nbt_name_string(state, &iname->name),  		 iname->iface->ip_address, iname->iface->bcast_address,  		 nt_errstr(status))); -	talloc_free(tmp_ctx); +	talloc_free(state);  } @@ -172,8 +177,8 @@ static void nbtd_register_name_iface(struct nbtd_interface *iface,  {  	struct nbtd_iface_name *iname;  	const char *scope = lpcfg_netbios_scope(iface->nbtsrv->task->lp_ctx); -	struct nbt_name_register_bcast io; -	struct composite_context *creq; +	struct nbtd_register_name_state *state; +	struct composite_context *subreq;  	struct nbtd_server *nbtsrv = iface->nbtsrv;  	iname = talloc(iface, struct nbtd_iface_name); @@ -208,20 +213,30 @@ static void nbtd_register_name_iface(struct nbtd_interface *iface,  		return;  	} +	state = talloc_zero(iname, struct nbtd_register_name_state); +	if (state == NULL) { +		return; +	} + +	state->iname = iname; +  	/* setup a broadcast name registration request */ -	io.in.name            = iname->name; -	io.in.dest_addr       = iface->bcast_address; -	io.in.dest_port       = lpcfg_nbt_port(iface->nbtsrv->task->lp_ctx); -	io.in.address         = iface->ip_address; -	io.in.nb_flags        = nb_flags; -	io.in.ttl             = iname->ttl; +	state->io.in.name      = iname->name; +	state->io.in.dest_addr = iface->bcast_address; +	state->io.in.dest_port = lpcfg_nbt_port(iface->nbtsrv->task->lp_ctx); +	state->io.in.address   = iface->ip_address; +	state->io.in.nb_flags  = nb_flags; +	state->io.in.ttl       = iname->ttl;  	nbtsrv->stats.total_sent++; -	creq = nbt_name_register_bcast_send(iface->nbtsock, &io); -	if (creq == NULL) return; -	creq->async.fn = nbtd_register_handler; -	creq->async.private_data = iname; +	subreq = nbt_name_register_bcast_send(iface->nbtsock, &state->io); +	if (subreq == NULL) { +		return; +	} + +	subreq->async.fn = nbtd_register_name_handler; +	subreq->async.private_data = state;  }  | 
