From 48a4001152d77ae7c0a61886d961b07e13ec713d Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Thu, 3 Mar 2011 19:59:31 +0000 Subject: [PATCH] [settings] Make fetch_string_setting_copy() easier to use Most callers of functions in the fetch_setting() family treat any errors as meaning "non-existent setting". In the case of fetch_string_setting_copy(), an existent setting can still result in an error due to memory allocation failure. Allow the caller to distinguish between a non-existent setting and an error in allocating memory for the copy, by returning success (and a NULL buffer pointer) for a non-existent setting. Signed-off-by: Michael Brown --- src/core/settings.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/core/settings.c b/src/core/settings.c index 1f22ea45..139addd5 100644 --- a/src/core/settings.c +++ b/src/core/settings.c @@ -625,6 +625,11 @@ int fetch_string_setting ( struct settings *settings, struct setting *setting, * The returned length will be the length of the underlying setting * data. The caller is responsible for eventually freeing the * allocated buffer. + * + * To allow the caller to distinguish between a non-existent setting + * and an error in allocating memory for the copy, this function will + * return success (and a NULL buffer pointer) for a non-existent + * setting. */ int fetch_string_setting_copy ( struct settings *settings, struct setting *setting, @@ -632,16 +637,20 @@ int fetch_string_setting_copy ( struct settings *settings, int len; int check_len = 0; + /* Avoid returning uninitialised data on error */ *data = NULL; + /* Fetch setting length, and return success if non-existent */ len = fetch_setting_len ( settings, setting ); if ( len < 0 ) - return len; + return 0; + /* Allocate string buffer */ *data = malloc ( len + 1 ); if ( ! *data ) return -ENOMEM; + /* Fetch setting */ check_len = fetch_string_setting ( settings, setting, *data, ( len + 1 ) ); assert ( check_len == len );