This has been fixed in the second way suggested. Thanks for finding this out. The new release is available from http://gnuwin32.sourceforge.net/ Also, Regex-GNU has been changed into a hidden project, and shouldn't be visible anymore.
Kees Zeelenberg ----- Original Message ----- From: "Tor Lillqvist" <[EMAIL PROTECTED]> To: <GnuWin32-Users@lists.sourceforge.net> Sent: Wednesday, December 13, 2006 1:50 PM Subject: Re: [GnuWin32-Users] RegEx-GNU distribution considered harmful > Tor Lillqvist writes: > > (The current gnuwin32 build of RegEx-Spencer, "3.8.g.3", uses the DLL > > name rxspencer.dll. Good.) > > And whoopee, it turns out that there is a dangerous flaw in the > 3.8.g.3 version of the RegEx-Spencer library as distributed by > gnuwin32. > > The obsoleted 3.8 version (which is very hard to find from the > gnuwin32 site, I found it last week, but can't find it now...) works > correctly, but as I said in my previous message, confusingly uses the > same name for the DLL as gnuwin32's build of RegEx-GNU does. > > Try this simple test program against both versions of the > RegEx-Spencer library. Build it in a clean mingw environment or in > MSVC. > > #include <stdio.h> > #include <sys/types.h> > #include <regex.h> > > int > main (int argc, char **argv) > { > const char *pattern = "[ \t]*<mailto:([^@>]+)@?([^ \n\t\r>]*)"; > const char *string = " <mailto:[EMAIL PROTECTED]>"; > regex_t re; > int j, rc; > regmatch_t match[3]; > > rc = regcomp (&re, pattern, REG_EXTENDED|REG_ICASE); > > for (j=0;j<3;j++) > { > match[j].rm_so = -1; > match[j].rm_eo = -1; > } > > rc = regexec (&re, string, 3, match, 0); > > printf ("Should have matched, rc=%d, > match={(%ld,%ld),(%ld,%ld),(%ld,%ld)}\n", > rc, > match[0].rm_so, match[0].rm_eo, > match[1].rm_so, match[1].rm_eo, > match[2].rm_so, match[2].rm_eo); > > return 0; > } > > When run against the 3.8.g.3 DLL, you will see that the match array is > filled in incorrectly after the match: > > Should have matched, rc=0, match={(0,0),(46,0),(9,0)} > > If you build it with MSVC, it will even crash after printing that... > > When run against the RegEx-Spencer 3.8 DLL (called regex.dll, but not > the same as the regex.dll in RegEx-GNU), the result is correct: > > Should have matched, rc=0, match={(0,46),(9,24),(25,46)} > > It turns out that the 3.8.g.3 version of the RegEx-Spencer library > seems to have been built in an environment where off_t is long long, > not long like it is in the Mircosoft C library and mingw. What the > heck? > > This is horrible. It means that the RegEx-Spencer library thinks the > regmatch_t struct is 16 bytes (two long longs), while normal > mingw-compiled code thinks it is 8 bytes (two longs). It means that > when calling regexec(), it will overwrite the match array, scribbling > over whatever happens to be allocated after it in memory. (This > presumably explains the crash when the above program has been built > with MSVC, it happens to scribble over main's return address on the > stack, or something like that.) > > To see this horror in action, add some variables before and after the > "match" array in the sample code above, and print out their values > before and after the regexec() call. > > Please, fix this as soon as possible. > > Either 1) Recompile RegEx-Spencer in a proper mingw environment > without any mysterious add-on secret sauce that redefines off_t. (In > this case, remember that you *must* also use a different name for the > fixed DLL, as it is no longer ABI compatible with the old > rxspencer.dll. This will also make it stand out that executables that > link to the new rxspencer-1.dll (or whatever you choose to call it) > aren't expected to work with the old one.) > > Or, 2) modify the regex.h to spell out that regoff_t is explicitly > typedeffed as long long. In this case no new DLL name or "bin" package > is necessary, but a new version of the "lib" package with the modified > regex.h is of course needed. > > --tml > > P.S. I guess the "secret sauce" that redefines off_t as long long is > the "libgw32c" library? But surely using that should not be a > requirement for users of packages like RegEx-Spencer? If the intention > really is that it is a requirement, then some mechanism should be > introduced that causes an error if one tries to include <regex.h> in a > non-libgw32c-modified environment. > > > ------------------------------------------------------------------------- > Take Surveys. Earn Cash. Influence the Future of IT > Join SourceForge.net's Techsay panel and you'll get the chance to share > your > opinions on IT & business topics through brief surveys - and earn cash > http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV > _______________________________________________ > GnuWin32-Users mailing list > GnuWin32-Users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/gnuwin32-users > > > ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ GnuWin32-Users mailing list GnuWin32-Users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/gnuwin32-users