summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Weimer <fweimer@redhat.com>2017-11-11 11:41:45 +0100
committerFlorian Weimer <fweimer@redhat.com>2017-11-11 11:41:45 +0100
commit9e0ad3049dbae88d615bfb038e53bf365a39a634 (patch)
treed32e5a7fdec7a85c68fe33208868a46bdab441dd
parente2a9fca8101443076235a8dbcfceaa2d96bf4801 (diff)
downloadglibc-9e0ad3049dbae88d615bfb038e53bf365a39a634.tar.gz
resolv: ns_name_pton should report trailing \ as error [BZ #22413]
-rw-r--r--ChangeLog6
-rw-r--r--resolv/ns_name.c5
-rw-r--r--resolv/tst-ns_name_pton.c7
3 files changed, 18 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 5ddb6fdc46..4739e62246 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
2017-11-11 Florian Weimer <fweimer@redhat.com>
+ [BZ #22413]
+ * resolv/ns_name.c (ns_name_pton): Treat trailing backslash as error.
+ * resolv/tst-ns_name_pton.c (tests): Add trailing backslash tests.
+
+2017-11-11 Florian Weimer <fweimer@redhat.com>
+
* resolv/tst-ns_name_pton.c: New file.
* resolv/Makefile (tests): Add tst-ns_name_pton.
(tst-ns_name_pton): Link against libresolv.
diff --git a/resolv/ns_name.c b/resolv/ns_name.c
index 08a75e2fe0..73213fee2d 100644
--- a/resolv/ns_name.c
+++ b/resolv/ns_name.c
@@ -222,6 +222,11 @@ ns_name_pton(const char *src, u_char *dst, size_t dstsiz)
}
*bp++ = (u_char)c;
}
+ if (escaped) {
+ /* Trailing backslash. */
+ __set_errno (EMSGSIZE);
+ return -1;
+ }
c = (bp - label - 1);
if ((c & NS_CMPRSFLGS) != 0) { /*%< Label too big. */
__set_errno (EMSGSIZE);
diff --git a/resolv/tst-ns_name_pton.c b/resolv/tst-ns_name_pton.c
index 879d97c9d3..73bdb05e08 100644
--- a/resolv/tst-ns_name_pton.c
+++ b/resolv/tst-ns_name_pton.c
@@ -127,6 +127,13 @@ static const struct test_case tests[] =
"\377\377", NULL, },
{ STRING63OCT "." STRING63OCT "." STRING63OCT "." STRING60OCT
"\377\377\377", NULL, },
+ { "\\", NULL, },
+ { "\\\\", "\\\\", false },
+ { "\\\\.", "\\\\", true },
+ { "\\\\\\", NULL, },
+ { "a\\", NULL, },
+ { "a.\\", NULL, },
+ { "a.b\\", NULL, },
};
static int