Fix behavior when converting a float infinity to numeric. float8_numeric() and float4_numeric() failed to consider the possibility that the input is an IEEE infinity. The results depended on the platform-specific behavior of sprintf(): on most platforms you'd get something like
ERROR: invalid input syntax for type numeric: "inf" but at least on Windows it's possible for the conversion to succeed and deliver a finite value (typically 1), due to a nonstandard output format from sprintf and lack of syntax error checking in these functions. Since our numeric type lacks the concept of infinity, a suitable conversion is impossible; the best thing to do is throw an explicit error before letting sprintf do its thing. While at it, let's use snprintf not sprintf. Overrunning the buffer should be impossible if sprintf does what it's supposed to, but this is cheap insurance against a stack smash if it doesn't. Problem reported by Taiki Kondo. Patch by me based on fix suggestion from KaiGai Kohei. Back-patch to all supported branches. Discussion: https://postgr.es/m/12a9442fbae80d4e8953883e0b84e088c8c...@bpxm01gp.gisp.nec.co.jp Branch ------ REL9_2_STABLE Details ------- https://git.postgresql.org/pg/commitdiff/72d4fd08ea63e2855c0b54317a09047455ff8369 Modified Files -------------- src/backend/utils/adt/numeric.c | 14 ++++++++++++-- src/test/regress/expected/numeric.out | 21 +++++++++++++++++++++ src/test/regress/sql/numeric.sql | 8 ++++++++ 3 files changed, 41 insertions(+), 2 deletions(-) -- Sent via pgsql-committers mailing list (pgsql-committers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-committers