ajwillia-ms pushed a commit to branch master. http://git.enlightenment.org/tools/edi.git/commit/?id=1c14989ccda81ed8311dbfc4bb04b801a0dbdaec
commit 1c14989ccda81ed8311dbfc4bb04b801a0dbdaec Author: Andy Williams <[email protected]> Date: Thu Sep 21 20:26:56 2017 +0100 create: Escape single quotes in project and user name @fix T6044 --- src/lib/edi_create.c | 42 +++++++++++++++++++++++++++++++++++++----- src/lib/edi_private.h | 1 + src/tests/Makefile.am | 1 + src/tests/edi_suite.c | 1 + src/tests/edi_suite.h | 1 + src/tests/edi_test_create.c | 38 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 79 insertions(+), 5 deletions(-) diff --git a/src/lib/edi_create.c b/src/lib/edi_create.c index 0abfa75..a293a8f 100644 --- a/src/lib/edi_create.c +++ b/src/lib/edi_create.c @@ -73,29 +73,61 @@ _edi_create_year_get() return tp->tm_year + 1900; } +char * +edi_create_escape_quotes(const char *in) +{ + char buf[1024], *out_ptr; + const char *pos, *in_ptr; + int replace_len; + + pos = strstr(in, "'"); + if (!pos) + return strdup(in); + + in_ptr = in; + out_ptr = buf; + while (pos) + { + replace_len = pos - in_ptr; + snprintf(out_ptr, replace_len + 1, "%s", in_ptr); + snprintf(out_ptr + replace_len, 8, "'\\\"'\\\"'"); + + in_ptr += replace_len + 1; + out_ptr += replace_len + 7; + pos = strstr(in_ptr, "'"); + } + snprintf(out_ptr, strlen(in) - (in_ptr - in) + 1, "%s", in_ptr); + + return strdup(buf); +} + static void _edi_create_filter_file(Edi_Create *create, const char *path) { - char *cmd, *lowername, *uppername; + char *cmd, *name, *lowername, *uppername, *user; const char *template; int length; + name = edi_create_escape_quotes(create->name); + user = edi_create_escape_quotes(create->user); create->filters++; // TODO speed this up - pre-cache this filter! template = "sh -c \"sed -i.bak 's|\\${edi_name}|%s|g;s|\\${Edi_Name}|%s|g;s|\\${EDI_NAME}|%s|g;s|\\${Edi_User}|%s|g;s|\\${Edi_Email}|%s|g;s|\\${Edi_Url}|%s|g;s|\\${Edi_Year}|%d|g' %s\"; rm %s.bak"; - length = strlen(template) + (strlen(create->name) * 3) + strlen(create->user) + strlen(create->email) + strlen(create->url) + (strlen(path) * 2) + 4 - 16 + 1; + length = strlen(template) + (strlen(name) * 3) + strlen(user) + strlen(create->email) + strlen(create->url) + (strlen(path) * 2) + 4 - 16 + 1; - lowername = strdup(create->name); + lowername = strdup(name); eina_str_tolower(&lowername); - uppername = strdup(create->name); + uppername = strdup(name); eina_str_toupper(&uppername); cmd = malloc(sizeof(char) * length); - snprintf(cmd, length, template, lowername, create->name, uppername , create->user, create->email, create->url, _edi_create_year_get(), path, path); + snprintf(cmd, length, template, lowername, name, uppername , user, create->email, create->url, _edi_create_year_get(), path, path); ecore_exe_run(cmd, NULL); free(lowername); free(uppername); + free(name); + free(user); free(cmd); // This matches the filtered path copy created in the copy callback diff --git a/src/lib/edi_private.h b/src/lib/edi_private.h index a7824ed..ac3bd48 100644 --- a/src/lib/edi_private.h +++ b/src/lib/edi_private.h @@ -2,6 +2,7 @@ # define EDI_PRIVATE_H extern int _edi_lib_log_dom; +char *edi_create_escape_quotes(const char *in); #ifdef ERR # undef ERR diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am index 23aefb8..2ff571b 100644 --- a/src/tests/Makefile.am +++ b/src/tests/Makefile.am @@ -9,6 +9,7 @@ clang_include = '$(CLANG_INCLUDE)' edi_suite_SOURCES = \ edi_test_path.c \ +edi_test_create.c \ edi_test_exe.c \ edi_test_content_provider.c \ edi_test_language_provider.c \ diff --git a/src/tests/edi_suite.c b/src/tests/edi_suite.c index 118f590..b0f1087 100644 --- a/src/tests/edi_suite.c +++ b/src/tests/edi_suite.c @@ -15,6 +15,7 @@ static const struct { } tests[] = { { "basic", edi_test_basic }, { "path", edi_test_path }, + { "create", edi_test_create }, { "exe", edi_test_exe }, { "content_provider", edi_test_content_provider }, { "language_provider", edi_test_language_provider }, diff --git a/src/tests/edi_suite.h b/src/tests/edi_suite.h index 3b235d7..d8d3e69 100644 --- a/src/tests/edi_suite.h +++ b/src/tests/edi_suite.h @@ -8,6 +8,7 @@ void edi_test_basic(TCase *tc); void edi_test_console(TCase *tc); void edi_test_path(TCase *tc); +void edi_test_create(TCase *tc); void edi_test_exe(TCase *tc); void edi_test_content_provider(TCase *tc); void edi_test_language_provider(TCase *tc); diff --git a/src/tests/edi_test_create.c b/src/tests/edi_test_create.c new file mode 100644 index 0000000..c9f86f4 --- /dev/null +++ b/src/tests/edi_test_create.c @@ -0,0 +1,38 @@ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "edi_suite.h" + +#include "edi_create.c" + +START_TEST (edi_test_create_escape_quotes) +{ + const char *in = "hallowe'en"; + + char *out = edi_create_escape_quotes(in); + + ck_assert_str_eq(out, "hallowe'\\\"'\\\"'en"); + + free(out); +} +END_TEST + +START_TEST (edi_test_create_escape_multiple_quotes) +{ + const char *in = "we'ven't"; + + char *out = edi_create_escape_quotes(in); + + ck_assert_str_eq(out, "we'\\\"'\\\"'ven'\\\"'\\\"'t"); + + free(out); +} +END_TEST + +void edi_test_create(TCase *tc) +{ + tcase_add_test(tc, edi_test_create_escape_quotes); + tcase_add_test(tc, edi_test_create_escape_multiple_quotes); +} + --
