pg command enters infinite loop

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



forwarding bug report and fix from here:
https://bugs.gentoo.org/297717

In a multibyte locale such as en_GB.UTF-8, the pg command cannot handle files 
containing a form feed character (ASCII 0x0c) at the start of a line. The 
program enters an infinite loop.

I've traced the problem to the function endline_for_mb in file pg.c. The code 
assumes that the libc function wcwidth will return a nonnegative value, which 
is not true for a form feed character. wcwidth returns -1 and the unsigned 
variable "pos" goes into underflow.

I'll attach a patch which tests whether the character is printable before 
calling wcwidth. If not, it uses instead the width of the constant L'?' which 
is later used to replace nonprintable characters. I trust that we can assume 
printability of this constant :-)

Steps to Reproduce:
1. Select a multibyte locale (tested with en_GB.UTF-8)
2. Create a file with a form feed character (0x0c) at the start of a line.
3. Try to display this file using the pg command.

patch by Mark Calderbank <m.calderbank@xxxxxxxxx>:
--- a/text-utils/pg.c
+++ b/text-utils/pg.c
@@ -448,7 +448,10 @@
 			pos += TABSIZE - (pos % TABSIZE);
 			break;
 		default:
-			pos += wcwidth(*p);
+			if (iswprint(*p))
+				pos += wcwidth(*p);
+			else
+				pos += wcwidth(L'?');
 		}
 		if (pos > col) {
 			if (*p == L'\t')
-mike
--
To unsubscribe from this list: send the line "unsubscribe util-linux-ng" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux