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