Tom Lane wrote:
> "Dave Page" <dpage@vale-housing.co.uk> writes:
> > However.... In all but one place in libpq, we don't use errno anyway
> > (actually 2, but one is a bug anyway) because we use GetLastError()
> > instead (which tested thread safe as well FWIW). The only place it's
> > used is PQoidValue():
> 
> >     result = strtoul(res->cmdStatus + 7, &endptr, 10);
> 
> >     if (!endptr || (*endptr != ' ' && *endptr != '\0') || errno ==
> > ERANGE)
> >             return InvalidOid;
> >     else
> >             return (Oid) result;
> 
> > We don't believe strtoul() works with GetLastError() unfortunately. One
> > (hackish) solution would be to check that it doesn't return 0 or
> > ULONG_MAX.
> 
> I'm not sure why we bother with an overflow check there at all.  It'd be
> worth checking that there is a digit at cmdStatus + 7, but as long as
> there is one, it's difficult to see why an overflow check is needed.
> 
> The only justification that comes to mind is that if someday there are
> versions of Postgres that have 64-bit OIDs, you could get an overflow
> here if you had a 32-bit-OID libpq talking to a 64-bit server.  However,
> I don't see a particularly good reason to return InvalidOid instead of
> an overflowed value anyway in that situation.  For PQoidValue,
> InvalidOid is supposed to mean "there is no OID in this command status"
> not "there is an OID but I cannot represent it".

I disabled the check on Win32, and added a comment explaining why.  We
could disable it just when we use thread-safety, but changing the
behavior for threading didn't seems wise.

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
Index: src/interfaces/libpq/fe-exec.c
===================================================================
RCS file: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v
retrieving revision 1.170
diff -c -c -r1.170 fe-exec.c
*** src/interfaces/libpq/fe-exec.c      2 Jul 2005 17:01:54 -0000       1.170
--- src/interfaces/libpq/fe-exec.c      12 Aug 2005 23:58:16 -0000
***************
*** 2166,2172 ****
  #endif
        result = strtoul(res->cmdStatus + 7, &endptr, 10);
  
!       if (!endptr || (*endptr != ' ' && *endptr != '\0') || errno == ERANGE)
                return InvalidOid;
        else
                return (Oid) result;
--- 2166,2180 ----
  #endif
        result = strtoul(res->cmdStatus + 7, &endptr, 10);
  
!       if (!endptr || (*endptr != ' ' && *endptr != '\0')
! #ifndef WIN32
!       /*
!        *      On WIN32, errno is not thread-safe and GetLastError() isn't set 
by
!        *      strtoul(), so we can't check on this platform.
!        */
!  || errno == ERANGE
! #endif
!               )
                return InvalidOid;
        else
                return (Oid) result;
---------------------------(end of broadcast)---------------------------
TIP 3: Have you checked our extensive FAQ?

               http://www.postgresql.org/docs/faq

Reply via email to