> On Fri, 5 Sep 2008 21:27:09 +1000
> Mark Wright <markwright@internode.on.net> wrote:
>
> Anyway I was wondering if it might help to make the
> just_in_case_buf buffer large to try to work around Solaris 10's
> strxfrm() insanity?
The trouble with that idea though is the concern that strxfrm()
on Solaris 10u5 may still overwrite past the end of the buffer
no matter how large I made just_in_case_buf.
So I instead propose this fix:
goanna% diff -wc stdcxx-4.2.1/src/orig/collate.cpp stdcxx-4.2.1/src/collate.cpp
*** stdcxx-4.2.1/src/orig/collate.cpp 2008-04-25 10:25:19.000000000 +1000
--- stdcxx-4.2.1/src/collate.cpp 2008-09-05 22:00:05.074726012 +1000
***************
*** 522,531 ****
--- 522,537 ----
src += (last - src) + 1;
}
+ #if defined(__sun) && defined(__SVR4)
+ // Solaris 10u5 overwrites memory past the end of
+ // just_in_case_buf[8], to avoid this, pass a 0 pointer
+ char *just_in_case_buf = (char *)0;
+ #else
// provide a destination buffer to strxfrm() in case
// it's buggy (such as MSVC's) and tries to write to
// the buffer even if it's 0
char just_in_case_buf [8];
+ #endif
const _RWSTD_SIZE_T dst_size = strxfrm (just_in_case_buf, psrc, 0);
// check for strxfrm() errors
goanna%
I tested this with my test program on Solaris 10u5 with
Sun Studio 12 C++, it works fine.
Thanks very much, Mark
--
|