CVS: rdesktop rdp.c,1.82,1.83

Michael Gernoth <[email protected]>
Newsgroups gmane.network.rdesktop.cvs
Message-ID <[email protected]>
Update of /cvsroot/rdesktop/rdesktop
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25157

Modified Files:
	rdp.c 
Log Message:
handle iconv-failure more gracefully


Index: rdp.c
===================================================================
RCS file: /cvsroot/rdesktop/rdesktop/rdp.c,v
retrieving revision 1.82
retrieving revision 1.83
diff -C2 -d -r1.82 -r1.83
*** rdp.c	14 Mar 2005 17:47:46 -0000	1.82
--- rdp.c	14 Mar 2005 18:02:24 -0000	1.83
***************
*** 60,63 ****
--- 60,67 ----
  #endif
  
+ #ifdef HAVE_ICONV
+ static BOOL g_iconv_works = True;
+ #endif
+ 
  /* Receive an RDP packet */
  static STREAM
***************
*** 162,208 ****
  	memset(pout, 0, len + 4);
  
! 	if (iconv_h == (iconv_t) - 1)
  	{
! 		size_t i = 1, o = 4;
! 		if ((iconv_h = iconv_open(WINDOWS_CODEPAGE, g_codepage)) == (iconv_t) - 1)
  		{
! 			printf("rdp_out_unistr: iconv_open[%s -> %s] fail %d\n",
! 			       g_codepage, WINDOWS_CODEPAGE, (int) iconv_h);
! 			return;
  		}
! 		if (iconv(iconv_h, (ICONV_CONST char **) &pin, &i, &pout, &o) == (size_t) - 1)
  		{
  			iconv_close(iconv_h);
  			iconv_h = (iconv_t) - 1;
! 			printf("rdp_out_unistr: iconv(1) fail, errno %d\n", errno);
! 			return;
  		}
- 		pin = string;
- 		pout = (char *) s->p;
- 	}
  
! 	if (iconv(iconv_h, (ICONV_CONST char **) &pin, &ibl, &pout, &obl) == (size_t) - 1)
! 	{
! 		iconv_close(iconv_h);
! 		iconv_h = (iconv_t) - 1;
! 		printf("rdp_out_unistr: iconv(2) fail, errno %d\n", errno);
! 		return;
! 	}
  
! 	s->p += len + 2;
  
! #else /* HAVE_ICONV undef */
! 	int i = 0, j = 0;
  
! 	len += 2;
  
! 	while (i < len)
! 	{
! 		s->p[i++] = string[j++];
! 		s->p[i++] = 0;
  	}
- 
- 	s->p += len;
- #endif
  }
  
--- 166,224 ----
  	memset(pout, 0, len + 4);
  
! 	if (g_iconv_works)
  	{
! 		if (iconv_h == (iconv_t) - 1)
  		{
! 			size_t i = 1, o = 4;
! 			if ((iconv_h = iconv_open(WINDOWS_CODEPAGE, g_codepage)) == (iconv_t) - 1)
! 			{
! 				warning("rdp_out_unistr: iconv_open[%s -> %s] fail %d\n",
! 					g_codepage, WINDOWS_CODEPAGE, (int) iconv_h);
! 
! 				g_iconv_works = False;
! 				return (rdp_out_unistr(s, string, len));
! 			}
! 			if (iconv(iconv_h, (ICONV_CONST char **) &pin, &i, &pout, &o) ==
! 			    (size_t) - 1)
! 			{
! 				iconv_close(iconv_h);
! 				iconv_h = (iconv_t) - 1;
! 				warning("rdp_out_unistr: iconv(1) fail, errno %d\n", errno);
! 
! 				g_iconv_works = False;
! 				return (rdp_out_unistr(s, string, len));
! 			}
! 			pin = string;
! 			pout = (char *) s->p;
  		}
! 
! 		if (iconv(iconv_h, (ICONV_CONST char **) &pin, &ibl, &pout, &obl) == (size_t) - 1)
  		{
  			iconv_close(iconv_h);
  			iconv_h = (iconv_t) - 1;
! 			warning("rdp_out_unistr: iconv(2) fail, errno %d\n", errno);
! 
! 			g_iconv_works = False;
! 			return (rdp_out_unistr(s, string, len));
  		}
  
! 		s->p += len + 2;
  
! 	}
! 	else
! #endif
! 	{
! 		int i = 0, j = 0;
  
! 		len += 2;
  
! 		while (i < len)
! 		{
! 			s->p[i++] = string[j++];
! 			s->p[i++] = 0;
! 		}
  
! 		s->p += len;
  	}
  }
  
***************
*** 219,251 ****
  	static iconv_t iconv_h = (iconv_t) - 1;
  
! 	if (iconv_h == (iconv_t) - 1)
  	{
! 		if ((iconv_h = iconv_open(g_codepage, WINDOWS_CODEPAGE)) == (iconv_t) - 1)
  		{
! 			printf("rdp_in_unistr: iconv_open[%s -> %s] fail %d\n",
! 			       WINDOWS_CODEPAGE, g_codepage, (int) iconv_h);
! 			return 0;
  		}
- 	}
  
! 	if (iconv(iconv_h, (ICONV_CONST char **) &pin, &ibl, &pout, &obl) == (size_t) - 1)
! 	{
! 		iconv_close(iconv_h);
! 		iconv_h = (iconv_t) - 1;
! 		printf("rdp_in_unistr: iconv fail, errno %d\n", errno);
! 		return 0;
! 	}
! 	return pout - string;
! #else /* HAVE_ICONV undef */
! 	int i = 0;
  
! 	while (i < uni_len / 2)
! 	{
! 		in_uint8a(s, &string[i++], 1);
! 		in_uint8s(s, 1);
  	}
! 
! 	return i - 1;
  #endif
  }
  
--- 235,276 ----
  	static iconv_t iconv_h = (iconv_t) - 1;
  
! 	if (g_iconv_works)
  	{
! 		if (iconv_h == (iconv_t) - 1)
  		{
! 			if ((iconv_h = iconv_open(g_codepage, WINDOWS_CODEPAGE)) == (iconv_t) - 1)
! 			{
! 				warning("rdp_in_unistr: iconv_open[%s -> %s] fail %d\n",
! 					WINDOWS_CODEPAGE, g_codepage, (int) iconv_h);
! 
! 				g_iconv_works = False;
! 				return rdp_in_unistr(s, string, uni_len);
! 			}
  		}
  
! 		if (iconv(iconv_h, (ICONV_CONST char **) &pin, &ibl, &pout, &obl) == (size_t) - 1)
! 		{
! 			iconv_close(iconv_h);
! 			iconv_h = (iconv_t) - 1;
! 			warning("rdp_in_unistr: iconv fail, errno %d\n", errno);
  
! 			g_iconv_works = False;
! 			return rdp_in_unistr(s, string, uni_len);
! 		}
! 		return pout - string;
  	}
! 	else
  #endif
+ 	{
+ 		int i = 0;
+ 
+ 		while (i < uni_len / 2)
+ 		{
+ 			in_uint8a(s, &string[i++], 1);
+ 			in_uint8s(s, 1);
+ 		}
+ 
+ 		return i - 1;
+ 	}
  }
  



-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now.
http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.