Hello community, here is the log from the commit of package dhcp for openSUSE:Factory checked in at 2019-10-25 18:40:07 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/dhcp (Old) and /work/SRC/openSUSE:Factory/.dhcp.new.2990 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "dhcp" Fri Oct 25 18:40:07 2019 rev:115 rq:741877 version:4.3.5 Changes: -------- --- /work/SRC/openSUSE:Factory/dhcp/dhcp.changes 2019-09-05 12:33:30.659582804 +0200 +++ /work/SRC/openSUSE:Factory/.dhcp.new.2990/dhcp.changes 2019-10-25 18:40:09.283784946 +0200 @@ -1,0 +2,19 @@ +Tue Oct 15 15:18:59 UTC 2019 - Reinhard Max <m...@suse.com> + +- bsc#1134078, CVE-2019-6470, dhcp-CVE-2019-6470.patch: + DHCPv6 server crashes regularly. +- Add compile option --enable-secs-byteorder to avoid duplicate + lease warnings [bsc#1089524]. + +------------------------------------------------------------------- +Wed Oct 2 16:50:48 CEST 2019 - ku...@suse.de + +- Make systemd a weak dependency as we don't want that in a container + +------------------------------------------------------------------- +Wed Aug 28 12:38:32 UTC 2019 - Reinhard Max <m...@suse.com> + +- bsc#1136572: Use IPv6 when called as dhclient6, dhcpd6, and + dhcrelay6 (0021-dhcp-ip-family-symlinks.patch). + +------------------------------------------------------------------- New: ---- 0021-dhcp-ip-family-symlinks.patch dhcp-CVE-2019-6470.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ dhcp.spec ++++++ --- /var/tmp/diff_new_pack.ZKz6Wx/_old 2019-10-25 18:40:10.763786339 +0200 +++ /var/tmp/diff_new_pack.ZKz6Wx/_new 2019-10-25 18:40:10.771786347 +0200 @@ -86,6 +86,8 @@ Patch18: 0018-client-fail-on-script-pre-init-error-bsc-912098.patch # PATCH-FIX-SLE dhcp-4.2.4-P1-interval bsc#947780 Patch20: 0020-dhcp-4.x.x-fixed-improper-lease-duration-checking.patch +Patch21: 0021-dhcp-ip-family-symlinks.patch +Patch22: dhcp-CVE-2019-6470.patch BuildRequires: automake BuildRequires: dos2unix BuildRequires: libtool @@ -103,7 +105,7 @@ Requires: net-tools Requires(post): %fillup_prereq Requires(pre): shadow -%systemd_requires +%systemd_ordering %if 0%{?suse_version} >= 1330 Requires(pre): group(nogroup) %endif @@ -193,6 +195,8 @@ %patch17 -p1 %patch18 -p1 %patch20 +%patch21 +%patch22 ## find . -type f -name \*.cat\* -exec rm -f {} \; dos2unix contrib/ms2isc/* @@ -236,6 +240,7 @@ --enable-failover \ --enable-paranoia \ --enable-early-chroot \ + --enable-secs-byteorder \ --with-ldap \ --with-ldapcrypto \ --with-cli-pid-file=%{_localstatedir}/run/dhclient.pid \ ++++++ 0021-dhcp-ip-family-symlinks.patch ++++++ --- client/dhclient.c.orig +++ client/dhclient.c @@ -252,6 +252,17 @@ main(int argc, char **argv) { progname = argv[0]; #endif +#ifdef DHCPv6 + /* Support being called using `dhclient4` or `dhclient6` symlinks */ + if (argv[0][strlen(argv[0]) - 1] == '4') { + local_family_set = 1; + local_family = AF_INET; + } else if (argv[0][strlen(argv[0]) - 1] == '6') { + local_family_set = 1; + local_family = AF_INET6; + } +#endif /* DHCPv6 */ + /* Initialize client globals. */ memset(&default_duid, 0, sizeof(default_duid)); --- relay/dhcrelay.c.orig +++ relay/dhcrelay.c @@ -237,6 +237,17 @@ main(int argc, char **argv) { progname = argv[0]; #endif +#ifdef DHCPv6 + /* Support being called using `dhcrelay4` or `dhcrelay6` symlinks */ + if (argv[0][strlen(argv[0]) - 1] == '4') { + local_family_set = 1; + local_family = AF_INET; + } else if (argv[0][strlen(argv[0]) - 1] == '6') { + local_family_set = 1; + local_family = AF_INET6; + } +#endif /* DHCPv6 */ + /* Make sure that file descriptors 0(stdin), 1,(stdout), and 2(stderr) are open. To do this, we assume that when we open a file the lowest available file descriptor is used. */ --- server/dhcpd.c.orig +++ server/dhcpd.c @@ -260,6 +260,17 @@ main(int argc, char **argv) { progname = argv[0]; #endif +#ifdef DHCPv6 + /* Support being called using `dhcpd4` or `dhcpd6` symlinks */ + if (argv[0][strlen(argv[0]) - 1] == '4') { + local_family_set = 1; + local_family = AF_INET; + } else if (argv[0][strlen(argv[0]) - 1] == '6') { + local_family_set = 1; + local_family = AF_INET6; + } +#endif /* DHCPv6 */ + /* Make sure that file descriptors 0 (stdin), 1, (stdout), and 2 (stderr) are open. To do this, we assume that when we open a file the lowest available file descriptor is used. */ ++++++ dhcp-CVE-2019-6470.patch ++++++ commit 21ae396088a3fbe046e3122286d1288eeacce7d3 Author: Thomas Markwalder <tm...@isc.org> Date: Fri Dec 1 09:21:42 2017 -0500 [v4_3] Use 0 instead of -1 to indicate empty heap index Merges in rt46719. --- includes/dhcpd.h.orig +++ includes/dhcpd.h @@ -1596,8 +1596,9 @@ struct iasubopt { */ #define EXPIRED_IPV6_CLEANUP_TIME (60*60) - int heap_index; /* index into heap, or -1 - (internal use only) */ + /* index into heaps, or -1 (internal use only) */ + int active_index; + int inactive_index; /* * A pointer to the state of the ddns update for this lease. --- server/mdb6.c.orig +++ server/mdb6.c @@ -216,7 +216,8 @@ iasubopt_allocate(struct iasubopt **iasu tmp->refcnt = 1; tmp->state = FTS_FREE; - tmp->heap_index = -1; + tmp->active_index = 0; + tmp->inactive_index = 0; tmp->plen = 255; *iasubopt = tmp; @@ -600,14 +601,18 @@ lease_older(void *a, void *b) { } /* - * Helper function for lease address/prefix heaps. + * Helper functions for lease address/prefix heaps. * Callback when an address's position in the heap changes. */ static void -lease_index_changed(void *iasubopt, unsigned int new_heap_index) { - ((struct iasubopt *)iasubopt)-> heap_index = new_heap_index; +active_changed(void *iasubopt, unsigned int new_heap_index) { + ((struct iasubopt *)iasubopt)->active_index = new_heap_index; } +static void +inactive_changed(void *iasubopt, unsigned int new_heap_index) { + ((struct iasubopt *)iasubopt)->inactive_index = new_heap_index; +} /*! * @@ -660,13 +665,13 @@ ipv6_pool_allocate(struct ipv6_pool **po dfree(tmp, file, line); return ISC_R_NOMEMORY; } - if (isc_heap_create(dhcp_gbl_ctx.mctx, lease_older, lease_index_changed, + if (isc_heap_create(dhcp_gbl_ctx.mctx, lease_older, active_changed, 0, &(tmp->active_timeouts)) != ISC_R_SUCCESS) { iasubopt_free_hash_table(&(tmp->leases), file, line); dfree(tmp, file, line); return ISC_R_NOMEMORY; } - if (isc_heap_create(dhcp_gbl_ctx.mctx, lease_older, lease_index_changed, + if (isc_heap_create(dhcp_gbl_ctx.mctx, lease_older, inactive_changed, 0, &(tmp->inactive_timeouts)) != ISC_R_SUCCESS) { isc_heap_destroy(&(tmp->active_timeouts)); iasubopt_free_hash_table(&(tmp->leases), file, line); @@ -1186,7 +1191,7 @@ cleanup_lease6(ia_hash_t *ia_table, * Remove the old lease from the active heap and from the hash table * then remove the lease from the IA and clean up the IA if necessary. */ - isc_heap_delete(pool->active_timeouts, test_iasubopt->heap_index); + isc_heap_delete(pool->active_timeouts, test_iasubopt->active_index); pool->num_active--; if (pool->ipv6_pond) pool->ipv6_pond->num_active--; @@ -1259,7 +1264,7 @@ add_lease6(struct ipv6_pool *pool, struc if ((test_iasubopt->state == FTS_ACTIVE) || (test_iasubopt->state == FTS_ABANDONED)) { isc_heap_delete(pool->active_timeouts, - test_iasubopt->heap_index); + test_iasubopt->active_index); pool->num_active--; if (pool->ipv6_pond) pool->ipv6_pond->num_active--; @@ -1271,7 +1276,7 @@ add_lease6(struct ipv6_pool *pool, struc } } else { isc_heap_delete(pool->inactive_timeouts, - test_iasubopt->heap_index); + test_iasubopt->inactive_index); pool->num_inactive--; } @@ -1392,14 +1397,13 @@ lease6_usable(struct iasubopt *lease) { static isc_result_t move_lease_to_active(struct ipv6_pool *pool, struct iasubopt *lease) { isc_result_t insert_result; - int old_heap_index; - old_heap_index = lease->heap_index; insert_result = isc_heap_insert(pool->active_timeouts, lease); if (insert_result == ISC_R_SUCCESS) { iasubopt_hash_add(pool->leases, &lease->addr, sizeof(lease->addr), lease, MDL); - isc_heap_delete(pool->inactive_timeouts, old_heap_index); + isc_heap_delete(pool->inactive_timeouts, + lease->inactive_index); pool->num_active++; pool->num_inactive--; lease->state = FTS_ACTIVE; @@ -1449,16 +1453,16 @@ renew_lease6(struct ipv6_pool *pool, str if (lease->state == FTS_ACTIVE) { if (old_end_time <= lease->hard_lifetime_end_time) { isc_heap_decreased(pool->active_timeouts, - lease->heap_index); + lease->active_index); } else { isc_heap_increased(pool->active_timeouts, - lease->heap_index); + lease->active_index); } return ISC_R_SUCCESS; } else if (lease->state == FTS_ABANDONED) { char tmp_addr[INET6_ADDRSTRLEN]; lease->state = FTS_ACTIVE; - isc_heap_increased(pool->active_timeouts, lease->heap_index); + isc_heap_increased(pool->active_timeouts, lease->active_index); log_info("Reclaiming previously abandoned address %s", inet_ntop(AF_INET6, &(lease->addr), tmp_addr, sizeof(tmp_addr))); @@ -1480,9 +1484,7 @@ static isc_result_t move_lease_to_inactive(struct ipv6_pool *pool, struct iasubopt *lease, binding_state_t state) { isc_result_t insert_result; - int old_heap_index; - old_heap_index = lease->heap_index; insert_result = isc_heap_insert(pool->inactive_timeouts, lease); if (insert_result == ISC_R_SUCCESS) { /* @@ -1533,7 +1535,7 @@ move_lease_to_inactive(struct ipv6_pool iasubopt_hash_delete(pool->leases, &lease->addr, sizeof(lease->addr), MDL); - isc_heap_delete(pool->active_timeouts, old_heap_index); + isc_heap_delete(pool->active_timeouts, lease->active_index); lease->state = state; pool->num_active--; pool->num_inactive++; @@ -1611,7 +1613,7 @@ decline_lease6(struct ipv6_pool *pool, s pool->ipv6_pond->num_abandoned++; lease->hard_lifetime_end_time = MAX_TIME; - isc_heap_decreased(pool->active_timeouts, lease->heap_index); + isc_heap_decreased(pool->active_timeouts, lease->active_index); return ISC_R_SUCCESS; } @@ -1884,7 +1886,7 @@ cleanup_old_expired(struct ipv6_pool *po break; } - isc_heap_delete(pool->inactive_timeouts, tmp->heap_index); + isc_heap_delete(pool->inactive_timeouts, tmp->inactive_index); pool->num_inactive--; if (tmp->ia != NULL) { --- server/tests/mdb6_unittest.c.orig +++ server/tests/mdb6_unittest.c @@ -65,8 +65,13 @@ ATF_TC_BODY(iaaddr_basic, tc) if (iaaddr->state != FTS_FREE) { atf_tc_fail("ERROR: bad state %s:%d", MDL); } - if (iaaddr->heap_index != -1) { - atf_tc_fail("ERROR: bad heap_index %s:%d", MDL); + if (iaaddr->active_index != 0) { + atf_tc_fail("ERROR: bad active_index :%d %s:%d", + iaaddr->active_index, MDL); + } + if (iaaddr->inactive_index != 0) { + atf_tc_fail("ERROR: bad inactive_index %d %s:%d", + iaaddr->inactive_index, MDL); } if (iasubopt_reference(&iaaddr_copy, iaaddr, MDL) != ISC_R_SUCCESS) { atf_tc_fail("ERROR: iasubopt_reference() %s:%d", MDL);