X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flibsystemd-id128%2Fsd-id128.c;h=07d241534e53378c1d4c6a9042396264b58a28fe;hp=4286ae7d146027b40b03378151387d8f8d0a4a1e;hb=4faa70046ca0c1775c8e231179716a78cf3291b1;hpb=d41ba529b4d7a57456c030e5d20546e6f0abfef3 diff --git a/src/libsystemd-id128/sd-id128.c b/src/libsystemd-id128/sd-id128.c index 4286ae7d1..07d241534 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; @@ -90,14 +106,13 @@ 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]; + _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++) { @@ -139,15 +155,14 @@ _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; + _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