summary refs log tree commit diff stats
path: root/plugins/nonbmp/nonbmp.c
diff options
context:
space:
mode:
authorBerke Viktor <berkeviktor@aol.com>2012-01-18 09:25:05 +0100
committerBerke Viktor <berkeviktor@aol.com>2012-01-18 09:25:05 +0100
commit569cb3dbbfb854038f9ebcdb5a5374e1de6ec9c0 (patch)
tree5f072d7ce5b8280ec2f3a72fd2fb719f4c0b5a35 /plugins/nonbmp/nonbmp.c
parentffdd106588854aa66cdad1ad4bbac980b96df967 (diff)
add Non-BMP plugin against GTK+ exploits
Diffstat (limited to 'plugins/nonbmp/nonbmp.c')
-rw-r--r--plugins/nonbmp/nonbmp.c87
1 files changed, 87 insertions, 0 deletions
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 <stdlib.h>
+#include <glib.h>
+#include <string.h>
+
+#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