Thread
Commits
-
Fix range check in ECPG numeric to int conversion
- 231c19a8987a 10.18 landed
- cfcb0ceabde1 9.6.23 landed
- f051b87ace6d 14.0 landed
- 171bf1cea579 13.4 landed
- c7181a32c57d 11.13 landed
- d9589eb62a2b 12.8 landed
- 5fcf3945bd90 15.0 landed
-
BUG #17128: minimum numeric 'integer' is -2147483647 not -2147483648 as documented
The Post Office <noreply@postgresql.org> — 2021-07-29T22:35:01Z
The following bug has been logged on the website: Bug reference: 17128 Logged by: Kevin Sweet Email address: kjs@teews.com PostgreSQL version: 13.2 Operating system: RHEL6, RHEL7, Solaris11 Description: I submitted a similar report to the documentation mailing list so you can decide whether to update the documentation or the code. The PGTYPESnumeric_to_int function deems -2147483648 to be invalid even though it is a perfectly valid 32-bit integer because the code compares to -INT_MAX which resolves to -2147483647 on the Fedora/Red Hat and Solaris versions I have available to check against. diff --git a/doc/src/sgml/ecpg.sgml b/doc/src/sgml/ecpg.sgml index 7266e229a4..0e89f23c73 100644 --- a/doc/src/sgml/ecpg.sgml +++ b/doc/src/sgml/ecpg.sgml @@ -8666,7 +8666,7 @@ int dectoint(decimal *np, int *ip); Note that the ECPG implementation differs from the <productname>Informix</productname> implementation. <productname>Informix</productname> limits an integer to the range from -32767 to 32767, while the limits in the ECPG implementation depend on the - architecture (<literal>-INT_MAX .. INT_MAX</literal>). + architecture (<literal>(-INT_MAX - 1) .. INT_MAX</literal>). </para> </listitem> </varlistentry> diff --git a/src/interfaces/ecpg/pgtypeslib/numeric.c b/src/interfaces/ecpg/pgtypeslib/numeric.c index 060fad7867..4e6c9910dc 100644 --- a/src/interfaces/ecpg/pgtypeslib/numeric.c +++ b/src/interfaces/ecpg/pgtypeslib/numeric.c @@ -1505,7 +1505,7 @@ PGTYPESnumeric_to_int(numeric *nv, int *ip) if ((i = PGTYPESnumeric_to_long(nv, &l)) != 0) return i; - if (l < -INT_MAX || l > INT_MAX) + if (l < (-INT_MAX - 1) || l > INT_MAX) { errno = PGTYPES_NUM_OVERFLOW; return -1; -
Re: BUG #17128: minimum numeric 'integer' is -2147483647 not -2147483648 as documented
John Naylor <john.naylor@enterprisedb.com> — 2021-07-30T15:05:14Z
On Fri, Jul 30, 2021 at 7:53 AM PG Bug reporting form < noreply@postgresql.org> wrote: > The PGTYPESnumeric_to_int function deems -2147483648 to be invalid even > though it is a perfectly valid 32-bit integer because the code compares to > -INT_MAX which resolves to -2147483647 on the Fedora/Red Hat and Solaris > versions I have available to check against. > - if (l < -INT_MAX || l > INT_MAX) > + if (l < (-INT_MAX - 1) || l > INT_MAX) Yeah, that looks like it should be INT_MIN instead. I'll see about making that happen. Thanks for the report! -- John Naylor EDB: http://www.enterprisedb.com
-
Re: BUG #17128: minimum numeric 'integer' is -2147483647 not -2147483648 as documented
Tom Lane <tgl@sss.pgh.pa.us> — 2021-07-30T15:14:32Z
John Naylor <john.naylor@enterprisedb.com> writes: > On Fri, Jul 30, 2021 at 7:53 AM PG Bug reporting form < > noreply@postgresql.org> wrote: >> - if (l < -INT_MAX || l > INT_MAX) >> + if (l < (-INT_MAX - 1) || l > INT_MAX) > Yeah, that looks like it should be INT_MIN instead. I'll see about making > that happen. Thanks for the report! The whole stanza perhaps ought to be within #if SIZEOF_LONG > SIZEOF_INT otherwise some compilers will bleat about useless tests. (I looked at PGTYPESnumeric_to_long and it seems like it will do the right thing for 32-bit long, assuming strtol does.) regards, tom lane
-
Re: BUG #17128: minimum numeric 'integer' is -2147483647 not -2147483648 as documented
John Naylor <john.naylor@enterprisedb.com> — 2021-07-30T17:56:30Z
On Fri, Jul 30, 2021 at 11:14 AM Tom Lane <tgl@sss.pgh.pa.us> wrote: > > John Naylor <john.naylor@enterprisedb.com> writes: > > On Fri, Jul 30, 2021 at 7:53 AM PG Bug reporting form < > > noreply@postgresql.org> wrote: > >> - if (l < -INT_MAX || l > INT_MAX) > >> + if (l < (-INT_MAX - 1) || l > INT_MAX) > > > Yeah, that looks like it should be INT_MIN instead. I'll see about making > > that happen. Thanks for the report! > > The whole stanza perhaps ought to be within > > #if SIZEOF_LONG > SIZEOF_INT > > otherwise some compilers will bleat about useless tests. Here's a draft fix for master, with regression tests. It will need a bit of massaging for the back branches -- the problem goes back at least to 9.6. -- John Naylor EDB: http://www.enterprisedb.com
-
Re: BUG #17128: minimum numeric 'integer' is -2147483647 not -2147483648 as documented
Tom Lane <tgl@sss.pgh.pa.us> — 2021-07-30T19:22:07Z
John Naylor <john.naylor@enterprisedb.com> writes: > Here's a draft fix for master, with regression tests. Passes an eyeball check, though I didn't run the test. > It will need a bit of > massaging for the back branches -- the problem goes back at least to 9.6. I'm sure it's quite ancient ... ecpg hasn't changed much in a Long Time. regards, tom lane
-
Re: BUG #17128: minimum numeric 'integer' is -2147483647 not -2147483648 as documented
John Naylor <john.naylor@enterprisedb.com> — 2021-07-30T20:44:48Z
On Fri, Jul 30, 2021 at 3:22 PM Tom Lane <tgl@sss.pgh.pa.us> wrote: > > John Naylor <john.naylor@enterprisedb.com> writes: > > Here's a draft fix for master, with regression tests. > > Passes an eyeball check, though I didn't run the test. Pushed, thanks for looking! I'll keep an eye on the build farm. -- John Naylor EDB: http://www.enterprisedb.com