Bug 6808 - yn() does not set errno for overflow error.
Summary: yn() does not set errno for overflow error.
Status: RESOLVED FIXED
Alias: None
Product: glibc
Classification: Unclassified
Component: math (show other bugs)
Version: unspecified
: P2 normal
Target Milestone: ---
Assignee: Marek Polacek
URL:
Keywords:
Depends on: 14173
Blocks:
  Show dependency treegraph
 
Reported: 2008-07-31 12:39 UTC by Michael Kerrisk
Modified: 2020-05-26 10:33 UTC (History)
2 users (show)

See Also:
Host:
Target:
Build:
Last reconfirmed:
fweimer: security-


Attachments
test program (2.74 KB, text/plain)
2008-07-31 12:40 UTC, Michael Kerrisk
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Michael Kerrisk 2008-07-31 12:39:42 UTC
For an overflow error, yn() correctly raise an exception, but does not set
errno.  errno should be set to ERANGE.

Note: I haven't raised this bug against y0)_ and y1(), since, as far as I can
tell, one can't get overflow errors for these functions (on x86-32 at least). 
For example, if the argument is DBL_MIN:
y0(2.22507385850720138e-308)=-4.51052971007128576e+02
y1(2.22507385850720138e-308)=-2.86111748575702833e+307

In passing, it is worth noting that yn() does correctly set errno and raise the
right exception at least one other error (domain error), and also sets errno
correctly for an underflow error.

Background: 
On error, many glibc math functions both set errno and raise an exception
(fetestexcept(3)).  For example, the following  function all do this: acos(),
asin(), cosh(), sinh(), acosh(), asinh(), exp(), exp2(), ldexp(), log(),
log10(), log2().  However, there is much inconsistency.  Some functions raise an
exception, but don't set errno.  Some functions set errno for some errors, but
not others.  A few set errno, but don't raise an exception.  This series of bug
reports documents deviations from what I consider the ideal: all functions
should BOTH set errno AND raise an exception for all errors.

All of these reports relate to tests on glibc 2.8 (as provided by SUSE 11.0).
Comment 1 Michael Kerrisk 2008-07-31 12:40:42 UTC
Created attachment 2880 [details]
test program

Sample run showing the problem:

$ /tmp/mt_yn 10 dbl_min
errno == 0
fetestexcept() says:  FE_OVERFLOW FE_INEXACT
yn(10,2.22507385850720138e-308)=-inf
0 FE_OVERFLOW -inf
Comment 2 Joseph Myers 2012-03-01 21:00:56 UTC
Confirmed with current sources on both x86 and x86_64.
Comment 3 Marek Polacek 2012-05-09 12:40:48 UTC
I have a patch.
Comment 4 Marek Polacek 2012-07-25 11:00:26 UTC
Fixed.
Comment 5 Michael Kerrisk 2020-05-23 11:50:25 UTC
The fix was commit 354691b7b55d014b9a4d3a94e2f8f934870b6bff
glibc 2.17
Comment 6 Michael Kerrisk 2020-05-26 10:33:47 UTC
Manual page updated to note the bug fix.

--- a/man3/y0.3
+++ b/man3/y0.3
@@ -208,13 +208,10 @@ for this case.
 .TP
 Range error: result overflow
 .\" e.g., yn(10, 1e-40) on glibc 2.8/x86-32
-.\" .I errno
-.\" is set to
-.\" .BR ERANGE .
 .I errno
-is not set for this case.
-.\" FIXME . Is it intentional that errno is not set?
-.\" Bug raised: http://sources.redhat.com/bugzilla/show_bug.cgi?id=6808
+is set to
+.BR ERANGE
+(but see BUGS).
 An overflow floating-point exception
 .RB ( FE_OVERFLOW )
 is raised.
@@ -262,6 +259,12 @@ and no
 exception was raised.
 as POSIX.1-2004 requires.
 .PP
+Before glibc 2.17,
+.\" http://sources.redhat.com/bugzilla/show_bug.cgi?id=6808
+did not set
+.I errno
+for "range error: result underflow".
+.PP
 In glibc version 2.3.2 and earlier,
 .\" Actually, 2.3.2 is the earliest test result I have; so yet
 .\" to confirm if this error occurs only in 2.3.2.