summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlvaro Herrera2007-12-31 03:55:50 +0000
committerAlvaro Herrera2007-12-31 03:55:50 +0000
commit9cf59f8798f10c0210b671b7c1abacbed42a1d9a (patch)
treec476ee09389079ad695163b699b18c414048e2b4
parent84cfde3c64f5f6e6688fac0d8c6b78f75ad13e37 (diff)
Add missing return code checks in the uuid-ossp contrib module, per bug #3841.
-rw-r--r--contrib/uuid-ossp/uuid-ossp.c64
1 files changed, 52 insertions, 12 deletions
diff --git a/contrib/uuid-ossp/uuid-ossp.c b/contrib/uuid-ossp/uuid-ossp.c
index 9b68cfdbb2..571ad33b3b 100644
--- a/contrib/uuid-ossp/uuid-ossp.c
+++ b/contrib/uuid-ossp/uuid-ossp.c
@@ -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;
}