Page MenuHomeFreeBSD

D22750.id65462.diff
No OneTemporary

D22750.id65462.diff

Index: usr.bin/sed/compile.c
===================================================================
--- usr.bin/sed/compile.c
+++ usr.bin/sed/compile.c
@@ -395,10 +395,21 @@
continue;
} else if (*p == '\\' && p[1] == '[') {
*d++ = *p++;
- } else if (*p == '\\' && p[1] == c)
+ } else if (*p == '\\' && p[1] == c) {
p++;
- else if (*p == '\\' && p[1] == 'n') {
- *d++ = '\n';
+ } else if (*p == '\\' &&
+ (p[1] == 'n' || p[1] == 'r' || p[1] == 't')) {
+ switch (p[1]) {
+ case 'n':
+ *d++ = '\n';
+ break;
+ case 'r':
+ *d++ = '\r';
+ break;
+ case 't':
+ *d++ = '\t';
+ break;
+ }
p += 2;
continue;
} else if (*p == '\\' && p[1] == '\\') {
@@ -428,13 +439,29 @@
*t++ = *s++;
if (*s == ']')
*t++ = *s++;
- for (; *s && (*t = *s) != ']'; s++, t++)
+ for (; *s && (*t = *s) != ']'; s++, t++) {
if (*s == '[' && ((d = *(s+1)) == '.' || d == ':' || d == '=')) {
*++t = *++s, t++, s++;
for (c = *s; (*t = *s) != ']' || c != d; s++, t++)
if ((c = *s) == '\0')
return NULL;
+ } else if (*s == '\\') {
+ switch (s[1]) {
+ case 'n':
+ *t = '\n';
+ s++;
+ break;
+ case 'r':
+ *t = '\r';
+ s++;
+ break;
+ case 't':
+ *t = '\t';
+ s++;
+ break;
+ }
}
+ }
return (*s == ']') ? *sp = ++s, ++t : NULL;
}
@@ -521,8 +548,23 @@
linenum, fname, *p);
if (s->maxbref < ref)
s->maxbref = ref;
- } else if (*p == '&' || *p == '\\')
- *sp++ = '\\';
+ } else {
+ switch (*p) {
+ case '&':
+ case '\\':
+ *sp++ = '\\';
+ break;
+ case 'n':
+ *p = '\n';
+ break;
+ case 'r':
+ *p = '\r';
+ break;
+ case 't':
+ *p = '\t';
+ break;
+ }
+ }
} else if (*p == c) {
if (*++p == '\0' && more) {
if (cu_fgets(lbuf, sizeof(lbuf), &more))
Index: usr.bin/sed/tests/regress.multitest.out/8.22
===================================================================
--- usr.bin/sed/tests/regress.multitest.out/8.22
+++ usr.bin/sed/tests/regress.multitest.out/8.22
@@ -1,2 +1 @@
-1
-2
+1X2
Index: usr.bin/sed/tests/sed2_test.sh
===================================================================
--- usr.bin/sed/tests/sed2_test.sh
+++ usr.bin/sed/tests/sed2_test.sh
@@ -69,9 +69,29 @@
atf_check -s not-exit:0 stat -q '.!'*
}
+atf_test_case escape_subst
+escape_subst_head()
+{
+ atf_set "descr" "Verify functional escaping of \\n, \\r, and \\t"
+}
+escape_subst_body()
+{
+ printf "a\nt\\\t\n\tb\n\t\tc\r\n" > a
+ tr -d '\r' < a > b
+ printf "a\tb c\rx\n" > c
+
+ atf_check -o 'inline:a\nt\\t\n' sed '/\t/d' a
+ atf_check -o 'inline:a\nt\\t\n b\n c\r\n' sed 's/\t/ /g' a
+ atf_check -o 'inline:a\nt\\t\n\t\tb\n\t\t\t\tc\r\n' sed 's/\t/\t\t/g' a
+ atf_check -o 'inline:a\nt\n\tb\n\t\tc\r\n' sed 's/\\t//g' a
+ atf_check -o file:b sed 's/\r//' a
+ atf_check -o 'inline:abcx\n' sed 's/[ \r\t]//g' c
+}
+
atf_init_test_cases()
{
atf_add_test_case inplace_command_q
atf_add_test_case inplace_hardlink_src
atf_add_test_case inplace_symlink_src
+ atf_add_test_case escape_subst
}

File Metadata

Mime Type
text/plain
Expires
Sun, Mar 15, 7:30 AM (3 h, 9 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29707268
Default Alt Text
D22750.id65462.diff (3 KB)

Event Timeline