From 8390d1d432330e143832734d5799528013e79178 Mon Sep 17 00:00:00 2001
From: Dmitri Pal <dpal@redhat.com>
Date: Mon, 23 Sep 2013 16:03:30 -0400
Subject: [PATCH] Trim trailing spaces
This patch addressed issue https://fedorahosted.org/sssd/ticket/2095
The new parser in fact stopped trimming trailing spaces.
This is now corrected.
---
ini/ini.d/real.conf | 2 +-
ini/ini_parse.c | 7 ++++
ini/ini_parse_ut.c | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 108 insertions(+), 1 deletion(-)
diff --git a/ini/ini.d/real.conf b/ini/ini.d/real.conf
index 32bc9dae0c40ce46dc4c375963b5d0cf2a05e17b..1e155b820061001695d85edfeca1819e799e2a4b 100644
--- a/ini/ini.d/real.conf
+++ b/ini/ini.d/real.conf
@@ -40,7 +40,7 @@ legacy = FALSE
enumerate = 3
[domains/EXAMPLE.COM]
-description = Example domain served by IPA
+description = Example domain served by IPA
provider = ipa
server = ipaserver1.example.com
server = ipabackupserver.example.com
diff --git a/ini/ini_parse.c b/ini/ini_parse.c
index 60ef1169986f2ea27596931ebf16fab166c71937..9a1c0ec63013adb986b627c977c9759c1d5a210e 100644
--- a/ini/ini_parse.c
+++ b/ini/ini_parse.c
@@ -968,6 +968,13 @@ static int handle_kvp(struct parser_obj *po, uint32_t *action)
full_len--;
}
+ /* Trucate trailing spaces */
+ /* Make sure not to step before the beginning */
+ while (full_len && isspace(str[full_len - 1])) {
+ str[full_len - 1] = '\0';
+ full_len--;
+ }
+
/* Check if we have the key */
if (*(str) == '=') {
po->last_error = ERR_NOKEY;
diff --git a/ini/ini_parse_ut.c b/ini/ini_parse_ut.c
index 32c59e7a3a36a5b719620ae42cf070154d4eb416..2655d7e8e11a391db324a9c022004f7cbbeb092e 100644
--- a/ini/ini_parse_ut.c
+++ b/ini/ini_parse_ut.c
@@ -2650,6 +2650,105 @@ int space_test(void)
return EOK;
}
+
+int trim_test(void)
+{
+ int error;
+ struct ini_cfgfile *file_ctx = NULL;
+ struct ini_cfgobj *ini_config = NULL;
+ char **error_list = NULL;
+ char infile[PATH_MAX];
+ char *srcdir = NULL;
+ const char *value;
+ struct value_obj *vo = NULL;
+
+ INIOUT(printf("\n\n<==== TRIM TEST START =====>\n"));
+
+ srcdir = getenv("srcdir");
+ snprintf(infile, PATH_MAX, "%s/ini/ini.d/real.conf",
+ (srcdir == NULL) ? "." : srcdir);
+
+
+ INIOUT(printf("Reading file %s\n", infile));
+ error = ini_config_file_open(infile,
+ 0,
+ &file_ctx);
+ if (error) {
+ printf("Failed to open file for reading. Error %d.\n", error);
+ return error;
+ }
+
+ INIOUT(printf("Creating configuration object\n"));
+ error = ini_config_create(&ini_config);
+ if (error) {
+ printf("Failed to create object. Error %d.\n", error);
+ ini_config_file_destroy(file_ctx);
+ return error;
+ }
+ INIOUT(printf("Parsing\n"));
+ error = ini_config_parse(file_ctx,
+ INI_STOP_ON_NONE,
+ 0,
+ 0,
+ ini_config);
+ if (error) {
+ INIOUT(printf("Failed to parse configuration. "
+ "Error %d.\n", error));
+
+ if (ini_config_error_count(ini_config)) {
+ INIOUT(printf("Errors detected while parsing: %s\n",
+ ini_config_get_filename(file_ctx)));
+ ini_config_get_errors(ini_config, &error_list);
+ INIOUT(ini_config_print_errors(stdout, error_list));
+ ini_config_free_errors(error_list);
+ }
+ ini_config_file_destroy(file_ctx);
+ return error;
+ }
+
+ INIOUT(col_debug_collection(ini_config->cfg, COL_TRAVERSE_DEFAULT));
+ ini_config_file_destroy(file_ctx);
+
+ vo = NULL;
+ error = ini_get_config_valueobj("domains/EXAMPLE.COM",
+ "description",
+ ini_config,
+ INI_GET_FIRST_VALUE,
+ &vo);
+ if(error) {
+ printf("Expected success but got error! %d\n",error);
+ ini_config_destroy(ini_config);
+ return error;
+ }
+
+ /* Value should be found */
+ if (vo == NULL) {
+ printf("Expected success but got NULL.\n");
+ ini_config_destroy(ini_config);
+ return -1;
+ }
+
+ value = ini_get_const_string_config_value(vo, NULL);
+
+ if (value == NULL) {
+ printf("No value.\n");
+ ini_config_destroy(ini_config);
+ return -1;
+ }
+
+ if(value[strlen(value) - 1] == ' ') {
+ printf("Trailing space is not trimmed.\n");
+ ini_config_destroy(ini_config);
+ return -1;
+ }
+
+ INIOUT(printf("[%s]\n", value));
+
+ ini_config_destroy(ini_config);
+
+ INIOUT(printf("\n<==== TRIM TEST END =====>\n\n"));
+ return EOK;
+}
/* Main function of the unit test */
int main(int argc, char *argv[])
{
@@ -2663,6 +2762,7 @@ int main(int argc, char *argv[])
reload_test,
get_test,
space_test,
+ trim_test,
NULL };
test_fn t;
int i = 0;
--
1.8.3.1