From: Nicolas Saenz Julienne Date: Mon, 29 Jun 2020 15:09:20 +0000 (+0200) Subject: staging: vchiq: Introduce vchiq_validate_params() X-Git-Tag: rel_imx_5.10.35_2.0.0-somdevices.0~1514^2~173 X-Git-Url: https://git.somdevices.com/?a=commitdiff_plain;h=a8f7116b79749ea7f273d7c7e4efcf301a7adfe3;p=linux.git staging: vchiq: Introduce vchiq_validate_params() When adding a new service validate the configuration parameters provided, and remove unnecessary checks in vchi, now that we have validated service's config. Signed-off-by: Nicolas Saenz Julienne Link: https://lore.kernel.org/r/20200629150945.10720-23-nsaenzjulienne@suse.de Signed-off-by: Greg Kroah-Hartman --- diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c index e0027148963e..0a2419bd305b 100644 --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c @@ -2265,6 +2265,16 @@ fail_free_handler_thread: return VCHIQ_ERROR; } +static int vchiq_validate_params(const struct vchiq_service_params *params) +{ + if (!params->callback || !params->fourcc) { + vchiq_loud_error("Can't add service, invalid params\n"); + return -EINVAL; + } + + return 0; +} + /* Called from application thread when a client or server service is created. */ struct vchiq_service * vchiq_add_service_internal(struct vchiq_state *state, @@ -2275,8 +2285,13 @@ vchiq_add_service_internal(struct vchiq_state *state, struct vchiq_service *service; struct vchiq_service __rcu **pservice = NULL; struct vchiq_service_quota *service_quota; + int ret; int i; + ret = vchiq_validate_params(params); + if (ret) + return NULL; + service = kmalloc(sizeof(*service), GFP_KERNEL); if (!service) return service; diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_shim.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_shim.c index b4884d0b82cd..3ce4b7b5d55e 100644 --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_shim.c +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_shim.c @@ -271,15 +271,11 @@ static enum vchiq_status shim_callback(enum vchiq_reason reason, struct vchi_service *service = (struct vchi_service *)VCHIQ_GET_SERVICE_USERDATA(handle); - if (!service->callback) - goto release; - if (reason == VCHIQ_MESSAGE_AVAILABLE) vchiu_queue_push(&service->queue, header); service->callback(service->callback_param, reason, bulk_user); -release: return VCHIQ_SUCCESS; }