summaryrefslogtreecommitdiff
path: root/core/sbase/patch
diff options
context:
space:
mode:
authorMichael Forney <mforney@mforney.org>2016-10-22 02:45:05 -0700
committerMichael Forney <mforney@mforney.org>2016-10-22 02:45:05 -0700
commit7727d8fe8ab175c740b9593bf265257eeed28995 (patch)
treede812e24c91f9f026f8a56e31147d94a7ae04733 /core/sbase/patch
parent699e88102d63f49ce7fb4f6027616233b7715997 (diff)
sbase: Add patch to fix tr bug
Diffstat (limited to 'core/sbase/patch')
-rw-r--r--core/sbase/patch/0001-tr-Fix-multiple-ranges-with-different-lengths.patch44
1 files changed, 44 insertions, 0 deletions
diff --git a/core/sbase/patch/0001-tr-Fix-multiple-ranges-with-different-lengths.patch b/core/sbase/patch/0001-tr-Fix-multiple-ranges-with-different-lengths.patch
new file mode 100644
index 00000000..790b38b6
--- /dev/null
+++ b/core/sbase/patch/0001-tr-Fix-multiple-ranges-with-different-lengths.patch
@@ -0,0 +1,44 @@
+From 5ab8305957fcf03a7b0602c926db72ecbc3f1294 Mon Sep 17 00:00:00 2001
+From: Michael Forney <mforney@mforney.org>
+Date: Sat, 22 Oct 2016 02:13:12 -0700
+Subject: [sbase] [PATCH] tr: Fix multiple ranges with different lengths
+
+A bug was introduced in bc4c293fe59de042c1ac71793d33bb685c4fb915 causing the
+range length for the next set to be used instead of the first one. This causes
+issues when choosing the replacement rune when the ranges are of different
+lengths.
+
+Current behavior:
+
+$ echo 1234 | tr 'a-f1-4' '1-6a-d'
+56ab
+
+Correct behavior:
+
+$ echo 1234 | tr 'a-f1-4' '1-6a-d'
+abcd
+
+This also fixes range expressions in the form [a-z], which get encoded as four
+ranges '[', 'a'..'z', ']', causing all a-z characters to get mapped to ']'. This
+form is occasionally used in shell scripts, including the syscalltbl.sh script
+used to build linux.
+---
+ tr.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/tr.c b/tr.c
+index a633d74..c235215 100644
+--- a/tr.c
++++ b/tr.c
+@@ -213,7 +213,7 @@ read:
+ }
+ if (argc == 1 && sflag)
+ goto write;
+- for (i = 0, off1 = 0; i < set1ranges; i++, off1 += rangelen(set1[i])) {
++ for (i = 0, off1 = 0; i < set1ranges; off1 += rangelen(set1[i]), i++) {
+ if (set1[i].start <= r && r <= set1[i].end) {
+ if (dflag) {
+ if (cflag)
+--
+2.10.1
+