diff -up bash-4.1/builtins/printf.def.octal bash-4.1/builtins/printf.def --- bash-4.1/builtins/printf.def.octal 2010-12-07 15:40:24.000000000 +0100 +++ bash-4.1/builtins/printf.def 2010-12-07 16:13:41.000000000 +0100 @@ -734,11 +734,15 @@ tescape (estart, cp, sawc) /* The octal escape sequences are `\0' followed by up to three octal digits (if SAWC), or `\' followed by up to three octal digits (if - !SAWC). As an extension, we allow the latter form even if SAWC. */ + !SAWC). As an extension, we allow the latter form even if SAWC. + If the octal character begins with number 4 or higher, + only 2 octal digits fit to byte */ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': evalue = OCTVALUE (c); - for (temp = 2 + (!evalue && !!sawc); ISOCTAL (*p) && temp--; p++) + for (temp = 2 + (!evalue && !!sawc) - + (!sawc ? c > '3' : evalue ? evalue > 3 : *p > '3'); + ISOCTAL (*p) && temp--; p++) evalue = (evalue * 8) + OCTVALUE (*p); *cp = evalue & 0xFF; break; diff -up bash-4.1/lib/sh/strtrans.c.octal bash-4.1/lib/sh/strtrans.c --- bash-4.1/lib/sh/strtrans.c.octal 2008-08-12 19:49:12.000000000 +0200 +++ bash-4.1/lib/sh/strtrans.c 2010-12-07 15:40:24.000000000 +0100 @@ -96,6 +96,8 @@ ansicstr (string, len, flags, sawc, rlen POSIX-2001 requirement and accept 0-3 octal digits after a leading `0'. */ temp = 2 + ((flags & 1) && (c == '0')); + if (*s > '3') + temp--; for (c -= '0'; ISOCTAL (*s) && temp--; s++) c = (c * 8) + OCTVALUE (*s); c &= 0xFF;