Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 18 Nov 2015 18:52:30 +0000 (UTC)
From:      Koop Mast <kwm@FreeBSD.org>
To:        ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org
Subject:   svn commit: r401888 - in head/x11/libxklavier: . files
Message-ID:  <201511181852.tAIIqUTD024582@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kwm
Date: Wed Nov 18 18:52:30 2015
New Revision: 401888
URL: https://svnweb.freebsd.org/changeset/ports/401888

Log:
  When LANG is set to ru_RU.UTF-8 for example xfce4-keyboard-settings would
  segfault. This was due to libxklavier passing invalid UTF-8 strings to
  a few glib functions which require a UTF-8 string.
  
  Add code to libxklavier to pass correct UTF-8 string to glib.
  
  Submitted by:	rum1cro@yandex.ru

Added:
  head/x11/libxklavier/files/
  head/x11/libxklavier/files/patch-utf8.c   (contents, props changed)
  head/x11/libxklavier/files/patch-xklavier_config.c   (contents, props changed)
Modified:
  head/x11/libxklavier/Makefile

Modified: head/x11/libxklavier/Makefile
==============================================================================
--- head/x11/libxklavier/Makefile	Wed Nov 18 18:26:11 2015	(r401887)
+++ head/x11/libxklavier/Makefile	Wed Nov 18 18:52:30 2015	(r401888)
@@ -3,6 +3,7 @@
 
 PORTNAME=	libxklavier
 PORTVERSION=	5.3
+PORTREVISION=	1
 PORTEPOCH=	1
 CATEGORIES=	x11 gnome
 MASTER_SITES=	GNOME

Added: head/x11/libxklavier/files/patch-utf8.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/x11/libxklavier/files/patch-utf8.c	Wed Nov 18 18:52:30 2015	(r401888)
@@ -0,0 +1,64 @@
+--- libxklavier/utf8.c	1970-01-01 03:00:00.000000000 +0300
++++ libxklavier/utf8.c	2015-11-18 01:50:50.406110000 +0300
+@@ -0,0 +1,61 @@
++/*
++ * The utf8_check() function scans the '\0'-terminated string starting
++ * at s. It returns a pointer to the first byte of the first malformed
++ * or overlong UTF-8 sequence found, or NULL if the string contains
++ * only correct UTF-8. It also spots UTF-8 sequences that could cause
++ * trouble if converted to UTF-16, namely surrogate characters
++ * (U+D800..U+DFFF) and non-Unicode positions (U+FFFE..U+FFFF). This
++ * routine is very likely to find a malformed sequence if the input
++ * uses any other encoding than UTF-8. It therefore can be used as a
++ * very effective heuristic for distinguishing between UTF-8 and other
++ * encodings.
++ *
++ * I wrote this code mainly as a specification of functionality; there
++ * are no doubt performance optimizations possible for certain CPUs.
++ *
++ * Markus Kuhn <http://www.cl.cam.ac.uk/~mgk25/>; -- 2005-03-30
++ * License: http://www.cl.cam.ac.uk/~mgk25/short-license.html
++ */
++
++
++guchar *
++utf8_check(guchar *s)
++{
++	while (*s) {
++		if (*s < 0x80)
++			/* 0xxxxxxx */
++			s++;
++		else if ((s[0] & 0xe0) == 0xc0) {
++			/* 110XXXXx 10xxxxxx */
++			if ((s[1] & 0xc0) != 0x80 ||
++					(s[0] & 0xfe) == 0xc0)          /* overlong? */
++				return s;
++			else
++				s += 2;
++		} else if ((s[0] & 0xf0) == 0xe0) {
++			/* 1110XXXX 10Xxxxxx 10xxxxxx */
++			if ((s[1] & 0xc0) != 0x80 ||
++					(s[2] & 0xc0) != 0x80 ||
++					(s[0] == 0xe0 && (s[1] & 0xe0) == 0x80) ||  /* overlong? */
++					(s[0] == 0xed && (s[1] & 0xe0) == 0xa0) ||  /* surrogate? */
++					(s[0] == 0xef && s[1] == 0xbf &&
++					 (s[2] & 0xfe) == 0xbe))            /* U+FFFE or U+FFFF? */
++				return s;
++			else
++				s += 3;
++		} else if ((s[0] & 0xf8) == 0xf0) {
++			/* 11110XXX 10XXxxxx 10xxxxxx 10xxxxxx */
++			if ((s[1] & 0xc0) != 0x80 ||
++					(s[2] & 0xc0) != 0x80 ||
++					(s[3] & 0xc0) != 0x80 ||
++					(s[0] == 0xf0 && (s[1] & 0xf0) == 0x80) ||    /* overlong? */
++					(s[0] == 0xf4 && s[1] > 0x8f) || s[0] > 0xf4) /* > U+10FFFF? */
++				return s;
++			else
++				s += 4;
++		} else
++			return s;
++	}
++
++	return NULL;
++}

Added: head/x11/libxklavier/files/patch-xklavier_config.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/x11/libxklavier/files/patch-xklavier_config.c	Wed Nov 18 18:52:30 2015	(r401888)
@@ -0,0 +1,73 @@
+--- libxklavier/xklavier_config.c	2012-08-24 02:23:02.000000000 +0400
++++ libxklavier/xklavier_config.c	2015-11-18 01:56:26.307937000 +0300
+@@ -29,6 +29,8 @@
+ 
+ #include "xklavier_private.h"
+ 
++#include "utf8.c"
++
+ static GObjectClass *parent_class = NULL;
+ 
+ static xmlXPathCompExprPtr models_xpath;
+@@ -162,6 +164,8 @@
+ 	gchar *vendor = NULL, *translated = NULL, *escaped =
+ 	    NULL, *unescaped = NULL;
+ 
++	guchar *s = NULL;
++
+ 	gint i;
+ 
+ 	*item->name = 0;
+@@ -190,17 +194,32 @@
+ 	desc_element = xkl_find_element(ptr, XML_TAG_DESCR);
+ 	vendor_element = xkl_find_element(ptr, XML_TAG_VENDOR);
+ 
+-	if (name_element != NULL && name_element->children != NULL)
++	if (name_element != NULL && name_element->children != NULL) {
+ 		strncat(item->name,
+ 			(char *) name_element->children->content,
+ 			XKL_MAX_CI_NAME_LENGTH - 1);
+ 
++		s = utf8_check((guchar *)item->name);
++
++		for (i = strlen(item->name); i > 0 && s != NULL; i--) {
++			item->name[i] = 0;
++			s = utf8_check((guchar *)item->name);
++		}
++	}
++
+ 	if (short_desc_element != NULL
+ 	    && short_desc_element->children != NULL) {
+ 		strncat(item->short_description,
+ 			dgettext(XKB_DOMAIN, (const char *)
+ 				 short_desc_element->children->content),
+ 			XKL_MAX_CI_SHORT_DESC_LENGTH - 1);
++
++		s = utf8_check((guchar *)item->short_description);
++
++		for (i = strlen(item->short_description); i > 0 && s != NULL; i--) {
++			item->short_description[i] = 0;
++			s = utf8_check((guchar *)item->short_description);
++		}
+ 	}
+ 
+ 	if (desc_element != NULL && desc_element->children != NULL) {
+@@ -238,8 +257,18 @@
+ 			g_free(translated);
+ 			translated = unescaped;
+ 		}
++
+ 		strncat(item->description,
+ 			translated, XKL_MAX_CI_DESC_LENGTH - 1);
++
++		s = utf8_check((guchar *)item->description);
++
++		for (i = strlen(item->description); i > 0 && s != NULL; i--) {
++			item->description[i] = 0;
++			s = utf8_check((guchar *)item->description);
++		}
++		
++		g_free(s);
+ 		g_free(translated);
+ 	}
+ 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201511181852.tAIIqUTD024582>