From: Vijay Anusuri <vanus...@mvista.com>

Upstream Patch: 
https://downloads.isc.org/isc/bind9/9.16.42/patches/0001-CVE-2023-2828.patch

LINK: https://security-tracker.debian.org/tracker/CVE-2023-2828

Signed-off-by: Vijay Anusuri <vanus...@mvista.com>
---
 .../bind/bind/CVE-2023-2828.patch             | 166 ++++++++++++++++++
 .../recipes-connectivity/bind/bind_9.11.37.bb |   1 +
 2 files changed, 167 insertions(+)
 create mode 100644 meta/recipes-connectivity/bind/bind/CVE-2023-2828.patch

diff --git a/meta/recipes-connectivity/bind/bind/CVE-2023-2828.patch 
b/meta/recipes-connectivity/bind/bind/CVE-2023-2828.patch
new file mode 100644
index 0000000000..6f6c104530
--- /dev/null
+++ b/meta/recipes-connectivity/bind/bind/CVE-2023-2828.patch
@@ -0,0 +1,166 @@
+
+Upstream-Status: Backport [import from debian 
security.debian.org/debian-security/pool/updates/main/b/bind9/bind9_9.11.5.P4+dfsg-5.1+deb10u9.debian.tar.xz
+Upstream patch 
https://downloads.isc.org/isc/bind9/9.16.42/patches/0001-CVE-2023-2828.patch]
+Upstream Commit: 
https://github.com/isc-projects/bind9/commit/da0eafcdee52147e72d407cc3b9f179378ee1d3a
+CVE: CVE-2023-2828
+Signed-off-by: Vijay Anusuri <vanus...@mvista.com>
+
+---
+ lib/dns/rbtdb.c | 106 +++++++++++++++++++++++++++++++++-----------------------
+ 1 file changed, 63 insertions(+), 43 deletions(-)
+
+diff --git a/lib/dns/rbtdb.c b/lib/dns/rbtdb.c
+index b1b928c..3165e26 100644
+--- a/lib/dns/rbtdb.c
++++ b/lib/dns/rbtdb.c
+@@ -792,7 +792,7 @@ static void update_header(dns_rbtdb_t *rbtdb, 
rdatasetheader_t *header,
+ static void expire_header(dns_rbtdb_t *rbtdb, rdatasetheader_t *header,
+                         bool tree_locked, expire_t reason);
+ static void overmem_purge(dns_rbtdb_t *rbtdb, unsigned int locknum_start,
+-                        isc_stdtime_t now, bool tree_locked);
++                        size_t purgesize, bool tree_locked);
+ static isc_result_t resign_insert(dns_rbtdb_t *rbtdb, int idx,
+                                 rdatasetheader_t *newheader);
+ static void resign_delete(dns_rbtdb_t *rbtdb, rbtdb_version_t *version,
+@@ -6784,6 +6784,16 @@ addclosest(dns_rbtdb_t *rbtdb, rdatasetheader_t 
*newheader,
+ 
+ static dns_dbmethods_t zone_methods;
+ 
++static size_t
++rdataset_size(rdatasetheader_t *header) {
++      if (!NONEXISTENT(header)) {
++              return (dns_rdataslab_size((unsigned char *)header,
++                                         sizeof(*header)));
++      }
++
++      return (sizeof(*header));
++}
++
+ static isc_result_t
+ addrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version,
+           isc_stdtime_t now, dns_rdataset_t *rdataset, unsigned int options,
+@@ -6932,7 +6942,8 @@ addrdataset(dns_db_t *db, dns_dbnode_t *node, 
dns_dbversion_t *version,
+       }
+ 
+       if (cache_is_overmem)
+-              overmem_purge(rbtdb, rbtnode->locknum, now, tree_locked);
++              overmem_purge(rbtdb, rbtnode->locknum, rdataset_size(newheader),
++                            tree_locked);
+ 
+       NODE_LOCK(&rbtdb->node_locks[rbtnode->locknum].lock,
+                 isc_rwlocktype_write);
+@@ -6947,9 +6958,14 @@ addrdataset(dns_db_t *db, dns_dbnode_t *node, 
dns_dbversion_t *version,
+                       cleanup_dead_nodes(rbtdb, rbtnode->locknum);
+ 
+               header = isc_heap_element(rbtdb->heaps[rbtnode->locknum], 1);
+-              if (header && header->rdh_ttl < now - RBTDB_VIRTUAL)
+-                      expire_header(rbtdb, header, tree_locked,
+-                                    expire_ttl);
++              if (header != NULL) {
++                      dns_ttl_t rdh_ttl = header->rdh_ttl;
++
++                      if (rdh_ttl < now - RBTDB_VIRTUAL) {
++                              expire_header(rbtdb, header, tree_locked,
++                                            expire_ttl);
++                      }
++              }
+ 
+               /*
+                * If we've been holding a write lock on the tree just for
+@@ -10388,54 +10404,58 @@ update_header(dns_rbtdb_t *rbtdb, rdatasetheader_t 
*header,
+       ISC_LIST_PREPEND(rbtdb->rdatasets[header->node->locknum], header, link);
+ }
+ 
++static size_t
++expire_lru_headers(dns_rbtdb_t *rbtdb, unsigned int locknum, size_t purgesize,
++                 bool tree_locked) {
++      rdatasetheader_t *header, *header_prev;
++      size_t purged = 0;
++
++      for (header = ISC_LIST_TAIL(rbtdb->rdatasets[locknum]);
++           header != NULL && purged <= purgesize; header = header_prev)
++      {
++              header_prev = ISC_LIST_PREV(header, link);
++              /*
++               * Unlink the entry at this point to avoid checking it
++               * again even if it's currently used someone else and
++               * cannot be purged at this moment.  This entry won't be
++               * referenced any more (so unlinking is safe) since the
++               * TTL was reset to 0.
++               */
++              ISC_LIST_UNLINK(rbtdb->rdatasets[locknum], header, link);
++              size_t header_size = rdataset_size(header);
++              expire_header(rbtdb, header, tree_locked, expire_lru);
++              purged += header_size;
++      }
++
++      return (purged);
++}
++
+ /*%
+- * Purge some expired and/or stale (i.e. unused for some period) cache entries
+- * under an overmem condition.  To recover from this condition quickly, up to
+- * 2 entries will be purged.  This process is triggered while adding a new
+- * entry, and we specifically avoid purging entries in the same LRU bucket as
+- * the one to which the new entry will belong.  Otherwise, we might purge
+- * entries of the same name of different RR types while adding RRsets from a
+- * single response (consider the case where we're adding A and AAAA glue 
records
+- * of the same NS name).
+- */
++ * Purge some stale (i.e. unused for some period - LRU based cleaning) cache
++ * entries under the overmem condition.  To recover from this condition 
quickly,
++ * we cleanup entries up to the size of newly added rdata (passed as 
purgesize).
++ *
++ * This process is triggered while adding a new entry, and we specifically 
avoid
++ * purging entries in the same LRU bucket as the one to which the new entry 
will
++ * belong.  Otherwise, we might purge entries of the same name of different RR
++ * types while adding RRsets from a single response (consider the case where
++ * we're adding A and AAAA glue records of the same NS name).
++*/
+ static void
+-overmem_purge(dns_rbtdb_t *rbtdb, unsigned int locknum_start,
+-            isc_stdtime_t now, bool tree_locked)
++overmem_purge(dns_rbtdb_t *rbtdb, unsigned int locknum_start, size_t 
purgesize,
++            bool tree_locked)
+ {
+-      rdatasetheader_t *header, *header_prev;
+       unsigned int locknum;
+-      int purgecount = 2;
++      size_t purged = 0;
+ 
+       for (locknum = (locknum_start + 1) % rbtdb->node_lock_count;
+-           locknum != locknum_start && purgecount > 0;
++           locknum != locknum_start && purged <= purgesize;
+            locknum = (locknum + 1) % rbtdb->node_lock_count) {
+               NODE_LOCK(&rbtdb->node_locks[locknum].lock,
+                         isc_rwlocktype_write);
+ 
+-              header = isc_heap_element(rbtdb->heaps[locknum], 1);
+-              if (header && header->rdh_ttl < now - RBTDB_VIRTUAL) {
+-                      expire_header(rbtdb, header, tree_locked,
+-                                    expire_ttl);
+-                      purgecount--;
+-              }
+-
+-              for (header = ISC_LIST_TAIL(rbtdb->rdatasets[locknum]);
+-                   header != NULL && purgecount > 0;
+-                   header = header_prev) {
+-                      header_prev = ISC_LIST_PREV(header, link);
+-                      /*
+-                       * Unlink the entry at this point to avoid checking it
+-                       * again even if it's currently used someone else and
+-                       * cannot be purged at this moment.  This entry won't be
+-                       * referenced any more (so unlinking is safe) since the
+-                       * TTL was reset to 0.
+-                       */
+-                      ISC_LIST_UNLINK(rbtdb->rdatasets[locknum], header,
+-                                      link);
+-                      expire_header(rbtdb, header, tree_locked,
+-                                    expire_lru);
+-                      purgecount--;
+-              }
++              purged += expire_lru_headers(rbtdb, locknum, purgesize - purged,
++                                           tree_locked);
+ 
+               NODE_UNLOCK(&rbtdb->node_locks[locknum].lock,
+                                   isc_rwlocktype_write);
diff --git a/meta/recipes-connectivity/bind/bind_9.11.37.bb 
b/meta/recipes-connectivity/bind/bind_9.11.37.bb
index 2fca28e684..80fbcbfa36 100644
--- a/meta/recipes-connectivity/bind/bind_9.11.37.bb
+++ b/meta/recipes-connectivity/bind/bind_9.11.37.bb
@@ -22,6 +22,7 @@ SRC_URI = 
"https://ftp.isc.org/isc/bind9/${PV}/${BPN}-${PV}.tar.gz \
            file://CVE-2022-2795.patch \
            file://CVE-2022-38177.patch \
            file://CVE-2022-38178.patch \
+           file://CVE-2023-2828.patch \
            "
 
 SRC_URI[sha256sum] = 
"0d8efbe7ec166ada90e46add4267b7e7c934790cba9bd5af6b8380a4fbfb5aff"
-- 
2.25.1

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#187274): 
https://lists.openembedded.org/g/openembedded-core/message/187274
Mute This Topic: https://lists.openembedded.org/mt/101187051/21656
Group Owner: openembedded-core+ow...@lists.openembedded.org
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to