This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[v3] libstdc++/4503
- To: gcc-patches at gcc dot gnu dot org
- Subject: [v3] libstdc++/4503
- From: Benjamin Kosnik <bkoz at redhat dot com>
- Date: Fri, 26 Oct 2001 00:20:55 -0700
Adds some error handling. Checks for valid descriptors before running
iconv_close.
tested x86-linux
-benjamin
2001-10-26 Benjamin Kosnik <bkoz@redhat.com>
libstdc++/4503
* config/locale/codecvt_specializations_ieee_1003.1-200x.h
(__enc_traits::~__enc_traits): Fix.
(__enc_traits::_M_init): Add error checking.
Index: config/locale/codecvt_specializations_ieee_1003.1-200x.h
===================================================================
RCS file: /cvs/gcc/gcc/libstdc++-v3/config/locale/codecvt_specializations_ieee_1003.1-200x.h,v
retrieving revision 1.1
diff -c -p -r1.1 codecvt_specializations_ieee_1003.1-200x.h
*** codecvt_specializations_ieee_1003.1-200x.h 2001/08/08 02:48:58 1.1
--- codecvt_specializations_ieee_1003.1-200x.h 2001/10/26 07:19:13
***************
*** 85,91 ****
: _M_in_desc(0), _M_out_desc(0), _M_ext_bom(0), _M_int_bom(0)
{
// __intc_end = whatever we are using internally, which is
! // UCS4 (linux)
// UCS2 == UNICODE (microsoft, java, aix, whatever...)
// XXX Currently don't know how to get this data from target system...
strcpy(_M_int_enc, "UCS4");
--- 85,91 ----
: _M_in_desc(0), _M_out_desc(0), _M_ext_bom(0), _M_int_bom(0)
{
// __intc_end = whatever we are using internally, which is
! // UCS4 (linux, solaris)
// UCS2 == UNICODE (microsoft, java, aix, whatever...)
// XXX Currently don't know how to get this data from target system...
strcpy(_M_int_enc, "UCS4");
***************
*** 121,147 ****
~__enc_traits()
{
! iconv_close(_M_in_desc);
! iconv_close(_M_out_desc);
}
- // Initializes
void
_M_init()
{
_M_in_desc = iconv_open(_M_int_enc, _M_ext_enc);
_M_out_desc = iconv_open(_M_ext_enc, _M_int_enc);
! if (_M_out_desc == iconv_t(-1) || _M_in_desc == iconv_t(-1))
! {
! // XXX Extended error checking.
! }
}
bool
_M_good()
{
! return _M_out_desc && _M_in_desc
! && _M_out_desc != iconv_t(-1) && _M_in_desc != iconv_t(-1);
}
const __desc_type*
--- 121,152 ----
~__enc_traits()
{
! __desc_type __err = reinterpret_cast<iconv_t>(-1);
! if (_M_in_desc && _M_in_desc != __err)
! iconv_close(_M_in_desc);
! if (_M_out_desc && _M_out_desc != __err)
! iconv_close(_M_out_desc);
}
void
_M_init()
{
+ __desc_type __err = reinterpret_cast<iconv_t>(-1);
_M_in_desc = iconv_open(_M_int_enc, _M_ext_enc);
+ if (_M_in_desc == __err)
+ __throw_runtime_error("creating iconv input descriptor failed.");
_M_out_desc = iconv_open(_M_ext_enc, _M_int_enc);
! if (_M_out_desc == __err)
! __throw_runtime_error("creating iconv output descriptor failed.");
}
bool
_M_good()
{
! __desc_type __err = reinterpret_cast<iconv_t>(-1);
! bool __test = _M_in_desc && _M_in_desc != __err;
! __test &= _M_out_desc && _M_out_desc != __err;
! return __test;
}
const __desc_type*