diff options
| author | Michael Brown | 2011-03-03 20:59:31 +0100 |
|---|---|---|
| committer | Michael Brown | 2011-03-03 21:03:08 +0100 |
| commit | 48a4001152d77ae7c0a61886d961b07e13ec713d (patch) | |
| tree | 6c58dfd94c1907b01062dab1d4227044af5319cc | |
| parent | [settings] Avoid fetch_string_setting_copy() leaving an uninitialised pointer (diff) | |
| download | ipxe-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.c | 11 |
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 ); |
