diff options
Diffstat (limited to 'drivers/acpi/acpica/nsxfeval.c')
| -rw-r--r-- | drivers/acpi/acpica/nsxfeval.c | 79 | 
1 files changed, 59 insertions, 20 deletions
diff --git a/drivers/acpi/acpica/nsxfeval.c b/drivers/acpi/acpica/nsxfeval.c index b38b4b07f86..4bd558bf10d 100644 --- a/drivers/acpi/acpica/nsxfeval.c +++ b/drivers/acpi/acpica/nsxfeval.c @@ -6,7 +6,7 @@   ******************************************************************************/  /* - * Copyright (C) 2000 - 2013, Intel Corp. + * Copyright (C) 2000 - 2014, Intel Corp.   * All rights reserved.   *   * Redistribution and use in source and binary forms, with or without @@ -42,7 +42,8 @@   * POSSIBILITY OF SUCH DAMAGES.   */ -#include <linux/export.h> +#define EXPORT_ACPI_INTERFACES +  #include <acpi/acpi.h>  #include "accommon.h"  #include "acnamesp.h" @@ -83,7 +84,7 @@ acpi_evaluate_object_typed(acpi_handle handle,  			   acpi_object_type return_type)  {  	acpi_status status; -	u8 must_free = FALSE; +	u8 free_buffer_on_error = FALSE;  	ACPI_FUNCTION_TRACE(acpi_evaluate_object_typed); @@ -94,14 +95,13 @@ acpi_evaluate_object_typed(acpi_handle handle,  	}  	if (return_buffer->length == ACPI_ALLOCATE_BUFFER) { -		must_free = TRUE; +		free_buffer_on_error = TRUE;  	}  	/* Evaluate the object */ -	status = -	    acpi_evaluate_object(handle, pathname, external_params, -				 return_buffer); +	status = acpi_evaluate_object(handle, pathname, +				      external_params, return_buffer);  	if (ACPI_FAILURE(status)) {  		return_ACPI_STATUS(status);  	} @@ -134,11 +134,15 @@ acpi_evaluate_object_typed(acpi_handle handle,  					   pointer)->type),  		    acpi_ut_get_type_name(return_type))); -	if (must_free) { - -		/* Caller used ACPI_ALLOCATE_BUFFER, free the return buffer */ - -		ACPI_FREE(return_buffer->pointer); +	if (free_buffer_on_error) { +		/* +		 * Free a buffer created via ACPI_ALLOCATE_BUFFER. +		 * Note: We use acpi_os_free here because acpi_os_allocate was used +		 * to allocate the buffer. This purposefully bypasses the +		 * (optionally enabled) allocation tracking mechanism since we +		 * only want to track internal allocations. +		 */ +		acpi_os_free(return_buffer->pointer);  		return_buffer->pointer = NULL;  	} @@ -441,7 +445,7 @@ acpi_evaluate_object(acpi_handle handle,  		acpi_ex_exit_interpreter();  	} -      cleanup: +cleanup:  	/* Free the input parameter list (if we created one) */ @@ -605,14 +609,22 @@ acpi_walk_namespace(acpi_object_type type,  		goto unlock_and_exit;  	} +	/* Now we can validate the starting node */ + +	if (!acpi_ns_validate_handle(start_object)) { +		status = AE_BAD_PARAMETER; +		goto unlock_and_exit2; +	} +  	status = acpi_ns_walk_namespace(type, start_object, max_depth,  					ACPI_NS_WALK_UNLOCK,  					descending_callback, ascending_callback,  					context, return_value); +unlock_and_exit2:  	(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); -      unlock_and_exit: +unlock_and_exit:  	(void)acpi_ut_release_read_lock(&acpi_gbl_namespace_rw_lock);  	return_ACPI_STATUS(status);  } @@ -856,7 +868,7 @@ acpi_attach_data(acpi_handle obj_handle,  	status = acpi_ns_attach_data(node, handler, data); -      unlock_and_exit: +unlock_and_exit:  	(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);  	return (status);  } @@ -902,7 +914,7 @@ acpi_detach_data(acpi_handle obj_handle, acpi_object_handler handler)  	status = acpi_ns_detach_data(node, handler); -      unlock_and_exit: +unlock_and_exit:  	(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);  	return (status);  } @@ -911,19 +923,22 @@ ACPI_EXPORT_SYMBOL(acpi_detach_data)  /*******************************************************************************   * - * FUNCTION:    acpi_get_data + * FUNCTION:    acpi_get_data_full   *   * PARAMETERS:  obj_handle          - Namespace node   *              handler             - Handler used in call to attach_data   *              data                - Where the data is returned + *              callback            - function to execute before returning   *   * RETURN:      Status   * - * DESCRIPTION: Retrieve data that was previously attached to a namespace node. + * DESCRIPTION: Retrieve data that was previously attached to a namespace node + *              and execute a callback before returning.   *   ******************************************************************************/  acpi_status -acpi_get_data(acpi_handle obj_handle, acpi_object_handler handler, void **data) +acpi_get_data_full(acpi_handle obj_handle, acpi_object_handler handler, +		   void **data, void (*callback)(void *))  {  	struct acpi_namespace_node *node;  	acpi_status status; @@ -948,10 +963,34 @@ acpi_get_data(acpi_handle obj_handle, acpi_object_handler handler, void **data)  	}  	status = acpi_ns_get_attached_data(node, handler, data); +	if (ACPI_SUCCESS(status) && callback) { +		callback(*data); +	} -      unlock_and_exit: +unlock_and_exit:  	(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);  	return (status);  } +ACPI_EXPORT_SYMBOL(acpi_get_data_full) + +/******************************************************************************* + * + * FUNCTION:    acpi_get_data + * + * PARAMETERS:  obj_handle          - Namespace node + *              handler             - Handler used in call to attach_data + *              data                - Where the data is returned + * + * RETURN:      Status + * + * DESCRIPTION: Retrieve data that was previously attached to a namespace node. + * + ******************************************************************************/ +acpi_status +acpi_get_data(acpi_handle obj_handle, acpi_object_handler handler, void **data) +{ +	return acpi_get_data_full(obj_handle, handler, data, NULL); +} +  ACPI_EXPORT_SYMBOL(acpi_get_data)  | 
