Browse Source

[settings] Eliminate call to fetchf_named_setting() in expand_settings()

Use parse_setting_name() and fetchf_setting_copy() in
expand_settings(), to eliminate the call to fetchf_named_setting().

This change also eliminates the potentially large stack-allocated
buffer in expand_settings().

Signed-off-by: Michael Brown <mcb30@ipxe.org>
tags/v1.20.1
Michael Brown 11 years ago
parent
commit
129a70631a
1 changed files with 25 additions and 22 deletions
  1. 25
    22
      src/core/settings.c

+ 25
- 22
src/core/settings.c View File

2014
  * eventually free() it.
2014
  * eventually free() it.
2015
  */
2015
  */
2016
 char * expand_settings ( const char *string ) {
2016
 char * expand_settings ( const char *string ) {
2017
+	struct settings *settings;
2018
+	struct setting setting;
2017
 	char *expstr;
2019
 	char *expstr;
2018
 	char *start;
2020
 	char *start;
2019
 	char *end;
2021
 	char *end;
2020
 	char *head;
2022
 	char *head;
2021
 	char *name;
2023
 	char *name;
2022
 	char *tail;
2024
 	char *tail;
2023
-	int setting_len;
2024
-	int new_len;
2025
+	char *value;
2025
 	char *tmp;
2026
 	char *tmp;
2027
+	int new_len;
2028
+	int rc;
2026
 
2029
 
2027
 	/* Obtain temporary modifiable copy of string */
2030
 	/* Obtain temporary modifiable copy of string */
2028
 	expstr = strdup ( string );
2031
 	expstr = strdup ( string );
2052
 		*end = '\0';
2055
 		*end = '\0';
2053
 		tail = ( end + 1 );
2056
 		tail = ( end + 1 );
2054
 
2057
 
2055
-		/* Determine setting length */
2056
-		setting_len = fetchf_named_setting ( name, NULL, 0, NULL, 0 );
2057
-		if ( setting_len < 0 )
2058
-			setting_len = 0; /* Treat error as empty setting */
2059
-
2060
-		/* Read setting into temporary buffer */
2061
-		{
2062
-			char setting_buf[ setting_len + 1 ];
2063
-
2064
-			setting_buf[0] = '\0';
2065
-			fetchf_named_setting ( name, NULL, 0, setting_buf,
2066
-					       sizeof ( setting_buf ) );
2067
-
2068
-			/* Construct expanded string and discard old string */
2069
-			tmp = expstr;
2070
-			new_len = asprintf ( &expstr, "%s%s%s",
2071
-					     head, setting_buf, tail );
2072
-			free ( tmp );
2073
-			if ( new_len < 0 )
2074
-				return NULL;
2058
+		/* Expand setting */
2059
+		if ( ( rc = parse_setting_name ( name, find_child_settings,
2060
+						 &settings,
2061
+						 &setting ) ) != 0 ) {
2062
+			/* Treat invalid setting names as empty */
2063
+			value = NULL;
2064
+		} else {
2065
+			/* Fetch and format setting value.  Ignore
2066
+			 * errors; treat non-existent settings as empty.
2067
+			 */
2068
+			fetchf_setting_copy ( settings, &setting, &value );
2075
 		}
2069
 		}
2070
+
2071
+		/* Construct expanded string and discard old string */
2072
+		tmp = expstr;
2073
+		new_len = asprintf ( &expstr, "%s%s%s",
2074
+				     head, ( value ? value : "" ), tail );
2075
+		free ( value );
2076
+		free ( tmp );
2077
+		if ( new_len < 0 )
2078
+			return NULL;
2076
 	}
2079
 	}
2077
 
2080
 
2078
 	return expstr;
2081
 	return expstr;

Loading…
Cancel
Save