X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibsystemd-id128%2Fsd-id128.c;h=9ee40ab91eaaee64a3f13dc61dc354bc8de26400;hb=ab9001a1e3dc6e60d0cdf53363dc5d18dcc382fd;hp=4286ae7d146027b40b03378151387d8f8d0a4a1e;hpb=d41ba529b4d7a57456c030e5d20546e6f0abfef3;p=elogind.git diff --git a/src/libsystemd-id128/sd-id128.c b/src/libsystemd-id128/sd-id128.c index 4286ae7d1..9ee40ab91 100644 --- a/src/libsystemd-id128/sd-id128.c +++ b/src/libsystemd-id128/sd-id128.c @@ -23,16 +23,14 @@ #include #include -#include "sd-id128.h" - #include "util.h" #include "macro.h" +#include "sd-id128.h" _public_ char *sd_id128_to_string(sd_id128_t id, char s[33]) { unsigned n; - if (!s) - return NULL; + assert_return(s, NULL); for (n = 0; n < 16; n++) { s[n*2] = hexchar(id.bytes[n] >> 4); @@ -44,30 +42,48 @@ _public_ char *sd_id128_to_string(sd_id128_t id, char s[33]) { return s; } -_public_ int sd_id128_from_string(const char s[33], sd_id128_t *ret) { - unsigned n; +_public_ int sd_id128_from_string(const char s[], sd_id128_t *ret) { + unsigned n, i; sd_id128_t t; + bool is_guid = false; - if (!s) - return -EINVAL; - if (!ret) - return -EINVAL; + assert_return(s, -EINVAL); + assert_return(ret, -EINVAL); - for (n = 0; n < 16; n++) { + for (n = 0, i = 0; n < 16;) { int a, b; - a = unhexchar(s[n*2]); + if (s[i] == '-') { + /* Is this a GUID? Then be nice, and skip over + * the dashes */ + + if (i == 8) + is_guid = true; + else if (i == 13 || i == 18 || i == 23) { + if (!is_guid) + return -EINVAL; + } else + return -EINVAL; + + i++; + continue; + } + + a = unhexchar(s[i++]); if (a < 0) return -EINVAL; - b = unhexchar(s[n*2+1]); + b = unhexchar(s[i++]); if (b < 0) return -EINVAL; - t.bytes[n] = (a << 4) | b; + t.bytes[n++] = (a << 4) | b; } - if (s[32] != 0) + if (i != (is_guid ? 36 : 32)) + return -EINVAL; + + if (s[i] != 0) return -EINVAL; *ret = t; @@ -88,16 +104,15 @@ static sd_id128_t make_v4_uuid(sd_id128_t id) { } _public_ int sd_id128_get_machine(sd_id128_t *ret) { - static __thread sd_id128_t saved_machine_id; - static __thread bool saved_machine_id_valid = false; - int fd; - char buf[32]; + static thread_local sd_id128_t saved_machine_id; + static thread_local bool saved_machine_id_valid = false; + _cleanup_close_ int fd = -1; + char buf[33]; ssize_t k; unsigned j; sd_id128_t t; - if (!ret) - return -EINVAL; + assert_return(ret, -EINVAL); if (saved_machine_id_valid) { *ret = saved_machine_id; @@ -108,13 +123,14 @@ _public_ int sd_id128_get_machine(sd_id128_t *ret) { if (fd < 0) return -errno; - k = loop_read(fd, buf, 32, false); - close_nointr_nofail(fd); - + k = loop_read(fd, buf, 33, false); if (k < 0) return (int) k; - if (k < 32) + if (k != 33) + return -EIO; + + if (buf[32] !='\n') return -EIO; for (j = 0; j < 16; j++) { @@ -137,17 +153,16 @@ _public_ int sd_id128_get_machine(sd_id128_t *ret) { } _public_ int sd_id128_get_boot(sd_id128_t *ret) { - static __thread sd_id128_t saved_boot_id; - static __thread bool saved_boot_id_valid = false; - int fd; + static thread_local sd_id128_t saved_boot_id; + static thread_local bool saved_boot_id_valid = false; + _cleanup_close_ int fd = -1; char buf[36]; ssize_t k; unsigned j; sd_id128_t t; char *p; - if (!ret) - return -EINVAL; + assert_return(ret, -EINVAL); if (saved_boot_id_valid) { *ret = saved_boot_id; @@ -159,17 +174,18 @@ _public_ int sd_id128_get_boot(sd_id128_t *ret) { return -errno; k = loop_read(fd, buf, 36, false); - close_nointr_nofail(fd); - if (k < 0) return (int) k; - if (k < 36) + if (k != 36) return -EIO; for (j = 0, p = buf; j < 16; j++) { int a, b; + if (p >= buf + k) + return -EIO; + if (*p == '-') p++; @@ -192,24 +208,21 @@ _public_ int sd_id128_get_boot(sd_id128_t *ret) { } _public_ int sd_id128_randomize(sd_id128_t *ret) { - int fd; - ssize_t k; + _cleanup_close_ int fd = -1; sd_id128_t t; + ssize_t k; - if (!ret) - return -EINVAL; + assert_return(ret, -EINVAL); fd = open("/dev/urandom", O_RDONLY|O_CLOEXEC|O_NOCTTY); if (fd < 0) return -errno; k = loop_read(fd, &t, 16, false); - close_nointr_nofail(fd); - if (k < 0) return (int) k; - if (k < 16) + if (k != 16) return -EIO; /* Turn this into a valid v4 UUID, to be nice. Note that we