php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #14958 flex error in compiling Zend enginge
Submitted: 2002-01-09 19:57 UTC Modified: 2002-01-10 06:25 UTC
From: chregu@php.net Assigned:
Status: Closed Package: Compile Failure
PHP Version: 4.0CVS-2002-01-09 OS: linux debian unstable
Private report: No CVE-ID: None
 [2002-01-09 19:57 UTC] chregu@php.net
it seems, that since my debian unstable upgraded from  flex 2.5.4a-14 to 2.5.4a-15, I can't compile the Zend Engine anymore. It throws an error in zend_ini_parser.c and if I compare a zend_ini_parser.c genearated with the -14 version and one from -15 version, there are indeed differences where the error occurs. 

here's the error-mesage from make:

/bin/sh ../libtool --mode=compile gcc -DHAVE_CONFIG_H -I. -I. -I../main   -DLINUX=22 -DUSE_HSREGEX -I../TSRM  -g  -Wall -prefer-pic -c zend_ini_scanner.c
gcc -DHAVE_CONFIG_H -I. -I. -I../main -DLINUX=22 -DUSE_HSREGEX -I../TSRM -g -Wall -c zend_ini_scanner.c     -fPIC -DPIC -o zend_ini_scanner.lo
zend_ini_scanner.c: In function `ini_lex':
zend_ini_scanner.c:826: warning: label `find_rule' defined but not used
zend_ini_scanner.c: In function `yy_get_next_buffer':
zend_ini_scanner.c:1243: `errno' undeclared (first use in this function)
zend_ini_scanner.c:1243: (Each undeclared identifier is reported only once
zend_ini_scanner.c:1243: for each function it appears in.)
zend_ini_scanner.c:1243: `EINTR' undeclared (first use in this function)
./zend_ini_scanner.l: At top level:
zend_ini_scanner.c:1900: warning: `yy_flex_realloc' defined but not used
zend_ini_scanner.c:1350: warning: `yyunput' defined but not used
make[1]: *** [zend_ini_scanner.lo] Error 1
make[1]: Leaving directory `/opt/cvs/php4/Zend'
make: *** [all-recursive] Error 1

and here the diff between the both zend_ini_scanner.c versions:

--- Z/zend_ini_scanner.c        Thu Jan 10 01:28:37 2002
+++ Zend/zend_ini_scanner.c     Thu Jan 10 01:52:57 2002
@@ -698,9 +698,17 @@
                        YY_FATAL_ERROR( "input in flex scanner failed" ); \
                result = n; \
                } \
-       else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \
-                 && ferror( yyin ) ) \
-               YY_FATAL_ERROR( "input in flex scanner failed" );
+       errno=0; \
+       while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
+       { \
+               if( errno != EINTR) \
+               { \
+                       YY_FATAL_ERROR( "input in flex scanner failed" ); \
+                       break; \
+               } \
+               errno=0; \
+               clearerr(yyin); \
+       }
 #endif

and here the relevant part from the debian-changelog:


flex (2.5.4a-15) unstable; urgency=low

  * if a signal is delivered while the parser is in the read routine
    (coded by flex), the result is flex reports and YY_FATAL_ERROR causing
    plan to exit.  The race condition appears much more frequently than
    one might expect because plan spends a good deal of time in read
    routine while gcc is preparing the input. I cleaned up another problem
    case beyond what is given in the patch.                  closes: Bug#125611


I have no idea about this flex stuff, so maybe someone else out there can fix that :)


Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2002-01-09 21:00 UTC] mfischer@php.net
From the error message I'ld say you just need to include <errno.h> in zend_ini_scanner.l (like in zend_language_scanner.l), can you verify this?
 [2002-01-10 06:04 UTC] chregu@php.net
yep, it works with this additional line. 


 [2002-01-10 06:25 UTC] mfischer@php.net
Derick fixed it in CVS.
 [2003-08-01 17:55 UTC] svensk_tosing at hotmail dot com
Quote from uClibc mailing-list:

The problem is that php calls
fflush() on the opened stream prior to the fread() call.  According
to ANSI/ISO C99, calling fflush() on a readonly or currently reading
stream is _undefined_behavior_.  In uClibc, I chose to set the stream's
error indicator, set errno, and return failure.  So, when php calls
ferror() because fread() returned 0, it sees that the stream is in
an error state and assumes it was the read that failed.


(Thread http://www.uclibc.org/lists/uclibc/2003-June/006466.html )
 
PHP Copyright © 2001-2025 The PHP Group
All rights reserved.
Last updated: Wed May 07 21:01:30 2025 UTC