ini_handler() lowercases four strings when CONFIG_INI_CASE_INSENSITIVE
is set, each with a hand-rolled loop whose strlen() in the condition
makes it quadratic in the string length.

Replace each loop with strlower() and fold the #ifdef pair into a
runtime IS_ENABLED() check so the body reads linearly.

Signed-off-by: Simon Glass <[email protected]>
---

 cmd/ini.c | 21 ++++++++-------------
 1 file changed, 8 insertions(+), 13 deletions(-)

diff --git a/cmd/ini.c b/cmd/ini.c
index 96399017691..cf0a3ce8b3d 100644
--- a/cmd/ini.c
+++ b/cmd/ini.c
@@ -202,22 +202,17 @@ static int ini_parse(char *filestart, size_t filelen,
 static int ini_handler(void *user, char *section, char *name, char *value)
 {
        char *requested_section = (char *)user;
-#ifdef CONFIG_INI_CASE_INSENSITIVE
-       int i;
 
-       for (i = 0; i < strlen(requested_section); i++)
-               requested_section[i] = tolower(requested_section[i]);
-       for (i = 0; i < strlen(section); i++)
-               section[i] = tolower(section[i]);
-#endif
+       if (IS_ENABLED(CONFIG_INI_CASE_INSENSITIVE)) {
+               strlower(requested_section);
+               strlower(section);
+       }
 
        if (!strcmp(section, requested_section)) {
-#ifdef CONFIG_INI_CASE_INSENSITIVE
-               for (i = 0; i < strlen(name); i++)
-                       name[i] = tolower(name[i]);
-               for (i = 0; i < strlen(value); i++)
-                       value[i] = tolower(value[i]);
-#endif
+               if (IS_ENABLED(CONFIG_INI_CASE_INSENSITIVE)) {
+                       strlower(name);
+                       strlower(value);
+               }
                env_set(name, value);
                printf("ini: Imported %s as %s\n", name, value);
        }
-- 
2.43.0

Reply via email to