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);