mirror of
				https://git.proxmox.com/git/mirror_frr
				synced 2025-10-31 09:04:27 +00:00 
			
		
		
		
	Merge pull request #13757 from cscarpitta/bugfix/fix-fpm-read-crash
zebra: Fix crash when `dplane_fpm_nl` fails to process received routes
This commit is contained in:
		
						commit
						2332ca1d1b
					
				| @ -587,7 +587,8 @@ static void fpm_read(struct event *t) | ||||
| 		switch (hdr->nlmsg_type) { | ||||
| 		case RTM_NEWROUTE: | ||||
| 			ctx = dplane_ctx_alloc(); | ||||
| 			dplane_ctx_set_op(ctx, DPLANE_OP_ROUTE_NOTIFY); | ||||
| 			dplane_ctx_route_init(ctx, DPLANE_OP_ROUTE_NOTIFY, NULL, | ||||
| 					      NULL); | ||||
| 			if (netlink_route_change_read_unicast_internal( | ||||
| 				    hdr, 0, false, ctx) != 1) { | ||||
| 				dplane_ctx_fini(&ctx); | ||||
|  | ||||
| @ -3257,7 +3257,7 @@ int dplane_ctx_route_init_basic(struct zebra_dplane_ctx *ctx, | ||||
| { | ||||
| 	int ret = EINVAL; | ||||
| 
 | ||||
| 	if (!ctx || !re) | ||||
| 	if (!ctx) | ||||
| 		return ret; | ||||
| 
 | ||||
| 	dplane_intf_extra_list_init(&ctx->u.rinfo.intf_extra_list); | ||||
| @ -3265,6 +3265,13 @@ int dplane_ctx_route_init_basic(struct zebra_dplane_ctx *ctx, | ||||
| 	ctx->zd_op = op; | ||||
| 	ctx->zd_status = ZEBRA_DPLANE_REQUEST_SUCCESS; | ||||
| 
 | ||||
| 	/* This function may be called to create/init a dplane context, not
 | ||||
| 	 * necessarily to copy a route object. Let's return if there is no route | ||||
| 	 * object to copy. | ||||
| 	 */ | ||||
| 	if (!re) | ||||
| 		return AOK; | ||||
| 
 | ||||
| 	ctx->u.rinfo.zd_type = re->type; | ||||
| 	ctx->u.rinfo.zd_old_type = re->type; | ||||
| 
 | ||||
| @ -3296,6 +3303,8 @@ int dplane_ctx_route_init_basic(struct zebra_dplane_ctx *ctx, | ||||
| 
 | ||||
| /*
 | ||||
|  * Initialize a context block for a route update from zebra data structs. | ||||
|  * If the `rn` or `re` parameters are NULL, this function only initializes the | ||||
|  * dplane context without copying a route object into it. | ||||
|  */ | ||||
| int dplane_ctx_route_init(struct zebra_dplane_ctx *ctx, enum dplane_op_e op, | ||||
| 			  struct route_node *rn, struct route_entry *re) | ||||
| @ -3312,9 +3321,17 @@ int dplane_ctx_route_init(struct zebra_dplane_ctx *ctx, enum dplane_op_e op, | ||||
| 	const struct interface *ifp; | ||||
| 	struct dplane_intf_extra *if_extra; | ||||
| 
 | ||||
| 	if (!ctx || !rn || !re) | ||||
| 	if (!ctx) | ||||
| 		return ret; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Initialize the dplane context and return, if there is no route | ||||
| 	 * object to copy | ||||
| 	 */ | ||||
| 	if (!re || !rn) | ||||
| 		return dplane_ctx_route_init_basic(ctx, op, NULL, NULL, NULL, | ||||
| 						   AFI_UNSPEC, SAFI_UNSPEC); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * Let's grab the data from the route_node | ||||
| 	 * so that we can call a helper function | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Mark Stapp
						Mark Stapp