[Date Prev][Date Next] [Chronological] [Thread] [Top]

Infinite loops in ucgendat.c (EOF test) (ITS#1917)



Full_Name: Richard Shaffer
Version: 2.1.2
OS: Linux (Red Hat 7)
URL: ftp://ftp.openldap.org/incoming/
Submission from: (NULL) (64.174.237.130)


During the "make" process, the command "./ucgendat $(srcdir)/UnicodeData.txt -x
$(srcdir)/CompositionExclusions.txt" is run (in libraries/liblunicode).  On my
system, a very vanilla version of RedHat 7, this program goes into an infinite
loop when the read_cdata function reaches the end of the UnicodeData.txt file. 
The reason is that the call to fscanf at line 807 of ucgendat.c returns 0 when
the end of the file is reached, instead of EOF.  I am using gcc version 2.96 as
the compiler, and glibc version 2.1.92.

To work around this problem, I used feof() to determine an end of file condition
instead of relying on the return value from fscanf.  Following is a copy of the
patch I used to work around the problem.  I've uploaded my config.log to
ftp://ftp.openldap.org/incoming/config.log.rshaffer.

----------Start Patch----------
--- ucgendat.c  Fri Jun 28 10:53:12 2002
+++ ucgendat.c.orig     Fri Jun 28 10:52:56 2002
@@ -804,8 +804,7 @@
     char line[512], *s, *e;

     lineno = skip = 0;
-    while (!feof(in)) {
-        fscanf(in, "%[^\n]\n", line);
+    while (fscanf(in, "%[^\n]\n", line) != EOF) {
         lineno++;

         /*
@@ -1163,8 +1162,7 @@

     (void) memset((char *) compexs, 0, sizeof(unsigned long) << 11);

-    while (!feof(in)) {
-        fscanf(in, "%[^\n]\n", line);
+    while (fscanf(in, "%[^\n]\n", line) != EOF) {
         /*
          * Skip blank lines and lines that start with a '#'.
          */
-----------End Patch-----------