mirror of
https://github.com/systemd/systemd.git
synced 2025-03-02 12:58:35 +03:00
Partially unify hostname_is_valid() and dns_name_is_valid()
This makes hostname_is_valid() apply the ldh checks too, rejecting more hostnames.
This commit is contained in:
parent
7470cc4c73
commit
d65652f1f2
@ -69,12 +69,12 @@ int gethostname_strict(char **ret) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool hostname_valid_char(char c) {
|
||||
bool valid_ldh_char(char c) {
|
||||
return
|
||||
(c >= 'a' && c <= 'z') ||
|
||||
(c >= 'A' && c <= 'Z') ||
|
||||
(c >= '0' && c <= '9') ||
|
||||
IN_SET(c, '-', '_', '.');
|
||||
c == '-';
|
||||
}
|
||||
|
||||
/**
|
||||
@ -90,7 +90,7 @@ static bool hostname_valid_char(char c) {
|
||||
bool hostname_is_valid(const char *s, bool allow_trailing_dot) {
|
||||
unsigned n_dots = 0;
|
||||
const char *p;
|
||||
bool dot;
|
||||
bool dot, hyphen;
|
||||
|
||||
if (isempty(s))
|
||||
return false;
|
||||
@ -100,23 +100,34 @@ bool hostname_is_valid(const char *s, bool allow_trailing_dot) {
|
||||
* sequence. Also ensures that the length stays below
|
||||
* HOST_NAME_MAX. */
|
||||
|
||||
for (p = s, dot = true; *p; p++) {
|
||||
for (p = s, dot = hyphen = true; *p; p++)
|
||||
if (*p == '.') {
|
||||
if (dot)
|
||||
if (dot || hyphen)
|
||||
return false;
|
||||
|
||||
dot = true;
|
||||
hyphen = false;
|
||||
n_dots++;
|
||||
} else {
|
||||
if (!hostname_valid_char(*p))
|
||||
|
||||
} else if (*p == '-') {
|
||||
if (dot)
|
||||
return false;
|
||||
|
||||
dot = false;
|
||||
hyphen = true;
|
||||
|
||||
} else {
|
||||
if (!valid_ldh_char(*p))
|
||||
return false;
|
||||
|
||||
dot = false;
|
||||
hyphen = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (dot && (n_dots < 2 || !allow_trailing_dot))
|
||||
return false;
|
||||
if (hyphen)
|
||||
return false;
|
||||
|
||||
if (p-s > HOST_NAME_MAX) /* Note that HOST_NAME_MAX is 64 on
|
||||
* Linux, but DNS allows domain names
|
||||
@ -128,29 +139,40 @@ bool hostname_is_valid(const char *s, bool allow_trailing_dot) {
|
||||
|
||||
char* hostname_cleanup(char *s) {
|
||||
char *p, *d;
|
||||
bool dot;
|
||||
bool dot, hyphen;
|
||||
|
||||
assert(s);
|
||||
|
||||
strshorten(s, HOST_NAME_MAX);
|
||||
|
||||
for (p = s, d = s, dot = true; *p; p++) {
|
||||
for (p = s, d = s, dot = hyphen = true; *p; p++)
|
||||
if (*p == '.') {
|
||||
if (dot)
|
||||
if (dot || hyphen)
|
||||
continue;
|
||||
|
||||
*(d++) = '.';
|
||||
dot = true;
|
||||
} else if (hostname_valid_char(*p)) {
|
||||
hyphen = false;
|
||||
|
||||
} else if (*p == '-') {
|
||||
if (dot)
|
||||
continue;
|
||||
|
||||
*(d++) = '-';
|
||||
dot = false;
|
||||
hyphen = true;
|
||||
|
||||
} else if (valid_ldh_char(*p)) {
|
||||
*(d++) = *p;
|
||||
dot = false;
|
||||
hyphen = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (dot && d > s)
|
||||
d[-1] = 0;
|
||||
else
|
||||
*d = 0;
|
||||
if (d > s && IN_SET(d[-1], '-', '.'))
|
||||
/* The dot can occur at most once, but we might have multiple
|
||||
* hyphens, hence the loop */
|
||||
d--;
|
||||
*d = 0;
|
||||
|
||||
return s;
|
||||
}
|
||||
|
@ -11,6 +11,7 @@ bool hostname_is_set(void);
|
||||
char* gethostname_malloc(void);
|
||||
int gethostname_strict(char **ret);
|
||||
|
||||
bool valid_ldh_char(char c) _const_;
|
||||
bool hostname_is_valid(const char *s, bool allow_trailing_dot) _pure_;
|
||||
char* hostname_cleanup(char *s);
|
||||
|
||||
|
@ -17,6 +17,7 @@
|
||||
#include "dns-domain.h"
|
||||
#include "hashmap.h"
|
||||
#include "hexdecoct.h"
|
||||
#include "hostname-util.h"
|
||||
#include "in-addr-util.h"
|
||||
#include "macro.h"
|
||||
#include "parse-util.h"
|
||||
@ -24,14 +25,6 @@
|
||||
#include "strv.h"
|
||||
#include "utf8.h"
|
||||
|
||||
static bool valid_ldh_char(char c) {
|
||||
return
|
||||
(c >= 'a' && c <= 'z') ||
|
||||
(c >= 'A' && c <= 'Z') ||
|
||||
(c >= '0' && c <= '9') ||
|
||||
c == '-';
|
||||
}
|
||||
|
||||
int dns_label_unescape(const char **name, char *dest, size_t sz, DNSLabelFlags flags) {
|
||||
const char *n;
|
||||
char *d, last_char = 0;
|
||||
|
@ -53,6 +53,12 @@ static void test_hostname_cleanup(void) {
|
||||
assert_se(streq(hostname_cleanup(s), "foobar.com"));
|
||||
s = strdupa("foobar.com.");
|
||||
assert_se(streq(hostname_cleanup(s), "foobar.com"));
|
||||
s = strdupa("foo-bar.-com-.");
|
||||
assert_se(streq(hostname_cleanup(s), "foo-bar.com"));
|
||||
s = strdupa("foo-bar-.-com-.");
|
||||
assert_se(streq(hostname_cleanup(s), "foo-bar--com"));
|
||||
s = strdupa("--foo-bar.-com");
|
||||
assert_se(streq(hostname_cleanup(s), "foo-bar.com"));
|
||||
s = strdupa("fooBAR");
|
||||
assert_se(streq(hostname_cleanup(s), "fooBAR"));
|
||||
s = strdupa("fooBAR.com");
|
||||
|
Loading…
x
Reference in New Issue
Block a user