Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 9 Oct 2013 02:31:49 GMT
From:      Christopher Hall <christopherhall.hsw@gmail.com>
To:        freebsd-gnats-submit@FreeBSD.org
Subject:   ports/182846: patch misc/ossp-uuid to prevent postgresql crash
Message-ID:  <201310090231.r992VnqW015578@oldred.freebsd.org>
Resent-Message-ID: <201310090240.r992e0wf081968@freefall.freebsd.org>

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

>Number:         182846
>Category:       ports
>Synopsis:       patch misc/ossp-uuid to prevent postgresql crash
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Wed Oct 09 02:40:00 UTC 2013
>Closed-Date:
>Last-Modified:
>Originator:     Christopher Hall
>Release:        9.1-RELEASE-p20
>Organization:
>Environment:
9.1-RELEASE-p20 amd64  from PCBSD 9.1 install
>Description:
The misc/ossp-uuid library contains two functions that have the same name
as functions in FreeBSD libc.  These are uuid_create and uuid_compare.

When postgresql-contrib (any version) is loaded attempting a

 select uuid_generate_v4();

will crash the postgresql server with a bus error (signal 10).

The reason is that the ossp-uuid module is accessing the uuid_create from libc
and the uuid_make from ossp-uuid so the uuid struct do not match.

>How-To-Repeat:
in psql command line:

  select uuid_generate_v4();

connected server will crash
>Fix:
The attached patch solves this by:
1. adding #defines to header to rename the two fuctions
2. adding aliases to library for the renamed functions

After reinstalling misc/ossp-uuid with the changes the postgresqlXX-contrib
can be recompiled and reinstalled and the the uuid module will fuction
correctly, allowing postgresql server to generate uuids.

Patch attached with submission follows:

diff -urN ossp-uuid.ORIG/files/patch-uuid.c ossp-uuid/files/patch-uuid.c
--- ossp-uuid.ORIG/files/patch-uuid.c	1970-01-01 08:00:00.000000000 +0800
+++ ossp-uuid/files/patch-uuid.c	2013-10-09 09:46:24.117554804 +0800
@@ -0,0 +1,28 @@
+--- uuid.c.orig	2008-03-07 18:49:59.000000000 +0800
++++ uuid.c	2013-10-05 12:36:27.550965193 +0800
+@@ -28,6 +28,7 @@
+ */
+ 
+ /* own headers (part 1/2) */
++#define __OSSP__COMPILING_UUID_C 1
+ #include "uuid.h"
+ #include "uuid_ac.h"
+ 
+@@ -93,6 +94,17 @@
+     unsigned long  time_seq;                  /* last timestamp sequence counter */
+ };
+ 
++/* create aliases to access the functions hidden by FreeBSD libc */
++#if defined(__FreeBSD__)
++
++uuid_rc_t __ossp__uuid_create(uuid_t **uuid)
++    __attribute__ ((alias ("uuid_create")));
++
++uuid_rc_t __ossp__uuid_compare(const uuid_t *uuid1, const uuid_t *uuid2, int *result)
++    __attribute__ ((alias ("uuid_compare")));
++
++#endif
++
+ /* create UUID object */
+ uuid_rc_t uuid_create(uuid_t **uuid)
+ {
diff -urN ossp-uuid.ORIG/files/patch-uuid.h.in ossp-uuid/files/patch-uuid.h.in
--- ossp-uuid.ORIG/files/patch-uuid.h.in	1970-01-01 08:00:00.000000000 +0800
+++ ossp-uuid/files/patch-uuid.h.in	2013-10-09 09:46:17.407539642 +0800
@@ -0,0 +1,15 @@
+--- uuid.h.in.orig	2008-03-07 18:49:59.000000000 +0800
++++ uuid.h.in	2013-10-05 12:36:27.550965193 +0800
+@@ -93,6 +93,12 @@
+ struct uuid_st;
+ typedef struct uuid_st uuid_t;
+ 
++/* resolve conflicts with uuid_create/uuid_compare in FreeBSD libc */
++#if defined(__FreeBSD__) && !defined(__OSSP__COMPILING_UUID_C)
++#define uuid_create   __ossp__uuid_create
++#define uuid_compare  __ossp__uuid_compare
++#endif
++
+ /* UUID object handling */
+ extern uuid_rc_t     uuid_create   (      uuid_t **_uuid);
+ extern uuid_rc_t     uuid_destroy  (      uuid_t  *_uuid);


>Release-Note:
>Audit-Trail:
>Unformatted:



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