summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2022-09-09 12:41:36 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2022-09-09 12:41:36 -0400
commit95028d9de422e395d478da4dcda0a640989156d5 (patch)
treedcd415a8d49b2f2db6920d4f01fbc4299a7d36e0
parent174c929e3ba03c90cf5386436be05a00ea5ed36a (diff)
downloadpostgresql-95028d9de422e395d478da4dcda0a640989156d5.tar.gz
Reject bogus output from uuid_create(3).
When using the BSD UUID functions, contrib/uuid-ossp expects uuid_create() to produce a version-1 UUID. FreeBSD still does so, but in recent NetBSD releases that function produces a version-4 (random) UUID instead. That's not acceptable for our purposes: if the user wanted v4 she would have asked for v4, not v1. Hence, check the version digit and complain if it's not '1'. Also drop the documentation's claim that the NetBSD implementation is usable. It might be, depending on which OS version you're using, but we're not going to get into that kind of detail. (Maybe someday we should ditch all these external libraries and just write our own UUID code, but today is not that day.) Nazir Bilal Yavuz, with cosmetic adjustments and docs by me. Backpatch to all supported versions. Discussion: https://postgr.es/m/3848059.1661038772@sss.pgh.pa.us Discussion: https://postgr.es/m/17358-89806e7420797025@postgresql.org
-rw-r--r--contrib/uuid-ossp/uuid-ossp.c12
-rw-r--r--doc/src/sgml/installation.sgml2
-rw-r--r--doc/src/sgml/uuid-ossp.sgml2
3 files changed, 14 insertions, 2 deletions
diff --git a/contrib/uuid-ossp/uuid-ossp.c b/contrib/uuid-ossp/uuid-ossp.c
index 55bc609415..4fd8cc6cd1 100644
--- a/contrib/uuid-ossp/uuid-ossp.c
+++ b/contrib/uuid-ossp/uuid-ossp.c
@@ -296,6 +296,18 @@ uuid_generate_internal(int v, unsigned char *ns, char *ptr, int len)
strlcpy(strbuf, str, 37);
/*
+ * In recent NetBSD, uuid_create() has started
+ * producing v4 instead of v1 UUIDs. Check the
+ * version field and complain if it's not v1.
+ */
+ if (strbuf[14] != '1')
+ ereport(ERROR,
+ (errcode(ERRCODE_EXTERNAL_ROUTINE_EXCEPTION),
+ /* translator: %c will be a hex digit */
+ errmsg("uuid_create() produced a version %c UUID instead of the expected version 1",
+ strbuf[14])));
+
+ /*
* PTR, if set, replaces the trailing characters of
* the uuid; this is to support v1mc, where a random
* multicast MAC is used instead of the physical one
diff --git a/doc/src/sgml/installation.sgml b/doc/src/sgml/installation.sgml
index 7cde895bd8..2571493cee 100644
--- a/doc/src/sgml/installation.sgml
+++ b/doc/src/sgml/installation.sgml
@@ -920,7 +920,7 @@ su - postgres
<itemizedlist>
<listitem>
<para>
- <option>bsd</> to use the UUID functions found in FreeBSD, NetBSD,
+ <option>bsd</> to use the UUID functions found in FreeBSD
and some other BSD-derived systems
</para>
</listitem>
diff --git a/doc/src/sgml/uuid-ossp.sgml b/doc/src/sgml/uuid-ossp.sgml
index 227d4a839c..0faf19ec44 100644
--- a/doc/src/sgml/uuid-ossp.sgml
+++ b/doc/src/sgml/uuid-ossp.sgml
@@ -167,7 +167,7 @@ SELECT uuid_generate_v3(uuid_ns_url(), 'http://www.postgresql.org');
at <ulink url="http://www.ossp.org/pkg/lib/uuid/"></ulink>, it is not well
maintained, and is becoming increasingly difficult to port to newer
platforms. <filename>uuid-ossp</> can now be built without the OSSP
- library on some platforms. On FreeBSD, NetBSD, and some other BSD-derived
+ library on some platforms. On FreeBSD and some other BSD-derived
platforms, suitable UUID creation functions are included in the
core <filename>libc</> library. On Linux, macOS, and some other
platforms, suitable functions are provided in the <filename>libuuid</>