X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=avahi-common%2Fdomain.c;h=8d339c7a487b2a6ddecb9103f7038f10f2f7131b;hb=4762665d22b1e3097b537e9a5e27d2f2b0bfcfde;hp=f2e4395a7e3649813cd30840cb25394dc757069c;hpb=f56d3a4e5dec3aa75d25fae761a0642e6ebd7c3c;p=catta diff --git a/avahi-common/domain.c b/avahi-common/domain.c index f2e4395..8d339c7 100644 --- a/avahi-common/domain.c +++ b/avahi-common/domain.c @@ -36,31 +36,8 @@ #include "domain.h" #include "malloc.h" #include "error.h" - -char *avahi_get_host_name(char *ret_s, size_t size) { -#ifdef HOST_NAME_MAX - char t[HOST_NAME_MAX]; -#else - char t[256]; -#endif - - assert(ret_s); - assert(size > 0); - - gethostname(t, sizeof(t)); - t[sizeof(t)-1] = 0; - - return avahi_normalize_name(t, ret_s, size); -} - -char *avahi_get_host_name_strdup(void) { - char t[AVAHI_DOMAIN_NAME_MAX]; - - if (!(avahi_get_host_name(t, sizeof(t)))) - return NULL; - - return avahi_strdup(t); -} +#include "address.h" +#include "utf8.h" /* Read the first label from string *name, unescape "\" and write it to dest */ char *avahi_unescape_label(const char **name, char *dest, size_t size) { @@ -131,6 +108,9 @@ char *avahi_unescape_label(const char **name, char *dest, size_t size) { *d = 0; + if (!avahi_utf8_valid(dest)) + return NULL; + return dest; } @@ -206,31 +186,35 @@ char *avahi_normalize_name(const char *s, char *ret_s, size_t size) { assert(size > 0); r = ret_s; + *ret_s = 0; + while (*s) { char label[AVAHI_LABEL_MAX]; if (!(avahi_unescape_label(&s, label, sizeof(label)))) return NULL; - if (strlen(label) > 0) { + if (label[0] == 0) { - if (!empty) { - if (size < 1) - return NULL; - - *(r++) = '.'; - size--; + if (*s == 0 && empty) + return ret_s; - } else - empty = 0; - - avahi_escape_label(label, strlen(label), &r, &size); + return NULL; } + + if (!empty) { + if (size < 1) + return NULL; + + *(r++) = '.'; + size--; + + } else + empty = 0; + + avahi_escape_label(label, strlen(label), &r, &size); } - if (empty) - return NULL; - return ret_s; } @@ -269,30 +253,6 @@ int avahi_domain_equal(const char *a, const char *b) { return 1; } -int avahi_binary_domain_cmp(const char *a, const char *b) { - assert(a); - assert(b); - - if (a == b) - return 0; - - for (;;) { - char ca[AVAHI_LABEL_MAX], cb[AVAHI_LABEL_MAX], *p; - int r; - - p = avahi_unescape_label(&a, ca, sizeof(ca)); - assert(p); - p = avahi_unescape_label(&b, cb, sizeof(cb)); - assert(p); - - if ((r = strcmp(ca, cb))) - return r; - - if (!*a && !*b) - return 0; - } -} - int avahi_is_valid_service_type_generic(const char *t) { assert(t); @@ -409,9 +369,10 @@ int avahi_is_valid_service_subtype(const char *t) { } int avahi_is_valid_domain_name(const char *t) { + int is_first = 1; assert(t); - if (strlen(t) >= AVAHI_DOMAIN_NAME_MAX || !*t) + if (strlen(t) >= AVAHI_DOMAIN_NAME_MAX) return 0; do { @@ -420,7 +381,13 @@ int avahi_is_valid_domain_name(const char *t) { if (!(avahi_unescape_label(&t, label, sizeof(label)))) return 0; - if (strlen(label) < 1) + /* Explicitly allow the root domain name */ + if (is_first && label[0] == 0 && *t == 0) + return 1; + + is_first = 0; + + if (label[0] == 0) return 0; } while (*t); @@ -472,26 +439,8 @@ unsigned avahi_domain_hash(const char *s) { return hash; } -int avahi_domain_ends_with(const char *domain, const char *suffix) { - assert(domain); - assert(suffix); - - for (;;) { - char dummy[AVAHI_LABEL_MAX], *r; - - if (*domain == 0) - return 0; - - if (avahi_domain_equal(domain, suffix)) - return 1; - - r = avahi_unescape_label(&domain, dummy, sizeof(dummy)); - assert(r); - } -} - int avahi_service_name_join(char *p, size_t size, const char *name, const char *type, const char *domain) { - char escaped_name[AVAHI_LABEL_MAX]; + char escaped_name[AVAHI_LABEL_MAX*4]; char normalized_type[AVAHI_DOMAIN_NAME_MAX]; char normalized_domain[AVAHI_DOMAIN_NAME_MAX]; @@ -530,19 +479,22 @@ int avahi_service_name_join(char *p, size_t size, const char *name, const char * return AVAHI_OK; } +#ifndef HAVE_STRLCPY -char *avahi_strlcpy(char *dest, const char *src, size_t n) { +static size_t strlcpy(char *dest, const char *src, size_t n) { assert(dest); assert(src); - - if (n == 0) - return dest; - - strncpy(dest, src, n-1); - dest[n-1] = 0; - return dest; + + if (n > 0) { + strncpy(dest, src, n-1); + dest[n-1] = 0; + } + + return strlen(src); } +#endif + int avahi_service_name_split(const char *p, char *name, size_t name_size, char *type, size_t type_size, char *domain, size_t domain_size) { enum { NAME, @@ -574,7 +526,7 @@ int avahi_service_name_split(const char *p, char *name, size_t name_size, char * switch (state) { case NAME: - avahi_strlcpy(name, buf, name_size); + strlcpy(name, buf, name_size); state = TYPE; break; @@ -622,3 +574,38 @@ int avahi_service_name_split(const char *p, char *name, size_t name_size, char * return 0; } +int avahi_is_valid_fqdn(const char *t) { + char label[AVAHI_LABEL_MAX]; + char normalized[AVAHI_DOMAIN_NAME_MAX]; + const char *k = t; + AvahiAddress a; + assert(t); + + if (strlen(t) >= AVAHI_DOMAIN_NAME_MAX) + return 0; + + if (!avahi_is_valid_domain_name(t)) + return 0; + + /* Check if there are at least two labels*/ + if (!(avahi_unescape_label(&k, label, sizeof(label)))) + return 0; + + if (label[0] == 0 || !k) + return 0; + + if (!(avahi_unescape_label(&k, label, sizeof(label)))) + return 0; + + if (label[0] == 0 || !k) + return 0; + + /* Make sure that the name is not an IP address */ + if (!(avahi_normalize_name(t, normalized, sizeof(normalized)))) + return 0; + + if (avahi_address_parse(normalized, AVAHI_PROTO_UNSPEC, &a)) + return 0; + + return 1; +}