1
0
mirror of https://github.com/moparisthebest/hexchat synced 2024-11-29 12:42:16 -05:00

initial patch for filtering malicious characters on win32 (Khisanth)

This commit is contained in:
Berke Viktor 2012-01-20 00:38:57 +01:00
parent beac798c6e
commit a9fb6a18ec
3 changed files with 70 additions and 1 deletions

View File

@ -310,6 +310,11 @@ server_inline (server *serv, char *line, int len)
{ {
char *utf_line_allocated = NULL; char *utf_line_allocated = NULL;
#ifdef WIN32
char *cleaned_line;
int cleaned_len;
#endif
/* Checks whether we're set to use UTF-8 charset */ /* Checks whether we're set to use UTF-8 charset */
if (serv->using_irc || /* 1. using CP1252/UTF-8 Hybrid */ if (serv->using_irc || /* 1. using CP1252/UTF-8 Hybrid */
(serv->encoding == NULL && prefs.utf8_locale) || /* OR 2. using system default->UTF-8 */ (serv->encoding == NULL && prefs.utf8_locale) || /* OR 2. using system default->UTF-8 */
@ -396,12 +401,24 @@ server_inline (server *serv, char *line, int len)
} }
} }
#ifdef WIN32
cleaned_line = text_replace_non_bmp (line, len, &cleaned_len);
if (cleaned_line != NULL ) {
line = cleaned_line;
len = cleaned_len;
}
#endif
fe_add_rawlog (serv, line, len, FALSE); fe_add_rawlog (serv, line, len, FALSE);
url_check_line (line, len); url_check_line (line, len);
/* let proto-irc.c handle it */ /* let proto-irc.c handle it */
serv->p_inline (serv, line, len); serv->p_inline (serv, line, len);
#ifdef WIN32
g_free (cleaned_line);
#endif
if (utf_line_allocated != NULL) /* only if a special copy was allocated */ if (utf_line_allocated != NULL) /* only if a special copy was allocated */
g_free (utf_line_allocated); g_free (utf_line_allocated);
} }

View File

@ -275,7 +275,10 @@ scrollback_load (session *sess)
time_t stamp; time_t stamp;
int lines; int lines;
#ifndef WIN32 #ifdef WIN32
char *cleaned_text;
int cleaned_len;
#else
char *map, *end_map; char *map, *end_map;
struct stat statbuf; struct stat statbuf;
const char *begin, *eol; const char *begin, *eol;
@ -371,6 +374,12 @@ scrollback_load (session *sess)
if (text) if (text)
{ {
text = strip_color (text + 1, -1, STRIP_COLOR); text = strip_color (text + 1, -1, STRIP_COLOR);
cleaned_text = text_replace_non_bmp (text, -1, &cleaned_len);
if (cleaned_text != NULL)
{
g_free (text);
text = cleaned_text;
}
fe_print_text (sess, text, stamp); fe_print_text (sess, text, stamp);
g_free (text); g_free (text);
} }
@ -852,6 +861,46 @@ iso_8859_1_to_utf8 (unsigned char *text, int len, gsize *bytes_written)
return res; return res;
} }
#ifdef WIN32
/* replace characters outside of the Basic Multilingual Plane with
* replacement characters (0xFFFD) */
char *
text_replace_non_bmp (char *utf8_input, int input_length, glong *output_length)
{
gunichar *ucs4_text;
gunichar suspect;
gchar *utf8_text;
glong ucs4_length;
glong index;
ucs4_text = g_utf8_to_ucs4_fast (utf8_input, input_length, &ucs4_length);
/* replace anything not in the Basic Multilingual Plane
* (code points above 0xFFFF) with the replacement
* character */
for (index = 0; index < ucs4_length; index++)
{
suspect = ucs4_text[index];
if ((suspect >= 0x1D173 && suspect <= 0x1D17A)
|| (suspect >= 0xE0001 && suspect <= 0xE007F))
{
ucs4_text[index] = 0xFFFD; /* replacement character */
}
}
utf8_text = g_ucs4_to_utf8 (
ucs4_text,
ucs4_length,
NULL,
output_length,
NULL
);
g_free (ucs4_text);
return utf8_text;
}
#endif
char * char *
text_validate (char **text, int *len) text_validate (char **text, int *len)
{ {

View File

@ -28,6 +28,9 @@ int pevent_load (char *filename);
void pevent_make_pntevts (void); void pevent_make_pntevts (void);
void text_emit (int index, session *sess, char *a, char *b, char *c, char *d); void text_emit (int index, session *sess, char *a, char *b, char *c, char *d);
int text_emit_by_name (char *name, session *sess, char *a, char *b, char *c, char *d); int text_emit_by_name (char *name, session *sess, char *a, char *b, char *c, char *d);
#ifdef WIN32
char *text_replace_non_bmp (char *utf8_input, int input_length, glong *output_length);
#endif
char *text_validate (char **text, int *len); char *text_validate (char **text, int *len);
int get_stamp_str (char *fmt, time_t tim, char **ret); int get_stamp_str (char *fmt, time_t tim, char **ret);
void format_event (session *sess, int index, char **args, char *o, int sizeofo, unsigned int stripcolor_args); void format_event (session *sess, int index, char **args, char *o, int sizeofo, unsigned int stripcolor_args);