pkgsrc-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

pkg/43879: gettext-lib miscompiles on DragonFly

>Number:         43879
>Category:       pkg
>Synopsis:       gettext-lib miscompiles on DragonFly
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    pkg-manager
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Tue Sep 14 17:35:00 +0000 2010
>Originator:     Francois Tigeot
>Release:        DragonFlyBSD
DragonFly 2.7-DEVELOPMENT DragonFly 
v2.7.3.962.gd8d671-DEVELOPMENT #3: Tue Sep 14 11:55:21 CEST 2010  x86_64
With a DragonFly/x86-64 system, setting LANG to a non-english locale results in 
an immediate crash of applications using devel/gettext-lib (pretty much 
everything in a modern X11 desktop).

Example with mutt:

$ LANG=fr_FR.UTF-8 mutt
[1]    5541 segmentation fault (core dumped)  LANG=fr_FR.UTF-8 mutt

I have tracked this crash to line 669 of gettext-runtime/intl/dcigettext.c

This line uses a value returned by a previous call of tsearch().
tsearch() is declared in /usr/include/search.h and returns a pointer.

Howewer, search.h is not included in dcigettext.c and thus the compiler 
considers tsearch() returns a value of type int.

With the amd64 ABI, sizeof(int) is less than sizeof(void*). The pointer is 
truncated and the program crashes trying to access a random memory address.

The problem also exists on DragonFly/i386, but on this architecture, 
sizeof(int) and sizeof(void*) are the same and thus the void* to int conversion 
does not results in any ill effects.

The reason <search.h> is not included ultimately lies with the GNU configure 
system. This code is an extract of dcigettext.c:

# if defined HAVE_SEARCH_H
#  include <search.h>
# endif

The inclusion of <search.h> is protected by the HAVE_SEARCH_H symbol. It should 
be defined in an automatically generated file, configure.h but is not.
Set LANG to fr_FR.UTF-8
Try to run mail/mutt

Home | Main Index | Thread Index | Old Index