Module Name: src Committed By: jmcneill Date: Wed Jul 16 23:59:58 UTC 2014
Modified Files: src/sys/external/bsd/vchiq/dist/interface/vchiq_arm: vchiq_kern_lib.c vchiq_shim.c Log Message: >From >https://github.com/raspberrypi/linux/commit/517d5c1c9ceb7bf94c4e56e4fb97758e13f24b3b > Fix for ALSA driver crash > Avoids an issue when closing and opening vchiq where a message can arrive > before service handle has been written To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 \ src/sys/external/bsd/vchiq/dist/interface/vchiq_arm/vchiq_kern_lib.c cvs rdiff -u -r1.3 -r1.4 \ src/sys/external/bsd/vchiq/dist/interface/vchiq_arm/vchiq_shim.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/external/bsd/vchiq/dist/interface/vchiq_arm/vchiq_kern_lib.c diff -u src/sys/external/bsd/vchiq/dist/interface/vchiq_arm/vchiq_kern_lib.c:1.4 src/sys/external/bsd/vchiq/dist/interface/vchiq_arm/vchiq_kern_lib.c:1.5 --- src/sys/external/bsd/vchiq/dist/interface/vchiq_arm/vchiq_kern_lib.c:1.4 Thu Mar 27 23:03:07 2014 +++ src/sys/external/bsd/vchiq/dist/interface/vchiq_arm/vchiq_kern_lib.c Wed Jul 16 23:59:58 2014 @@ -288,12 +288,13 @@ VCHIQ_STATUS_T vchiq_open_service( NULL); if (service) { + *phandle = service->handle; status = vchiq_open_service_internal(service, (uintptr_t)current); - if (status == VCHIQ_SUCCESS) - *phandle = service->handle; - else + if (status != VCHIQ_SUCCESS) { vchiq_remove_service(service->handle); + *phandle = VCHIQ_SERVICE_HANDLE_INVALID; + } } failed: Index: src/sys/external/bsd/vchiq/dist/interface/vchiq_arm/vchiq_shim.c diff -u src/sys/external/bsd/vchiq/dist/interface/vchiq_arm/vchiq_shim.c:1.3 src/sys/external/bsd/vchiq/dist/interface/vchiq_arm/vchiq_shim.c:1.4 --- src/sys/external/bsd/vchiq/dist/interface/vchiq_arm/vchiq_shim.c:1.3 Thu Mar 27 23:03:07 2014 +++ src/sys/external/bsd/vchiq/dist/interface/vchiq_arm/vchiq_shim.c Wed Jul 16 23:59:58 2014 @@ -632,6 +632,9 @@ int32_t vchi_service_open(VCHI_INSTANCE_ { VCHIQ_INSTANCE_T instance = (VCHIQ_INSTANCE_T)instance_handle; SHIM_SERVICE_T *service = service_alloc(instance, setup); + + *handle = (VCHI_SERVICE_HANDLE_T)service; + if (service) { VCHIQ_SERVICE_PARAMS_T params; VCHIQ_STATUS_T status; @@ -648,11 +651,10 @@ int32_t vchi_service_open(VCHI_INSTANCE_ if (status != VCHIQ_SUCCESS) { service_free(service); service = NULL; + *handle = NULL; } } - *handle = (VCHI_SERVICE_HANDLE_T)service; - return (service != NULL) ? 0 : -1; } EXPORT_SYMBOL(vchi_service_open); @@ -663,6 +665,9 @@ int32_t vchi_service_create(VCHI_INSTANC { VCHIQ_INSTANCE_T instance = (VCHIQ_INSTANCE_T)instance_handle; SHIM_SERVICE_T *service = service_alloc(instance, setup); + + *handle = (VCHI_SERVICE_HANDLE_T)service; + if (service) { VCHIQ_SERVICE_PARAMS_T params; VCHIQ_STATUS_T status; @@ -678,11 +683,10 @@ int32_t vchi_service_create(VCHI_INSTANC if (status != VCHIQ_SUCCESS) { service_free(service); service = NULL; + *handle = NULL; } } - *handle = (VCHI_SERVICE_HANDLE_T)service; - return (service != NULL) ? 0 : -1; } EXPORT_SYMBOL(vchi_service_create);