William Orr writes:

> Hey,
>
> In looking through uuid generation situations on various
> bsd's, I noticed that there's an additional implemetation
> of uuid generation in ldapd. This one appears to generate
> version 1 uuid's, which afaict from reading RFC 4530 isn't
> a requirement for a compliant ldap implementation.
>
> The following replaces it with the implementation in libc.
>
> I tested by loading up ldapd, adding entries, then querying
> for their `entryUUID` fields and verifying that they were
> version 4 uuids instead of version 1.
>
> Thanks!!

My bad, there was a missing `free(3)`. Correct patch follows.

Index: Makefile
===================================================================
RCS file: /cvs/src/usr.sbin/ldapd/Makefile,v
retrieving revision 1.15
diff -u -p -r1.15 Makefile
--- Makefile    20 Jan 2017 11:55:08 -0000      1.15
+++ Makefile    3 Oct 2018 01:42:25 -0000
@@ -6,7 +6,7 @@ SRCS=           ber.c log.c logmsg.c control.c \
                util.c ldapd.c ldape.c conn.c attributes.c namespace.c \
                btree.c filter.c search.c parse.y \
                auth.c modify.c index.c evbuffer_tls.c \
-               validate.c uuid.c schema.c imsgev.c syntax.c matching.c
+               validate.c schema.c imsgev.c syntax.c matching.c
 
 LDADD=         -levent -ltls -lssl -lcrypto -lz -lutil
 DPADD=         ${LIBEVENT} ${LIBTLS} ${LIBSSL} ${LIBCRYPTO} ${LIBZ} ${LIBUTIL}
Index: modify.c
===================================================================
RCS file: /cvs/src/usr.sbin/ldapd/modify.c,v
retrieving revision 1.21
diff -u -p -r1.21 modify.c
--- modify.c    14 May 2018 07:53:47 -0000      1.21
+++ modify.c    3 Oct 2018 01:42:25 -0000
@@ -23,10 +23,10 @@
 #include <errno.h>
 #include <stdlib.h>
 #include <string.h>
+#include <uuid.h>
 
 #include "ldapd.h"
 #include "log.h"
-#include "uuid.h"
 
 int
 ldap_delete(struct request *req)
@@ -123,8 +123,9 @@ done:
 int
 ldap_add(struct request *req)
 {
-       char                     uuid_str[64];
-       struct uuid              uuid;
+       char                    *uuid_str = NULL;
+       uuid_t                  uuid;
+       uint32_t                uuid_status;
        char                    *dn, *s;
        struct attr_type        *at;
        struct ber_element      *attrs, *attr, *elm, *set = NULL;
@@ -204,8 +205,12 @@ ldap_add(struct request *req)
        if (ldap_add_attribute(attrs, "createTimestamp", set) == NULL)
                goto fail;
 
-       uuid_create(&uuid);
-       uuid_to_string(&uuid, uuid_str, sizeof(uuid_str));
+       uuid_create(&uuid, &uuid_status);
+       if (uuid_status != uuid_s_ok)
+               goto fail;
+       uuid_to_string(&uuid, &uuid_str, &uuid_status);
+       if (uuid_status != uuid_s_ok)
+               goto fail;
        if ((set = ber_add_set(NULL)) == NULL)
                goto fail;
        if (ber_add_string(set, uuid_str) == NULL)
@@ -223,9 +228,11 @@ ldap_add(struct request *req)
        } else if (namespace_commit(ns) != 0)
                rc = LDAP_OTHER;
 
+       free(uuid_str);
        return ldap_respond(req, rc);
 
 fail:
+       free(uuid_str);
        if (set != NULL)
                ber_free_elements(set);
        namespace_abort(ns);
Index: syntax.c
===================================================================
RCS file: /cvs/src/usr.sbin/ldapd/syntax.c,v
retrieving revision 1.5
diff -u -p -r1.5 syntax.c
--- syntax.c    28 May 2017 15:48:49 -0000      1.5
+++ syntax.c    3 Oct 2018 01:42:25 -0000
@@ -26,7 +26,6 @@
 #include <string.h>
 
 #include "schema.h"
-#include "uuid.h"
 
 #define SYNTAX_DECL(TYPE) \
        static int syntax_is_##TYPE(struct schema *schema, char *value, size_t 
len)
Index: uuid.c
===================================================================
RCS file: uuid.c
diff -N uuid.c
--- uuid.c      26 Apr 2018 12:42:51 -0000      1.6
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,257 +0,0 @@
-/*     $OpenBSD: uuid.c,v 1.6 2018/04/26 12:42:51 guenther Exp $ */
-/*
- * Copyright (c) 2002, Stockholms Universitet
- * (Stockholm University, Stockholm Sweden)
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * 3. Neither the name of the university nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * NCS/DCE/AFS/GUID generator
- *
- *  for more information about DCE UUID, see
- *  <http://www.opengroup.org/onlinepubs/9629399/apdxa.htm>
- *
- *  Note, the Microsoft GUID is a DCE UUID, but it seems like they
- *  folded in the seq num with the node part. That would explain how
- *  the reserved field have a bit pattern 110 when reserved is a 2 bit
- *  field.
- *
- *  XXX should hash the node address for privacy issues
- */
-
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/time.h>
-#include <netinet/in.h>
-#include <net/if.h>
-#include <net/if_types.h>
-#include <net/if_dl.h>
-
-#include <fcntl.h>
-#include <ifaddrs.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "uuid.h"
-
-static uint32_t seq_num;
-static struct timeval last_time;
-static int32_t counter;
-static char nodeaddr[6];
-
-enum { UUID_NODE_MULTICAST = 0x80 };
-
-static int
-time_cmp(struct timeval *tv1, struct timeval *tv2)
-{
-    if (tv1->tv_sec > tv2->tv_sec)
-       return -1;
-    if (tv1->tv_sec < tv2->tv_sec)
-       return 1;
-    if (tv1->tv_usec > tv2->tv_usec)
-       return -1;
-    if (tv1->tv_usec < tv2->tv_usec)
-       return 1;
-    return 0;
-}
-
-static void
-get_node_addr(char *addr)
-{
-    struct ifaddrs *ifa, *ifa0;
-    int found_mac = 0;
-
-    if (getifaddrs(&ifa0) != 0)
-       ifa0 = NULL;
-
-    for (ifa = ifa0; ifa != NULL && !found_mac; ifa = ifa->ifa_next) {
-       if (ifa->ifa_addr == NULL)
-           continue;
-
-#if IFF_LOOPBACK
-       if (ifa->ifa_flags & IFF_LOOPBACK)
-           continue;
-#endif
-
-       switch (ifa->ifa_addr->sa_family) {
-#ifdef AF_LINK
-       case AF_LINK: {
-           struct sockaddr_dl *dl = (struct sockaddr_dl *)ifa->ifa_addr;
-
-           switch (dl->sdl_type) {
-           case IFT_ETHER:
-           case IFT_FDDI:
-               if (dl->sdl_alen == 6) {
-                   memcpy(addr, LLADDR(dl), 6);
-                   found_mac = 1;
-               }
-           }
-
-       }
-#endif
-       default:
-           break;
-       }
-    }
-
-    if (ifa0 != NULL)
-       freeifaddrs(ifa0);
-
-    if (!found_mac) {
-       /*
-        * Set the multicast bit to make sure we won't collide with an
-        * allocated (mac) address.
-        */
-       arc4random_buf(addr, 6);
-       addr[0] |= UUID_NODE_MULTICAST;
-    }
-    return;
-}
-
-/*
- *    Creates a new UUID.
- */
-
-void
-uuid_create(afsUUID *uuid)
-{
-    static int uuid_inited = 0;
-    struct timeval tv;
-    int ret, got_time;
-    uint64_t dce_time;
-
-    if (uuid_inited == 0) {
-       gettimeofday(&last_time, NULL);
-       seq_num = arc4random();
-       get_node_addr(nodeaddr);
-       uuid_inited = 1;
-    }
-
-    gettimeofday(&tv, NULL);
-
-    got_time = 0;
-
-    do {
-       ret = time_cmp(&tv, &last_time);
-       if (ret < 0) {
-           /* Time went backward, just inc seq_num and be done.
-            * seq_num is 6 + 8 bit field it the uuid, so let it wrap
-            * around. don't let it be zero.
-            */
-           seq_num = (seq_num + 1) & 0x3fff ;
-           if (seq_num == 0)
-               seq_num++;
-           got_time = 1;
-           counter = 0;
-           last_time = tv;
-       } else if (ret > 0) {
-           /* time went forward, reset counter and be happy */
-           last_time = tv;
-           counter = 0;
-           got_time = 1;
-       } else {
-#define UUID_MAX_HZ (1) /* make this bigger fix you have larger tickrate */
-#define MULTIPLIER_100_NANO_SEC 10
-           if (++counter < UUID_MAX_HZ * MULTIPLIER_100_NANO_SEC)
-               got_time = 1;
-       }
-    } while(!got_time);
-
-    /*
-     * now shift time to dce_time, epoch 00:00:00:00, 15 October 1582
-     * dce time ends year ~3400, so start to worry now
-     */
-
-    dce_time = tv.tv_usec * MULTIPLIER_100_NANO_SEC + counter;
-    dce_time += ((uint64_t)tv.tv_sec) * 10000000;
-    dce_time += (((uint64_t)0x01b21dd2) << 32) + 0x13814000;
-
-    uuid->time_low = dce_time & 0xffffffff;
-    uuid->time_mid = 0xffff & (dce_time >> 32);
-    uuid->time_hi_and_version = 0x0fff & (dce_time >> 48);
-
-    uuid->time_hi_and_version |= (1 << 12);
-
-    uuid->clock_seq_low = seq_num & 0xff;
-    uuid->clock_seq_hi_and_reserved = (seq_num >> 8) & 0x3f;
-    uuid->clock_seq_hi_and_reserved |= 0x80; /* dce variant */
-
-    memcpy(uuid->node, nodeaddr, 6);
-}
-
-/*
- *    Converts a UUID from binary representation to a string representation.
- */
-
-void
-uuid_to_string(const afsUUID *uuid, char *str, size_t strsz)
-{
-    snprintf(str, strsz,
-            "%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
-            uuid->time_low,
-            uuid->time_mid,
-            uuid->time_hi_and_version,
-            (unsigned char)uuid->clock_seq_hi_and_reserved,
-            (unsigned char)uuid->clock_seq_low,
-            (unsigned char)uuid->node[0],
-            (unsigned char)uuid->node[1],
-            (unsigned char)uuid->node[2],
-            (unsigned char)uuid->node[3],
-            (unsigned char)uuid->node[4],
-            (unsigned char)uuid->node[5]);
-}
-
-
-#ifdef TEST
-int
-main(int argc, char **argv)
-{
-    char str[1000];
-    afsUUID u1, u2;
-
-    uuid_create(&u1);
-
-    uuid_to_string(&u1, str, sizeof(str));
-
-    printf("u: %s\n", str);
-
-    if (uuid_from_string(str, &u2)) {
-       printf("failed to parse\n");
-       return 0;
-    }
-
-    if (bcmp(&u1, &u2, sizeof(u1)) != 0)
-       printf("u1 != u2\n");
-
-    return 0;
-}
-#endif
Index: uuid.h
===================================================================
RCS file: uuid.h
diff -N uuid.h
--- uuid.h      27 Jun 2010 18:19:36 -0000      1.3
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,55 +0,0 @@
-/*     $OpenBSD: uuid.h,v 1.3 2010/06/27 18:19:36 martinh Exp $ */
-/*
- * Copyright (c) 2002, Stockholms Universitet
- * (Stockholm University, Stockholm Sweden)
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * 3. Neither the name of the university nor the names of its contributors
- *    may be used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-/* $arla: afs_uuid.h,v 1.3 2002/05/30 00:48:12 mattiasa Exp $ */
-
-#ifndef __ARLA_UUID_H__
-#define __ARLA_UUID_H__ 1
-
-struct uuid {
-       u_long time_low;
-       u_short time_mid;
-       u_short time_hi_and_version;
-       char clock_seq_hi_and_reserved;
-       char clock_seq_low;
-       char node[6];
-};
-
-typedef struct uuid afsUUID;
-
-void   uuid_create(afsUUID *);
-void   uuid_to_string(const afsUUID *, char *, size_t);
-
-#endif /* __ARLA_UUID_H__ */
-

Reply via email to