Hi,
it appears that teststr has 2 failures on IRIX since quite a while -
at least since 1.4.2:
teststr : \Line 259: for '123545': errno was 89 not 0
|Line 285: strtoff failed for 1234
FAILED 2 of 13
Failed Tests Total Fail Failed %
===================================================
teststr 13 2 15.38%
I'm not sure where the 89 comes from - that would be ENOSYS, and that
doesn't happen in a simple test program that only uses apr_strtoff()
or apr_strtoi64(). If my tests are correct, the IRIX libc takes a
liberal approach to setting errno, i.e. the value is only relevant if
and only if the correct value is outside the range of representable
values - which is permissible accoring to my reading of the C11
standard.
Once apr_stroff() has failed, errno bounces back to the previous value,
e.g. 34 (ERANGE) whenever strtoll() (or apr_stroff() or apr_strtoi64()
is called, even if it is reset to 0 before the call and all arguments
are valid.
This behaviour is reproducable in a simple test program that only
uses strtoll() if the program is linked against libpthread.so.
The program below prints "errno: 34 off: 12345" as the last
line when linked against libpthread, and "errno: 0 off: 12345"
otherwise.
The patch below fixes teststr on IRIX, but I'm not convinced
that it is actually correct.
rainer
--- ../../src/apr-1.5.2/strings/apr_strings.c Thu Oct 15 00:52:54 CEST 2015
+++ apr_strings.c Thu Oct 15 01:12:16 CEST 2015
@@ -238,6 +238,7 @@
{
errno = 0;
*offset = APR_OFF_T_STRFN(nptr, endptr, base);
+ if ((*offset != APR_INT64_MIN) && (*offset != APR_INT64_MAX)) return
APR_FROM_OS_ERROR(0);
return APR_FROM_OS_ERROR(errno);
}
@@ -244,8 +245,11 @@
APR_DECLARE(apr_int64_t) apr_strtoi64(const char *nptr, char **endptr, int
base)
{
#ifdef APR_INT64_STRFN
+ apr_int64_t i;
errno = 0;
- return APR_INT64_STRFN(nptr, endptr, base);
+ i = APR_INT64_STRFN(nptr, endptr, base);
+ if ((i != APR_INT64_MIN) && (i != APR_INT64_MAX)) errno = 0;
+ return i;
#else
const char *s;
apr_int64_t acc;