Skip to content

Commit

Permalink
[settings] Make fetch_string_setting_copy() easier to use
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
mcb30 committed Mar 3, 2011
1 parent 09695f7 commit 48a4001
Showing 1 changed file with 10 additions and 1 deletion.
11 changes: 10 additions & 1 deletion src/core/settings.c
Expand Up @@ -625,23 +625,32 @@ 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,
char **data ) {
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 );
Expand Down

0 comments on commit 48a4001

Please sign in to comment.