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 7002c758c8ac94036e44adc7895534b3b2d7eff9..0b896fce5d72bcd6060d6c62e6024671d787cae1 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;
 }