From 569cb3dbbfb854038f9ebcdb5a5374e1de6ec9c0 Mon Sep 17 00:00:00 2001 From: Berke Viktor Date: Wed, 18 Jan 2012 09:25:05 +0100 Subject: add Non-BMP plugin against GTK+ exploits --- plugins/nonbmp/nonbmp.c | 87 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 plugins/nonbmp/nonbmp.c (limited to 'plugins/nonbmp/nonbmp.c') diff --git a/plugins/nonbmp/nonbmp.c b/plugins/nonbmp/nonbmp.c new file mode 100644 index 00000000..fe9571b7 --- /dev/null +++ b/plugins/nonbmp/nonbmp.c @@ -0,0 +1,87 @@ +#include +#include +#include + +#include "xchat-plugin.h" + +static xchat_plugin *ph; +static const char name[] = "Non-BMP"; +static const char desc[] = "Replace non-BMP characters with replacment characters"; +static const char version[] = "1.0000"; +static int recursing = 0; + +static int filter( + char *word[], + char *word_eol[], + void *unused +) { + gunichar *line; + gchar *utf8_line; + glong length; + glong index; + + if( recursing ) { + return XCHAT_EAT_NONE; + } + + /* the input has already been checked so we can use the _fast version */ + line = g_utf8_to_ucs4_fast( + (char *)word_eol[1], + -1, /* NUL terminated input */ + &length + ); + + for( index = 0; index < length; index++ ) { + if( line[ index ] > 0xFFFF ) { + line[ index ] = 0xFFFD; /* replacement character */ + } + } + + utf8_line = g_ucs4_to_utf8( + line, + -1, /* NUL terminated input */ + NULL, /* items read */ + NULL, /* items written */ + NULL /* ignore conversion error */ + ); + + if( utf8_line == NULL ) { + /* conversion failed ... I guess we are screwed? */ + g_free( line ); + return XCHAT_EAT_NONE; + } + + recursing = 1; + xchat_commandf( ph, "RECV %s", utf8_line ); + recursing = 0; + + g_free( line ); + g_free( utf8_line ); + return XCHAT_EAT_ALL; +} + +int xchat_plugin_init( + xchat_plugin *plugin_handle, + char **plugin_name, + char **plugin_desc, + char **plugin_version, + char *arg +) { +/* int index = 0;*/ + + ph = plugin_handle; + *plugin_name = name; + *plugin_desc = desc; + *plugin_version = version; + + xchat_hook_server( ph, "RAW LINE", XCHAT_PRI_HIGHEST, filter, (void *)NULL ); + xchat_printf (ph, "%s plugin loaded\n", name); + return 1; +} + +int +xchat_plugin_deinit (void) +{ + xchat_printf (ph, "%s plugin unloaded\n", name); + return 1; +} \ No newline at end of file -- cgit 1.4.1 From 405a2965e0e256d80d93b7325a9dcc6c5fd1ecd4 Mon Sep 17 00:00:00 2001 From: Berke Viktor Date: Wed, 18 Jan 2012 09:47:08 +0100 Subject: typofix --- plugins/nonbmp/nonbmp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'plugins/nonbmp/nonbmp.c') diff --git a/plugins/nonbmp/nonbmp.c b/plugins/nonbmp/nonbmp.c index fe9571b7..824c395e 100644 --- a/plugins/nonbmp/nonbmp.c +++ b/plugins/nonbmp/nonbmp.c @@ -6,7 +6,7 @@ static xchat_plugin *ph; static const char name[] = "Non-BMP"; -static const char desc[] = "Replace non-BMP characters with replacment characters"; +static const char desc[] = "Replace non-BMP characters with replacement characters"; static const char version[] = "1.0000"; static int recursing = 0; -- cgit 1.4.1