mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2025-12-27 11:40:08 +01:00
dns: avoid truncation of searches list due to 256 char limit in glibc
Before glibc 2.26, glibc's resolver would only honor 6 search entries
and a character limit of 256. This was lifted recently ([1], [2], [3]).
We also lift this limitation in NetworkManager ([4], [5]).
However, older glibc versions would just truncate the string at 255
characters. In particular, it would not only tuncate the list to 6
entries, but the entry which crosses the 256th character boundary would
be mangled. Avoid that, by adding spaces.
[1] https://sourceware.org/ml/libc-alpha/2017-08/msg00010.html
[2] https://sourceware.org/bugzilla/show_bug.cgi?id=19569
[3] https://sourceware.org/bugzilla/show_bug.cgi?id=21475
[4] https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/47
[5] https://gitlab.freedesktop.org/NetworkManager/NetworkManager/issues/80
(cherry picked from commit 49c11a44e4)
This commit is contained in:
parent
b78a0ebcb1
commit
dfce87b2b7
2 changed files with 31 additions and 2 deletions
|
|
@ -594,10 +594,39 @@ create_resolv_conf (const char *const*searches,
|
|||
g_string_append (str, "# Generated by NetworkManager\n");
|
||||
|
||||
if (searches && searches[0]) {
|
||||
gsize search_base_idx;
|
||||
|
||||
g_string_append (str, "search");
|
||||
search_base_idx = str->len;
|
||||
|
||||
for (i = 0; searches[i]; i++) {
|
||||
const char *s = searches[i];
|
||||
gsize l = strlen (s);
|
||||
|
||||
if ( l == 0
|
||||
|| NM_STRCHAR_ANY (s, ch, NM_IN_SET (ch, ' ', '\t', '\n'))) {
|
||||
/* there should be no such characters in the search entry. Also,
|
||||
* because glibc parser would treat them as line/word separator.
|
||||
*
|
||||
* Skip the value silently. */
|
||||
continue;
|
||||
}
|
||||
|
||||
if (search_base_idx > 0) {
|
||||
if (str->len - search_base_idx + 1 + l > 254) {
|
||||
/* this entry crosses the 256 character boundery. Older glibc versions
|
||||
* would truncate the entry at this point.
|
||||
*
|
||||
* Fill the line with spaces to cross the 256 char boundary and continue
|
||||
* afterwards. This way, the truncation happens between two search entries. */
|
||||
while (str->len - search_base_idx < 257)
|
||||
g_string_append_c (str, ' ');
|
||||
search_base_idx = 0;
|
||||
}
|
||||
}
|
||||
|
||||
g_string_append_c (str, ' ');
|
||||
g_string_append (str, searches[i]);
|
||||
g_string_append_len (str, s, l);
|
||||
}
|
||||
g_string_append_c (str, '\n');
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1884,7 +1884,7 @@ test_dns_create_resolv_conf (void)
|
|||
NULL,
|
||||
NULL,
|
||||
"# Generated by NetworkManager\n"
|
||||
"search a2x456789.b2x456789.c2x456789.d2x456789.e2x456789.f2x456789.g2x456789.h2x456789.i2x456789.j2x4567890 a2y456789.b2y456789.c2y456789.d2y456789.e2y456789.f2y456789.g2y456789.h2y456789.i2y456789.j2y4567890 a2z456789.b2z456789.c2z456789.d2z456789.e2z456789.f2z456789.g2z456789.h2z456789.i2z456789.j2z4567890\n"
|
||||
"search a2x456789.b2x456789.c2x456789.d2x456789.e2x456789.f2x456789.g2x456789.h2x456789.i2x456789.j2x4567890 a2y456789.b2y456789.c2y456789.d2y456789.e2y456789.f2y456789.g2y456789.h2y456789.i2y456789.j2y4567890 a2z456789.b2z456789.c2z456789.d2z456789.e2z456789.f2z456789.g2z456789.h2z456789.i2z456789.j2z4567890\n"
|
||||
"");
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue