This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

[v3] libstdc++/4503



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* 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]