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/makefile.mak | 4 +++ plugins/nonbmp/makefile.mak | 18 ++++++++++ plugins/nonbmp/nonbmp.c | 87 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 109 insertions(+) create mode 100644 plugins/nonbmp/makefile.mak create mode 100644 plugins/nonbmp/nonbmp.c (limited to 'plugins') diff --git a/plugins/makefile.mak b/plugins/makefile.mak index b692c41f..6a44e34d 100644 --- a/plugins/makefile.mak +++ b/plugins/makefile.mak @@ -13,6 +13,8 @@ all: @-$(MAKE) /nologo /s /f makefile.mak $@ @cd ..\mpcinfo @-$(MAKE) /nologo /s /f makefile.mak $@ + @cd ..\nonbmp + @-$(MAKE) /nologo /s /f makefile.mak $@ @cd ..\python @-$(MAKE) /nologo /s /f makefile.mak $@ @cd ..\tcl @@ -45,6 +47,8 @@ clean: @-$(MAKE) /nologo /s /f makefile.mak clean $@ @cd ..\mpcinfo @-$(MAKE) /nologo /s /f makefile.mak clean $@ + @cd ..\nonbmp + @-$(MAKE) /nologo /s /f makefile.mak clean $@ @cd ..\python @-$(MAKE) /nologo /s /f makefile.mak clean $@ @cd ..\tcl diff --git a/plugins/nonbmp/makefile.mak b/plugins/nonbmp/makefile.mak new file mode 100644 index 00000000..1c28610d --- /dev/null +++ b/plugins/nonbmp/makefile.mak @@ -0,0 +1,18 @@ +include "..\..\src\makeinc.mak" + +all: nonbmp.obj nonbmp.def + link $(LDFLAGS) $(LIBS) /dll /out:xcnonbmp.dll /def:nonbmp.def nonbmp.obj + +nonbmp.def: + echo EXPORTS > nonbmp.def + echo xchat_plugin_init >> nonbmp.def + echo xchat_plugin_deinit >> nonbmp.def + +nonbmp.obj: nonbmp.c makefile.mak + cl $(CFLAGS) $(GLIB) /I.. nonbmp.c + +clean: + del *.obj + del *.dll + del *.exp + del *.lib 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