On Thu, May 02, 2013 at 04:21:49PM +0200, Petr Pisar wrote:
> On Wed, May 01, 2013 at 05:51:40PM +0100, [email protected] wrote:
> > I have put a release candidate for the 8.33 release here:
> > 
> This release is not good. Tests fail on 64-bit PowerPC (they pass on 32-bit
> PowerPC):
> 
>  /(*LIMIT_MATCH=3000)(a+)*zz/I
>  Capturing subpattern count = 1
> -Match limit = 3000
> +Match limit = 0
>  No options
>  No first char
>  Need char = 'z'
> 
I think that's because pcre_fullinfo() dereferences the destination pointer
without respect to the size of the referenced type:

  case PCRE_INFO_MATCHLIMIT:
  if ((re->flags & PCRE_MLSET) == 0) return PCRE_ERROR_UNSET;
  *((unsigned long int *)where) = re->limit_match;
  break;

However the `where' is declared in pcretest as pcre_uint32 which is variadic
type:

  #if UINT_MAX == 4294967295U
  typedef unsigned int pcre_uint32;
  typedef int pcre_int32;
  #define PCRE_UINT32_MAX UINT_MAX
  #define PCRE_INT32_MAX INT_MAX
  #elif ULONG_MAX == 4294967295UL
  typedef unsigned long int pcre_uint32;
  typedef long int pcre_int32;
  #define PCRE_UINT32_MAX ULONG_MAX
  #define PCRE_INT32_MAX LONG_MAX
  #else
  #error Cannot determine a type for 32-bit integers
  #endif

64-bit PowerPC is the first case where pcre_uint32 gets 4 bytes as `unsingned
int'. And because it's big-endian the assignement in pcre_fullinfo() will
store the data off 4 bytes.

The same problem can be seen at PCRE_INFO_RECURSIONLIMIT.

-- Petr

Attachment: pgpw2wrOqeP9S.pgp
Description: PGP signature

-- 
## List details at https://lists.exim.org/mailman/listinfo/pcre-dev 

Reply via email to