From c996c7f5739863332baceafb48d9514fad60aa46 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 28 Dec 2000 01:51:15 +0000 Subject: [PATCH] Let's try this again on accepting the correct range of Oid input values for 64-bit platforms ... --- src/backend/utils/adt/oid.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/backend/utils/adt/oid.c b/src/backend/utils/adt/oid.c index 6becfd0dbc..f7ed19f69b 100644 --- a/src/backend/utils/adt/oid.c +++ b/src/backend/utils/adt/oid.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/oid.c,v 1.42 2000/12/22 21:36:09 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/oid.c,v 1.43 2000/12/28 01:51:15 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -67,14 +67,21 @@ oidin_subr(const char *funcname, const char *s, char **endloc) result = (Oid) cvt; /* - * Cope with possibility that unsigned long is wider than Oid. + * Cope with possibility that unsigned long is wider than Oid, + * in which case strtoul will not raise an error for some values + * that are out of the range of Oid. + * + * For backwards compatibility, we want to accept inputs that + * are given with a minus sign, so allow the input value if it + * matches after either signed or unsigned extension to long. * * To ensure consistent results on 32-bit and 64-bit platforms, * make sure the error message is the same as if strtoul() had * returned ERANGE. */ -#if OID_MAX < ULONG_MAX - if (cvt > (unsigned long) OID_MAX) +#if OID_MAX != ULONG_MAX + if (cvt != (unsigned long) result && + cvt != (unsigned long) ((int) result)) elog(ERROR, "%s: error reading \"%s\": %s", funcname, s, strerror(ERANGE)); #endif