[PATCH] Fix vfprintf with weirdo encodings

Jakub Jelinek jakub@redhat.com
Thu Jan 30 18:18:00 GMT 2003


Hi!

The following program segfaults:
#include <stdio.h>
#include <locale.h>

int main ()
{
  char buf[10];
  setlocale (LC_ALL, "vi_VN.tcvn");
  sprintf (buf, "%.*s", 2, "vi");
}

The problem is that TCVN and a bunch of other encodings are using high
bits of mbstate_t's __count member for other things, so in this case
we end up with negative len.

2003-01-30  Jakub Jelinek  <jakub@redhat.com>

	* stdio-common/vfprintf.c (vfprintf): Only subtract lowest 3 bits of
	ps.__count.

--- libc/stdio-common/vfprintf.c.jj	2003-01-28 01:41:15.000000000 -0500
+++ libc/stdio-common/vfprintf.c	2003-01-30 12:36:00.000000000 -0500
@@ -1185,7 +1185,7 @@ vfprintf (FILE *s, const CHAR_T *format,
 		    if (str2 == NULL)					      \
 		      len = strlen (string);				      \
 		    else						      \
-		      len = str2 - string - (ps.__count);		      \
+		      len = str2 - string - (ps.__count & 7);		      \
 		  }							      \
 	      }								      \
 	    else							      \

	Jakub



More information about the Libc-hacker mailing list