OSDN Git Service

Add missing return code checks in the uuid-ossp contrib module, per bug #3841.
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Mon, 31 Dec 2007 03:55:50 +0000 (03:55 +0000)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Mon, 31 Dec 2007 03:55:50 +0000 (03:55 +0000)
contrib/uuid-ossp/uuid-ossp.c

index 7002c75..0b896fc 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Copyright (c) 2007 PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/contrib/uuid-ossp/uuid-ossp.c,v 1.5 2007/11/15 22:25:14 momjian Exp $
+ * $PostgreSQL: pgsql/contrib/uuid-ossp/uuid-ossp.c,v 1.6 2007/12/31 03:55:50 alvherre Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -64,6 +64,20 @@ PG_FUNCTION_INFO_V1(uuid_generate_v3);
 PG_FUNCTION_INFO_V1(uuid_generate_v4);
 PG_FUNCTION_INFO_V1(uuid_generate_v5);
 
+static void
+pguuid_complain(uuid_rc_t rc)
+{
+       char    *err = uuid_error(rc);
+
+       if (err != NULL)
+               ereport(ERROR,
+                               (errcode(ERRCODE_EXTERNAL_ROUTINE_EXCEPTION),
+                                errmsg("OSSP uuid library failure: %s", err)));
+       else
+               ereport(ERROR,
+                               (errcode(ERRCODE_EXTERNAL_ROUTINE_EXCEPTION),
+                                errmsg("OSSP uuid library failure: error code %d", rc)));
+}
 
 static char *
 uuid_to_string(const uuid_t * uuid)
@@ -71,8 +85,11 @@ uuid_to_string(const uuid_t * uuid)
        char       *buf = palloc(UUID_LEN_STR + 1);
        void       *ptr = buf;
        size_t          len = UUID_LEN_STR + 1;
+       uuid_rc_t       rc;
 
-       uuid_export(uuid, UUID_FMT_STR, &ptr, &len);
+       rc = uuid_export(uuid, UUID_FMT_STR, &ptr, &len);
+       if (rc != UUID_RC_OK)
+               pguuid_complain(rc);
 
        return buf;
 }
@@ -81,7 +98,11 @@ uuid_to_string(const uuid_t * uuid)
 static void
 string_to_uuid(const char *str, uuid_t * uuid)
 {
-       uuid_import(uuid, UUID_FMT_STR, str, UUID_LEN_STR + 1);
+       uuid_rc_t       rc;
+
+       rc = uuid_import(uuid, UUID_FMT_STR, str, UUID_LEN_STR + 1);
+       if (rc != UUID_RC_OK)
+               pguuid_complain(rc);
 }
 
 
@@ -90,11 +111,18 @@ special_uuid_value(const char *name)
 {
        uuid_t     *uuid;
        char       *str;
-
-       uuid_create(&uuid);
-       uuid_load(uuid, name);
+       uuid_rc_t       rc;
+
+       rc = uuid_create(&uuid);
+       if (rc != UUID_RC_OK)
+               pguuid_complain(rc);
+       rc = uuid_load(uuid, name);
+       if (rc != UUID_RC_OK)
+               pguuid_complain(rc);
        str = uuid_to_string(uuid);
-       uuid_destroy(uuid);
+       rc = uuid_destroy(uuid);
+       if (rc != UUID_RC_OK)
+               pguuid_complain(rc);
 
        return DirectFunctionCall1(uuid_in, CStringGetDatum(str));
 }
@@ -140,11 +168,18 @@ uuid_generate_internal(int mode, const uuid_t * ns, const char *name)
 {
        uuid_t     *uuid;
        char       *str;
-
-       uuid_create(&uuid);
-       uuid_make(uuid, mode, ns, name);
+       uuid_rc_t       rc;
+
+       rc = uuid_create(&uuid);
+       if (rc != UUID_RC_OK)
+               pguuid_complain(rc);
+       rc = uuid_make(uuid, mode, ns, name);
+       if (rc != UUID_RC_OK)
+               pguuid_complain(rc);
        str = uuid_to_string(uuid);
-       uuid_destroy(uuid);
+       rc = uuid_destroy(uuid);
+       if (rc != UUID_RC_OK)
+               pguuid_complain(rc);
 
        return DirectFunctionCall1(uuid_in, CStringGetDatum(str));
 }
@@ -169,8 +204,11 @@ uuid_generate_v35_internal(int mode, pg_uuid_t *ns, text *name)
 {
        uuid_t     *ns_uuid;
        Datum           result;
+       uuid_rc_t       rc;
 
-       uuid_create(&ns_uuid);
+       rc = uuid_create(&ns_uuid);
+       if (rc != UUID_RC_OK)
+               pguuid_complain(rc);
        string_to_uuid(DatumGetCString(DirectFunctionCall1(uuid_out, UUIDPGetDatum(ns))),
                                   ns_uuid);
 
@@ -178,7 +216,9 @@ uuid_generate_v35_internal(int mode, pg_uuid_t *ns, text *name)
                                                                        ns_uuid,
           DatumGetCString(DirectFunctionCall1(textout, PointerGetDatum(name))));
 
-       uuid_destroy(ns_uuid);
+       rc = uuid_destroy(ns_uuid);
+       if (rc != UUID_RC_OK)
+               pguuid_complain(rc);
 
        return result;
 }