summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brown2011-03-03 20:59:31 +0100
committerMichael Brown2011-03-03 21:03:08 +0100
commit48a4001152d77ae7c0a61886d961b07e13ec713d (patch)
tree6c58dfd94c1907b01062dab1d4227044af5319cc
parent[settings] Avoid fetch_string_setting_copy() leaving an uninitialised pointer (diff)
downloadipxe-48a4001152d77ae7c0a61886d961b07e13ec713d.tar.gz
ipxe-48a4001152d77ae7c0a61886d961b07e13ec713d.tar.xz
ipxe-48a4001152d77ae7c0a61886d961b07e13ec713d.zip
[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 <mcb30@ipxe.org>
-rw-r--r--src/core/settings.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/core/settings.c b/src/core/settings.c
index 1f22ea45f..139addd52 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 );