From e9f449ba59a71ecf952bed51735172a5be2c50a7 Mon Sep 17 00:00:00 2001 From: Patrick Steinhardt Date: Sun, 14 Feb 2021 12:16:28 +0100 Subject: [PATCH] wpa_supplicant: Move wpa_config_get_line() into utils The function wpa_config_get_line() is used by the wpa_supplicant config file parser to retrieve the next non-comment non-blank line. We'll need the same kind of functionality to implement the file-based external password backend, so as a preparatory step this commit extracts the function into its own standalone file in the utils package. No functional changes are expected from this commit. Signed-off-by: Patrick Steinhardt --- src/utils/Makefile | 1 + src/utils/config.c | 97 +++++++++++++++++ src/utils/config.h | 29 +++++ tests/fuzzing/wnm/wnm.c | 2 +- wpa_supplicant/Android.mk | 1 + wpa_supplicant/Makefile | 1 + wpa_supplicant/config_file.c | 100 +----------------- .../vs2005/eapol_test/eapol_test.vcproj | 4 + .../wpa_supplicant/wpa_supplicant.vcproj | 4 + wpa_supplicant/vs2005/wpasvc/wpasvc.vcproj | 4 + 10 files changed, 143 insertions(+), 100 deletions(-) create mode 100644 src/utils/config.c create mode 100644 src/utils/config.h diff --git a/src/utils/Makefile b/src/utils/Makefile index e8ad997ee..d995b8178 100644 --- a/src/utils/Makefile +++ b/src/utils/Makefile @@ -6,6 +6,7 @@ LIB_OBJS= \ base64.o \ bitfield.o \ common.o \ + config.o \ crc32.o \ ip_addr.o \ json.o \ diff --git a/src/utils/config.c b/src/utils/config.c new file mode 100644 index 000000000..22aa2216e --- /dev/null +++ b/src/utils/config.c @@ -0,0 +1,97 @@ +/* + * Configuration parsing + * Copyright (c) 2003-2019, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#include "includes.h" + +#include "utils/config.h" +#include "common.h" + + +static int newline_terminated(const char *buf, size_t buflen) +{ + size_t len = os_strlen(buf); + if (len == 0) + return 0; + if (len == buflen - 1 && buf[buflen - 1] != '\r' && + buf[len - 1] != '\n') + return 0; + return 1; +} + + +static void skip_line_end(FILE *stream) +{ + char buf[100]; + while (fgets(buf, sizeof(buf), stream)) { + buf[sizeof(buf) - 1] = '\0'; + if (newline_terminated(buf, sizeof(buf))) + return; + } +} + + +char * wpa_config_get_line(char *s, int size, FILE *stream, int *line, + char **_pos) +{ + char *pos, *end, *sstart; + + while (fgets(s, size, stream)) { + (*line)++; + s[size - 1] = '\0'; + if (!newline_terminated(s, size)) { + /* + * The line was truncated - skip rest of it to avoid + * confusing error messages. + */ + wpa_printf(MSG_INFO, "Long line in configuration file " + "truncated"); + skip_line_end(stream); + } + pos = s; + + /* Skip white space from the beginning of line. */ + while (*pos == ' ' || *pos == '\t' || *pos == '\r') + pos++; + + /* Skip comment lines and empty lines */ + if (*pos == '#' || *pos == '\n' || *pos == '\0') + continue; + + /* + * Remove # comments unless they are within a double quoted + * string. + */ + sstart = os_strchr(pos, '"'); + if (sstart) + sstart = os_strrchr(sstart + 1, '"'); + if (!sstart) + sstart = pos; + end = os_strchr(sstart, '#'); + if (end) + *end-- = '\0'; + else + end = pos + os_strlen(pos) - 1; + + /* Remove trailing white space. */ + while (end > pos && + (*end == '\n' || *end == ' ' || *end == '\t' || + *end == '\r')) + *end-- = '\0'; + + if (*pos == '\0') + continue; + + if (_pos) + *_pos = pos; + return pos; + } + + if (_pos) + *_pos = NULL; + return NULL; +} diff --git a/src/utils/config.h b/src/utils/config.h new file mode 100644 index 000000000..074a88a5d --- /dev/null +++ b/src/utils/config.h @@ -0,0 +1,29 @@ +/* + * Configuration parsing + * Copyright (c) 2003-2019, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#ifndef UTILS_CONFIG_H +#define UTILS_CONFIG_H + +/** + * wpa_config_get_line - Read the next configuration file line + * @s: Buffer for the line + * @size: The buffer length + * @stream: File stream to read from + * @line: Pointer to a variable storing the file line number + * @_pos: Buffer for the pointer to the beginning of data on the text line or + * %NULL if not needed (returned value used instead) + * Returns: Pointer to the beginning of data on the text line or %NULL if no + * more text lines are available. + * + * This function reads the next non-empty line from the configuration file and + * removes comments. The returned string is guaranteed to be null-terminated. + */ +char * wpa_config_get_line(char *s, int size, FILE *stream, int *line, + char **_pos); + +#endif /* UTILS_CONFIG_H */ diff --git a/tests/fuzzing/wnm/wnm.c b/tests/fuzzing/wnm/wnm.c index 9c0d5418b..7afc648e4 100644 --- a/tests/fuzzing/wnm/wnm.c +++ b/tests/fuzzing/wnm/wnm.c @@ -16,7 +16,7 @@ #include "wpa_supplicant_i.h" #include "bss.h" #include "wnm_sta.h" -#include "config.h" +#include "../../../wpa_supplicant/config.h" #include "../fuzzer-common.h" diff --git a/wpa_supplicant/Android.mk b/wpa_supplicant/Android.mk index 4cbce995c..5b551d4df 100644 --- a/wpa_supplicant/Android.mk +++ b/wpa_supplicant/Android.mk @@ -94,6 +94,7 @@ OBJS += notify.c OBJS += bss.c OBJS += eap_register.c OBJS += src/utils/common.c +OBJS += src/utils/config.c OBJS += src/utils/wpa_debug.c OBJS += src/utils/wpabuf.c OBJS += src/utils/bitfield.c diff --git a/wpa_supplicant/Makefile b/wpa_supplicant/Makefile index 59b054cd2..5e9a696f6 100644 --- a/wpa_supplicant/Makefile +++ b/wpa_supplicant/Makefile @@ -83,6 +83,7 @@ OBJS += notify.o OBJS += bss.o OBJS += eap_register.o OBJS += ../src/utils/common.o +OBJS += ../src/utils/config.o OBJS += ../src/utils/wpa_debug.o OBJS += ../src/utils/wpabuf.o OBJS += ../src/utils/bitfield.o diff --git a/wpa_supplicant/config_file.c b/wpa_supplicant/config_file.c index fd6275e22..a535e3f08 100644 --- a/wpa_supplicant/config_file.c +++ b/wpa_supplicant/config_file.c @@ -23,105 +23,7 @@ #include "p2p/p2p.h" #include "eap_peer/eap_methods.h" #include "eap_peer/eap.h" - - -static int newline_terminated(const char *buf, size_t buflen) -{ - size_t len = os_strlen(buf); - if (len == 0) - return 0; - if (len == buflen - 1 && buf[buflen - 1] != '\r' && - buf[len - 1] != '\n') - return 0; - return 1; -} - - -static void skip_line_end(FILE *stream) -{ - char buf[100]; - while (fgets(buf, sizeof(buf), stream)) { - buf[sizeof(buf) - 1] = '\0'; - if (newline_terminated(buf, sizeof(buf))) - return; - } -} - - -/** - * wpa_config_get_line - Read the next configuration file line - * @s: Buffer for the line - * @size: The buffer length - * @stream: File stream to read from - * @line: Pointer to a variable storing the file line number - * @_pos: Buffer for the pointer to the beginning of data on the text line or - * %NULL if not needed (returned value used instead) - * Returns: Pointer to the beginning of data on the text line or %NULL if no - * more text lines are available. - * - * This function reads the next non-empty line from the configuration file and - * removes comments. The returned string is guaranteed to be null-terminated. - */ -static char * wpa_config_get_line(char *s, int size, FILE *stream, int *line, - char **_pos) -{ - char *pos, *end, *sstart; - - while (fgets(s, size, stream)) { - (*line)++; - s[size - 1] = '\0'; - if (!newline_terminated(s, size)) { - /* - * The line was truncated - skip rest of it to avoid - * confusing error messages. - */ - wpa_printf(MSG_INFO, "Long line in configuration file " - "truncated"); - skip_line_end(stream); - } - pos = s; - - /* Skip white space from the beginning of line. */ - while (*pos == ' ' || *pos == '\t' || *pos == '\r') - pos++; - - /* Skip comment lines and empty lines */ - if (*pos == '#' || *pos == '\n' || *pos == '\0') - continue; - - /* - * Remove # comments unless they are within a double quoted - * string. - */ - sstart = os_strchr(pos, '"'); - if (sstart) - sstart = os_strrchr(sstart + 1, '"'); - if (!sstart) - sstart = pos; - end = os_strchr(sstart, '#'); - if (end) - *end-- = '\0'; - else - end = pos + os_strlen(pos) - 1; - - /* Remove trailing white space. */ - while (end > pos && - (*end == '\n' || *end == ' ' || *end == '\t' || - *end == '\r')) - *end-- = '\0'; - - if (*pos == '\0') - continue; - - if (_pos) - *_pos = pos; - return pos; - } - - if (_pos) - *_pos = NULL; - return NULL; -} +#include "utils/config.h" static int wpa_config_validate_network(struct wpa_ssid *ssid, int line) diff --git a/wpa_supplicant/vs2005/eapol_test/eapol_test.vcproj b/wpa_supplicant/vs2005/eapol_test/eapol_test.vcproj index f9522fc1c..c92b8fd89 100755 --- a/wpa_supplicant/vs2005/eapol_test/eapol_test.vcproj +++ b/wpa_supplicant/vs2005/eapol_test/eapol_test.vcproj @@ -230,6 +230,10 @@ RelativePath="..\..\..\src\utils\common.c" > + + diff --git a/wpa_supplicant/vs2005/wpa_supplicant/wpa_supplicant.vcproj b/wpa_supplicant/vs2005/wpa_supplicant/wpa_supplicant.vcproj index 5867544d4..10c05b565 100755 --- a/wpa_supplicant/vs2005/wpa_supplicant/wpa_supplicant.vcproj +++ b/wpa_supplicant/vs2005/wpa_supplicant/wpa_supplicant.vcproj @@ -230,6 +230,10 @@ RelativePath="..\..\..\src\utils\common.c" > + + diff --git a/wpa_supplicant/vs2005/wpasvc/wpasvc.vcproj b/wpa_supplicant/vs2005/wpasvc/wpasvc.vcproj index 21d600b71..82d9033ff 100755 --- a/wpa_supplicant/vs2005/wpasvc/wpasvc.vcproj +++ b/wpa_supplicant/vs2005/wpasvc/wpasvc.vcproj @@ -230,6 +230,10 @@ RelativePath="..\..\..\src\utils\common.c" > + +