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

Reply via email to