]> git.ipfire.org Git - thirdparty/ldns.git/commitdiff
Ensure uniform handling of spaces & tabs when parsing RRs. 159/head
authorFelipe Gasper <felipe@felipegasper.com>
Wed, 16 Mar 2022 00:57:00 +0000 (20:57 -0400)
committerFelipe Gasper <felipe@felipegasper.com>
Wed, 16 Mar 2022 01:16:44 +0000 (21:16 -0400)
Issue #157: This fixes the same type of bug as #147, in a couple places
where that issue’s fix didn’t apply. A small refactor is done to
deduplicate whitespace-checking logic. Tests are added as well.

rr.c
test/28-tab-instead-of-space.tpkg/28-tab-between-cstrings-2.db [new file with mode: 0644]
test/28-tab-instead-of-space.tpkg/28-tab-between-cstrings-2.dsc [new file with mode: 0644]
test/28-tab-instead-of-space.tpkg/28-tab-between-cstrings-2.help [new file with mode: 0644]
test/28-tab-instead-of-space.tpkg/28-tab-between-cstrings-2.test [new file with mode: 0644]
test/29-generic-rdata-tab.tpkg/29-generic-rdata-tab.db [new file with mode: 0644]
test/29-generic-rdata-tab.tpkg/29-generic-rdata-tab.dsc [new file with mode: 0644]
test/29-generic-rdata-tab.tpkg/29-generic-rdata-tab.help [new file with mode: 0644]
test/29-generic-rdata-tab.tpkg/29-generic-rdata-tab.test [new file with mode: 0644]

diff --git a/rr.c b/rr.c
index 382d0b5961680be5c7cb38cfd6cd762d7f2a834c..2f64c15dac73708114e6bce373afec23cb2f6950 100644 (file)
--- a/rr.c
+++ b/rr.c
 #define LDNS_TTL_DATALEN    21
 #define LDNS_RRLIST_INIT    8
 
+#define _IS_WHITESPACE(chr) \
+    ( NULL != strchr( LDNS_PARSE_NO_NL, chr) )
+
+#define _BUFFER_IS_AT_WHITESPACE(rd_buf) \
+    _IS_WHITESPACE(*(ldns_buffer_current(rd_buf)))
+
 ldns_rr *
 ldns_rr_new(void)
 {
@@ -372,9 +378,9 @@ ldns_rr_new_frm_str_internal(ldns_rr **newrr, const char *str,
                                desc, r_cnt)) &&
                                ldns_buffer_remaining(rd_buf) > 0){
 
-                       /* skip spaces & tabs */
+                       /* skip whitespace */
                        while (ldns_buffer_remaining(rd_buf) > 0 &&
-                               NULL != strchr( LDNS_PARSE_NO_NL, *(ldns_buffer_current(rd_buf)) )) {
+                               _BUFFER_IS_AT_WHITESPACE(rd_buf)) {
                                ldns_buffer_skip(rd_buf, 1);
                        }
 
@@ -396,9 +402,9 @@ ldns_rr_new_frm_str_internal(ldns_rr **newrr, const char *str,
                 * _maximum() only
                 */
 
-               /* skip spaces */
+               /* skip whitespace */
                while (ldns_buffer_position(rd_buf) < ldns_buffer_limit(rd_buf)
-                               && *(ldns_buffer_current(rd_buf)) == ' '
+                               && _BUFFER_IS_AT_WHITESPACE(rd_buf)
                                && !quoted) {
 
                        ldns_buffer_skip(rd_buf, 1);
@@ -420,7 +426,7 @@ ldns_rr_new_frm_str_internal(ldns_rr **newrr, const char *str,
 
                /* unknown RR data */
                if (strncmp(rd, "\\#", 2) == 0 && !quoted &&
-                               (rd_strlen == 2 || rd[2]==' ')) {
+                               (rd_strlen == 2 || _IS_WHITESPACE(rd[2]))) {
 
                        was_unknown_rr_format = 1;
                        /* go back to before \#
diff --git a/test/28-tab-instead-of-space.tpkg/28-tab-between-cstrings-2.db b/test/28-tab-instead-of-space.tpkg/28-tab-between-cstrings-2.db
new file mode 100644 (file)
index 0000000..99730d3
--- /dev/null
@@ -0,0 +1 @@
+com. 14400 IN NAPTR 100   10 S SIP+D2U "!^.*$!sip:customer-service@example.com!"       com.
diff --git a/test/28-tab-instead-of-space.tpkg/28-tab-between-cstrings-2.dsc b/test/28-tab-instead-of-space.tpkg/28-tab-between-cstrings-2.dsc
new file mode 100644 (file)
index 0000000..9017a0e
--- /dev/null
@@ -0,0 +1,16 @@
+BaseName: 28-tab-instead-of-space
+Version: 1.0
+Description: Check for GH 157 regression
+CreationDate: Tue Mar 15 21:01:34 EST 2022
+Maintainer: 
+Category: 
+Component:
+CmdDepends: 
+Depends: 
+Help: 28-tab-instead-of-space.help
+Pre: 
+Post: 
+Test: 28-tab-instead-of-space.test
+AuxFiles: 
+Passed:
+Failure:
diff --git a/test/28-tab-instead-of-space.tpkg/28-tab-between-cstrings-2.help b/test/28-tab-instead-of-space.tpkg/28-tab-between-cstrings-2.help
new file mode 100644 (file)
index 0000000..f54a790
--- /dev/null
@@ -0,0 +1 @@
+This requires no arguments.
diff --git a/test/28-tab-instead-of-space.tpkg/28-tab-between-cstrings-2.test b/test/28-tab-instead-of-space.tpkg/28-tab-between-cstrings-2.test
new file mode 100644 (file)
index 0000000..3c6ab2c
--- /dev/null
@@ -0,0 +1,15 @@
+# #-- 28-tab-instead-of-space.test --#
+# source the master var file when it's there
+[ -f ../.tpkg.var.master ] && source ../.tpkg.var.master
+
+export PATH=$PATH:/usr/sbin:/sbin:/usr/local/bin:/usr/local/sbin:.
+
+export LD_LIBRARY_PATH=../../lib:$LD_LIBRARY_PATH
+
+OUTPUT=`../../examples/ldns-read-zone 28-tab-instead-of-space.db`
+
+if [[ $? -eq 0 ]]; then
+    echo $OUTPUT | grep customer-service
+else
+        exit 1
+fi
diff --git a/test/29-generic-rdata-tab.tpkg/29-generic-rdata-tab.db b/test/29-generic-rdata-tab.tpkg/29-generic-rdata-tab.db
new file mode 100644 (file)
index 0000000..d32d21d
--- /dev/null
@@ -0,0 +1,2 @@
+a.example.     CLASS32 TYPE731 \#      6       abcd    (
+                                                       ef      01      23      45      )
diff --git a/test/29-generic-rdata-tab.tpkg/29-generic-rdata-tab.dsc b/test/29-generic-rdata-tab.tpkg/29-generic-rdata-tab.dsc
new file mode 100644 (file)
index 0000000..67927e1
--- /dev/null
@@ -0,0 +1,16 @@
+BaseName: 29-generic-rdata-tab
+Version: 1.0
+Description: Check for GH 157 regression
+CreationDate: Tue Mar 15 21:01:34 EST 2022
+Maintainer: 
+Category: 
+Component:
+CmdDepends: 
+Depends: 
+Help: 29-generic-rdata-tab.help
+Pre: 
+Post: 
+Test: 29-generic-rdata-tab.test
+AuxFiles: 
+Passed:
+Failure:
diff --git a/test/29-generic-rdata-tab.tpkg/29-generic-rdata-tab.help b/test/29-generic-rdata-tab.tpkg/29-generic-rdata-tab.help
new file mode 100644 (file)
index 0000000..f54a790
--- /dev/null
@@ -0,0 +1 @@
+This requires no arguments.
diff --git a/test/29-generic-rdata-tab.tpkg/29-generic-rdata-tab.test b/test/29-generic-rdata-tab.tpkg/29-generic-rdata-tab.test
new file mode 100644 (file)
index 0000000..e38136d
--- /dev/null
@@ -0,0 +1,15 @@
+# #-- 29-generic-rdata-tab.test --#
+# source the master var file when it's there
+[ -f ../.tpkg.var.master ] && source ../.tpkg.var.master
+
+export PATH=$PATH:/usr/sbin:/sbin:/usr/local/bin:/usr/local/sbin:.
+
+export LD_LIBRARY_PATH=../../lib:$LD_LIBRARY_PATH
+
+OUTPUT=`../../examples/ldns-read-zone 29-generic-rdata-tab.db`
+
+if [[ $? -eq 0 ]]; then
+    echo $OUTPUT | grep CLASS32
+else
+        exit 1
+fi