Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 09 Jan 2008 19:40:35 -0500
From:      "Alexandre \"Sunny\" Kovalenko" <alex.kovalenko@verizon.net>
To:        Joe Marcus Clarke <marcus@marcuscom.com>
Cc:        ports@freebsd.org, gnome@freebsd.org, Alexander Nedotsukov <bland@freebsd.org>
Subject:   Re: [patch] glib20, UTF-8 and string collation
Message-ID:  <1199925635.9959.10.camel@RabbitsDen>
In-Reply-To: <1199900104.304.28.camel@shumai.marcuscom.com>
References:  <1199893999.756.29.camel@RabbitsDen> <1199900104.304.28.camel@shumai.marcuscom.com>

next in thread | previous in thread | raw e-mail | index | archive | help

On Wed, 2008-01-09 at 12:35 -0500, Joe Marcus Clarke wrote: 
> On Wed, 2008-01-09 at 10:53 -0500, Alexandre "Sunny" Kovalenko wrote:
> > I have seen recent commit WRT string collation in devel/glib20 by
> > marcus, so I have decided to check if there is an interest to fix SEGV
> > in g_utf8_collate when it is given 8-bit non-UTF-8 string(s) to collate.
> 
> Any commits I have made in the area of UTF-8 are completely accidental.
> I am not the UTF-8 guy.  Both bland and jylefort have expressed interest
> in this.  Perhaps one of them will comment.

I hope so. Just in case, they would decide to, I have reduced the
situation to the small program below. I get 

GLib-CRITICAL **: g_convert: assertion `str != NULL' failed

and no core dump from this simple program, whereas Evolution manages to
pass NULL to strcoll further down in g_utf8_collate and get SEGV for its
pains.

Conversely, if the answer still is "Evolution should not have done
that", I will happily crawl back under my rock and keep my patch
locally.

#include <stdio.h>

#include <glib.h>

int main(int argc, char *argv[])
{
  GString *str1 = g_string_new("\xf3\xcf\xd2\xcf\xcb\x20\xd7\xcf\xd3\xc5
\xcd\xd8\x20\xcf\xc2\xc5\xda\xd8\xd1\xce\x2e\x2e\x2e");
  GString *str2 = g_string_new("Goodbye, cruel world!");

  printf("%s\n", str1->str);
  if(g_utf8_collate(str1->str, str2->str) == 0)
    g_print("%s and %s are equal\n", str1->str, str2->str);
  else
    g_print("%s and %s are NOT equal\n", str1->str, str2->str);
}

built with

gcc `pkg-config --cflags glib-2.0` -g -o testCollate testCollate.c
`pkg-config --libs glib-2.0` 

on 

7.0-PRERELEASE FreeBSD 7.0-PRERELEASE #0: Sat Jan  5 22:37:29 EST 2008

using

glib-2.14.5 and libiconv-1.11_1

option "fix string collation" was set during the build of glib.

> I'm not sure why the malloc and copy.  Why not just use g_strdup()?

Because I don't know much of anything about glib programming, and I was 
suspecting that someone will use g_free() on the result, so g_malloc() 
sounded like the plausible candidate. I really hope someone with 
the necessary knowledge will come up with the right solution, but, for
now, I do what I can.

-- 
Alexandre "Sunny" Kovalenko




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