summaryrefslogtreecommitdiff
path: root/src/shared
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2016-01-13 20:45:56 +0100
committerLennart Poettering <lennart@poettering.net>2016-01-13 20:45:58 +0100
commit81ec9e0887ef12bebd36d48f10372cf003df5d38 (patch)
treeb4015714d0cebd38e2ffa2b1c964e1bc3a81e3d5 /src/shared
parent45c4210ed606b1e3318bba7edb5c1b962764a1c2 (diff)
shared: reuse dns_label_unescape_undo_idna() in more places
We frequently unescape DNS label follwed by IDNA undoing. We now have a function that does that in one step, hence use it everywhere.
Diffstat (limited to 'src/shared')
-rw-r--r--src/shared/dns-domain.c96
1 files changed, 27 insertions, 69 deletions
diff --git a/src/shared/dns-domain.c b/src/shared/dns-domain.c
index 1235ff109b..d1fb97fe92 100644
--- a/src/shared/dns-domain.c
+++ b/src/shared/dns-domain.c
@@ -558,8 +558,26 @@ const struct hash_ops dns_name_hash_ops = {
.compare = dns_name_compare_func
};
+static int dns_label_unescape_undo_idna(const char **name, char *dest, size_t sz) {
+ int r, k;
+
+ /* Clobbers all arguments on failure... */
+
+ r = dns_label_unescape(name, dest, sz);
+ if (r <= 0)
+ return r;
+
+ k = dns_label_undo_idna(dest, r, dest, sz);
+ if (k < 0)
+ return k;
+ if (k == 0) /* not an IDNA name */
+ return r;
+
+ return k;
+}
+
int dns_name_equal(const char *x, const char *y) {
- int r, q, k, w;
+ int r, q;
assert(x);
assert(y);
@@ -567,27 +585,13 @@ int dns_name_equal(const char *x, const char *y) {
for (;;) {
char la[DNS_LABEL_MAX], lb[DNS_LABEL_MAX];
- r = dns_label_unescape(&x, la, sizeof(la));
+ r = dns_label_unescape_undo_idna(&x, la, sizeof(la));
if (r < 0)
return r;
- if (r > 0) {
- k = dns_label_undo_idna(la, r, la, sizeof(la));
- if (k < 0)
- return k;
- if (k > 0)
- r = k;
- }
- q = dns_label_unescape(&y, lb, sizeof(lb));
+ q = dns_label_unescape_undo_idna(&y, lb, sizeof(lb));
if (q < 0)
return q;
- if (q > 0) {
- w = dns_label_undo_idna(lb, q, lb, sizeof(lb));
- if (w < 0)
- return w;
- if (w > 0)
- q = w;
- }
if (r != q)
return false;
@@ -601,7 +605,7 @@ int dns_name_equal(const char *x, const char *y) {
int dns_name_endswith(const char *name, const char *suffix) {
const char *n, *s, *saved_n = NULL;
- int r, q, k, w;
+ int r, q;
assert(name);
assert(suffix);
@@ -612,30 +616,16 @@ int dns_name_endswith(const char *name, const char *suffix) {
for (;;) {
char ln[DNS_LABEL_MAX], ls[DNS_LABEL_MAX];
- r = dns_label_unescape(&n, ln, sizeof(ln));
+ r = dns_label_unescape_undo_idna(&n, ln, sizeof(ln));
if (r < 0)
return r;
- if (r > 0) {
- k = dns_label_undo_idna(ln, r, ln, sizeof(ln));
- if (k < 0)
- return k;
- if (k > 0)
- r = k;
- }
if (!saved_n)
saved_n = n;
- q = dns_label_unescape(&s, ls, sizeof(ls));
+ q = dns_label_unescape_undo_idna(&s, ls, sizeof(ls));
if (q < 0)
return q;
- if (q > 0) {
- w = dns_label_undo_idna(ls, q, ls, sizeof(ls));
- if (w < 0)
- return w;
- if (w > 0)
- q = w;
- }
if (r == 0 && q == 0)
return true;
@@ -652,24 +642,6 @@ int dns_name_endswith(const char *name, const char *suffix) {
}
}
-static int dns_label_unescape_undo_idna(const char **name, char *dest, size_t sz) {
- int r, k;
-
- /* Clobbers all arguments on failure... */
-
- r = dns_label_unescape(name, dest, sz);
- if (r <= 0)
- return r;
-
- k = dns_label_undo_idna(dest, r, dest, sz);
- if (k < 0)
- return k;
- if (k == 0) /* not an IDNA name */
- return r;
-
- return k;
-}
-
int dns_name_startswith(const char *name, const char *prefix) {
const char *n, *p;
int r, q;
@@ -702,7 +674,7 @@ int dns_name_startswith(const char *name, const char *prefix) {
int dns_name_change_suffix(const char *name, const char *old_suffix, const char *new_suffix, char **ret) {
const char *n, *s, *saved_before = NULL, *saved_after = NULL, *prefix;
- int r, q, k, w;
+ int r, q;
assert(name);
assert(old_suffix);
@@ -718,30 +690,16 @@ int dns_name_change_suffix(const char *name, const char *old_suffix, const char
if (!saved_before)
saved_before = n;
- r = dns_label_unescape(&n, ln, sizeof(ln));
+ r = dns_label_unescape_undo_idna(&n, ln, sizeof(ln));
if (r < 0)
return r;
- if (r > 0) {
- k = dns_label_undo_idna(ln, r, ln, sizeof(ln));
- if (k < 0)
- return k;
- if (k > 0)
- r = k;
- }
if (!saved_after)
saved_after = n;
- q = dns_label_unescape(&s, ls, sizeof(ls));
+ q = dns_label_unescape_undo_idna(&s, ls, sizeof(ls));
if (q < 0)
return q;
- if (q > 0) {
- w = dns_label_undo_idna(ls, q, ls, sizeof(ls));
- if (w < 0)
- return w;
- if (w > 0)
- q = w;
- }
if (r == 0 && q == 0)
break;