← Commit list

d3c8cfa67

Denys Vlasenko
Denys Vlasenko
2026-09-23
SUCCESS Duration: 376s

Subject

tr: special-case "\-" before trying to parse it as escape

Binary

No binary (build failed)

Architecture & Compiler Flags

Architecture: x86_64-linux-gnu Compiler: gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0

—

Build Log

(log yok)

Commit Diff GitHub →

coreutils/tr.c+13 -14
@@ -113,20 +113,20 @@ static unsigned expand(char *arg, char **buffer_p)
*buffer_p = buffer = xrealloc(buffer, size);
}
if (*arg == '\\') {
- const char *z;
- arg++;
- z = arg;
- ac = bb_process_escape_sequence(&z);
- if (ac == '\\' && *z == '-') {
- /* An escaped dash isn't a range, don't fall through */
- buffer[pos++] = *z;
+ char *z = ++arg;
+ if (*z == '-') {
+ /* "\-X" isn't a range, but a literal dash and X */
+ buffer[pos++] = '-';
continue;
}
- arg = (char *)z;
- arg--;
+ ac = bb_process_escape_sequence((void*)&z);
+ // if unknown seq "\k": ac='\', z->k: store '\' before 'k'
+ // if known seq "\n": ac='\n', z->past n: store '\n' into 'n'
+ // if known seq "\041": ac='!', z->past 1: store '!' into '1'
+ arg = z - 1;
*arg = ac;
/*
- * fall through, there may be a range.
+ * fall through, there may be a range. Example: "\n-@"
* If not, current char will be treated anyway.
*/
}
@@ -139,10 +139,9 @@ static unsigned expand(char *arg, char **buffer_p)
i = (unsigned char) *arg;
arg += 3; /* skip 0-9 or 0-\ */
if (ac == '\\') {
- const char *z;
- z = arg;
- ac = bb_process_escape_sequence(&z);
- arg = (char *)z;
+ char *z = arg;
+ ac = bb_process_escape_sequence((void*)&z);
+ arg = z;
}
while (i <= ac) /* ok: i is unsigned _int_ */
buffer[pos++] = i++;
libbb/process_escape_sequence.c+6 -0
@@ -15,6 +15,12 @@
#undef _tolower
#define _tolower(X) ((X)|((char) 0x20))
+/* (*ptr) points to string directly after '\'.
+ * Analyze it, if it's special (n, 003, etc) return
+ * corresponding char ('\n', 0x03, etc) and advance
+ * (*ptr) to point after the special part of the string.
+ * Otherwise: return '\' and do not advance (*ptr).
+ */
char FAST_FUNC bb_process_escape_sequence(const char **ptr)
{
const char *q;