From d1d877134884438720a729aba44f6daf90e79344 Mon Sep 17 00:00:00 2001 From: clfreville2 Date: Thu, 1 Dec 2022 08:10:56 +0100 Subject: [PATCH] =?UTF-8?q?shell-scape:=20=C3=89chappe=20des=20caract?= =?UTF-8?q?=C3=A8res=20sp=C3=A9ciaux?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shell-escape/Makefile | 25 +++++++++++ shell-escape/oki.toml | 8 ++++ shell-escape/src/escape.c | 45 +++++++++++++++++++ shell-escape/src/escape.h | 6 +++ shell-escape/test/testEscape.c | 15 +++++++ .../third-party/static-string-builder | 1 + static-string-builder/src/builder.h | 2 + 7 files changed, 102 insertions(+) create mode 100644 shell-escape/Makefile create mode 100644 shell-escape/oki.toml create mode 100644 shell-escape/src/escape.c create mode 100644 shell-escape/src/escape.h create mode 100644 shell-escape/test/testEscape.c create mode 120000 shell-escape/third-party/static-string-builder diff --git a/shell-escape/Makefile b/shell-escape/Makefile new file mode 100644 index 0000000..07d4758 --- /dev/null +++ b/shell-escape/Makefile @@ -0,0 +1,25 @@ +CC := gcc +CFLAGS := -Wall -Wextra +CPPFLAGS := -isystemthird-party + +all: test + +test: testEscape + ./testEscape + +testEscape: build/escape.o build/testEscape.o ../static-string-builder/build/builder.o + $(CC) -o $@ $^ + +build/escape.o: src/escape.c src/escape.h | build + $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@ + +build/testEscape.o: test/testEscape.c src/escape.h | build + $(CC) $(CPPFLAGS) $(CFLAGS) -Isrc/ -c $< -o $@ + +build: + mkdir build + +clean: + rm -rf testEscape build + +.PHONY: all test clean diff --git a/shell-escape/oki.toml b/shell-escape/oki.toml new file mode 100644 index 0000000..dffada7 --- /dev/null +++ b/shell-escape/oki.toml @@ -0,0 +1,8 @@ +[package] +name = "shell-escape" +version = "0.1.0" +description = "Escape shell characters" +license = "MIT" + +[dependencies] +static-string-builder = "^0.1" diff --git a/shell-escape/src/escape.c b/shell-escape/src/escape.c new file mode 100644 index 0000000..457c06e --- /dev/null +++ b/shell-escape/src/escape.c @@ -0,0 +1,45 @@ +#include "escape.h" + +#include + +#include +#include +#include + +bool isShellSafe(char ch) { + return strchr("@%+=:,./-_", ch) != NULL || isalnum(ch); +} + +bool isSafeShellStr(const char *str) { + for (; *str; str++) { + if (!isShellSafe(*str)) { + return false; + } + } + return true; +} + +const char *shellEscape(const char *str) { + if (isSafeShellStr(str)) { + return str; + } + + char *result = tmp_end(); + + tmp_append_char('\''); + while (str) { + char *end = strchr(str, '\''); + if (end) { + tmp_append_sized(str, end - str); + tmp_append_cstr("'\"'\"'"); + str = end + 1; + } else { + tmp_append_cstr(str); + str = NULL; + } + } + tmp_append_char('\''); + tmp_append_char('\0'); + + return result; +} diff --git a/shell-escape/src/escape.h b/shell-escape/src/escape.h new file mode 100644 index 0000000..53bd9bb --- /dev/null +++ b/shell-escape/src/escape.h @@ -0,0 +1,6 @@ +#ifndef SHELL_ESCAPE_H +#define SHELL_ESCAPE_H + +const char *shellEscape(const char *str); + +#endif // SHELL_ESCAPE_H diff --git a/shell-escape/test/testEscape.c b/shell-escape/test/testEscape.c new file mode 100644 index 0000000..20c1c34 --- /dev/null +++ b/shell-escape/test/testEscape.c @@ -0,0 +1,15 @@ +#include "escape.h" + +#include +#include +#include + +int main(void) { + assert(strcmp("aa", shellEscape("aa")) == 0); + assert(strcmp("'aa bb'", shellEscape("aa bb")) == 0); + assert(strcmp("'a(b)'", shellEscape("a(b)")) == 0); + assert(strcmp("'aa && bb'", shellEscape("aa && bb")) == 0); + assert(strcmp("'echo aa '\"'\"'s'\"'\"''", shellEscape("echo aa 's'")) == 0); + return 0; +} + diff --git a/shell-escape/third-party/static-string-builder b/shell-escape/third-party/static-string-builder new file mode 120000 index 0000000..bc84a1f --- /dev/null +++ b/shell-escape/third-party/static-string-builder @@ -0,0 +1 @@ +../../static-string-builder/src/ \ No newline at end of file diff --git a/static-string-builder/src/builder.h b/static-string-builder/src/builder.h index 9f93ec9..877c6d7 100644 --- a/static-string-builder/src/builder.h +++ b/static-string-builder/src/builder.h @@ -22,6 +22,8 @@ char *tmp_end(void); */ char *tmp_append_char(char c); +char *tmp_append_sized(const char *buffer, size_t buffer_sz); + char *tmp_append_cstr(const char *cstr); void tmp_clean();