aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Kraai <kraai@debian.org>2001-08-24 14:45:50 +0000
committerMatt Kraai <kraai@debian.org>2001-08-24 14:45:50 +0000
commita0065d5955133f0b20864e966dfc692fe41aed2b (patch)
tree8baad7a565ba34772da3f8a7d7c88cf7aa9daaf6
parent31b35a16e060960dd035010190059a3ec4ff50f7 (diff)
downloadbusybox-a0065d5955133f0b20864e966dfc692fe41aed2b.tar.gz
Fix s/[/]// handling (noted by Dumas Patrice).
-rw-r--r--Changelog2
-rw-r--r--editors/sed.c15
-rw-r--r--sed.c15
3 files changed, 30 insertions, 2 deletions
diff --git a/Changelog b/Changelog
index dc1fdd1fb..5e0f5fd4b 100644
--- a/Changelog
+++ b/Changelog
@@ -15,6 +15,8 @@
-- a whole bunch of ash size optimizations
* Rodney Brown <RDBrown@mira.net>
-- Optimized gzip.c, shrinking it be ~1.5k
+ * Matt Kraai
+ -- Fix sed s/[/]// handling (closes: #1208).
-Erik Andersen, --not yet released--
diff --git a/editors/sed.c b/editors/sed.c
index 4fe882d20..989df7cb4 100644
--- a/editors/sed.c
+++ b/editors/sed.c
@@ -144,8 +144,21 @@ static void destroy_cmd_strs()
*/
static int index_of_next_unescaped_regexp_delim(struct sed_cmd *sed_cmd, const char *str, int idx)
{
+ int bracket = -1;
+ int escaped = 0;
+
for ( ; str[idx]; idx++) {
- if (str[idx] == sed_cmd->delimiter && str[idx-1] != '\\')
+ if (bracket != -1) {
+ if (str[idx] == ']' && !(bracket == idx - 1 ||
+ (bracket == idx - 2 && str[idx-1] == '^')))
+ bracket = -1;
+ } else if (escaped)
+ escaped = 0;
+ else if (str[idx] == '\\')
+ escaped = 1;
+ else if (str[idx] == '[')
+ bracket = idx;
+ else if (str[idx] == sed_cmd->delimiter)
return idx;
}
diff --git a/sed.c b/sed.c
index 4fe882d20..989df7cb4 100644
--- a/sed.c
+++ b/sed.c
@@ -144,8 +144,21 @@ static void destroy_cmd_strs()
*/
static int index_of_next_unescaped_regexp_delim(struct sed_cmd *sed_cmd, const char *str, int idx)
{
+ int bracket = -1;
+ int escaped = 0;
+
for ( ; str[idx]; idx++) {
- if (str[idx] == sed_cmd->delimiter && str[idx-1] != '\\')
+ if (bracket != -1) {
+ if (str[idx] == ']' && !(bracket == idx - 1 ||
+ (bracket == idx - 2 && str[idx-1] == '^')))
+ bracket = -1;
+ } else if (escaped)
+ escaped = 0;
+ else if (str[idx] == '\\')
+ escaped = 1;
+ else if (str[idx] == '[')
+ bracket = idx;
+ else if (str[idx] == sed_cmd->delimiter)
return idx;
}