Erlang Mailing Lists

Author Message

<  Erlang patches mailing list  ~  unix/sys_float.c mishandles errno

mdempsky
Posted: Wed Jan 09, 2008 12:49 am Reply with quote
User Joined: 24 Sep 2007 Posts: 118
The code in unix/sys_float.c assumes that if strtod(3) sets errno to
ERANGE then there was a problem parsing the value. However, according
to POSIX, the actual indication of an error is that it also returned
0.0, HUGE_VAL, or -HUGE_VAL. This causes a problem on OS X 10.5 when
trying to read denormalized floating-point numbers because OS X's
strtod(3) implementation sets errno to ERANGE for denormals.

The patch below changes the errno check to be consistent with POSIX.

--- sys_float.c.orig 2008-01-02 10:38:16.000000000 -0800
+++ sys_float.c 2008-01-02 10:39:55.000000000 -0800
@@ -705,9 +705,7 @@
if (*s) /* That should be it */
return -1;

-#ifdef NO_FPE_SIGNALS
errno = 0;
-#endif
__ERTS_FP_CHECK_INIT(fpexnp);
*fp = strtod(buf, &t);
__ERTS_FP_ERROR_THOROUGH(fpexnp, *fp, return -1);
@@ -720,14 +718,14 @@
__ERTS_FP_ERROR_THOROUGH(fpexnp, *fp, return -1);
}

+ if ((*fp == 0.0 || *fp == HUGE_VAL || *fp == -HUGE_VAL) && errno
== ERANGE) {
#ifdef DEBUG
- if (errno == ERANGE)
fprintf(stderr, "errno = ERANGE in list_to_float\n\r");
#endif
#ifdef NO_FPE_SIGNALS
- if (errno == ERANGE)
return -1;
#endif
+ }
/*
** Replaces following code:
** if (errno == ERANGE) {
_______________________________________________
erlang-patches mailing list
erlang-patches@erlang.org
http://www.erlang.org/mailman/listinfo/erlang-patches
Post recived from mailinglist
View user's profile Send private message

Display posts from previous:  

All times are GMT
Page 1 of 1
This forum is locked: you cannot post, reply to, or edit topics.

Jump to:  

You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You cannot download files in this forum