diff --git a/0001-change-bug-url.patch b/0001-change-bug-url.patch new file mode 100644 index 0000000000000000000000000000000000000000..b6afa57a104c3ac1fd2a7653af765f56fb283bef --- /dev/null +++ b/0001-change-bug-url.patch @@ -0,0 +1,78 @@ +From 23dfbc560028bf7429196db1a3826f8b80c19d3e Mon Sep 17 00:00:00 2001 +From: Pavel Zhukov +Date: Thu, 21 Feb 2019 10:09:57 +0100 +Subject: [PATCH 01/26] change bug url +Cc: pzhukov@redhat.com + +--- + omapip/errwarn.c | 47 ++++++++++++++++++++++++++++++++++++++++++----- + 1 file changed, 42 insertions(+), 5 deletions(-) + +diff --git a/omapip/errwarn.c b/omapip/errwarn.c +index e30f8a0..09a3004 100644 +--- a/omapip/errwarn.c ++++ b/omapip/errwarn.c +@@ -48,6 +48,41 @@ void (*log_cleanup) (void); + static char mbuf [CVT_BUF_MAX + 1]; + static char fbuf [CVT_BUF_MAX + 1]; + ++// get BUG_REPORT_URL from /etc/os-release ++char * bug_report_url(void) { ++ FILE * file = fopen("/etc/os-release", "r"); ++ size_t len; ++ char * line = NULL; ++ char * url = NULL; ++ size_t url_len = 256; ++ ++ url = (char *) malloc(url_len * sizeof(char)); ++ strcpy(url, "https://bugzilla.redhat.com/"); ++ ++ if (!file) ++ return url; ++ ++ while ((getline(&line, &len, file)) != -1) { ++ if (strstr(line, "BUG_REPORT_URL") != NULL) { ++ char * start = strchr(line, '='); ++ char * rquotes = strrchr(line, '"'); ++ ++ if (rquotes != NULL) { ++ *rquotes = '\0'; ++ strncpy(url, start+2, url_len); ++ } else { ++ strncpy(url, start+1, url_len); ++ } ++ url[url_len-1] = '\0'; ++ fclose(file); ++ return url; ++ } ++ } ++ fclose(file); ++ return url; ++} ++ ++ + /* Log an error message, then exit... */ + + void log_fatal (const char * fmt, ... ) +@@ -74,11 +109,13 @@ void log_fatal (const char * fmt, ... ) + } + + log_error ("%s", ""); +- log_error ("If you think you have received this message due to a bug rather"); +- log_error ("than a configuration issue please read the section on submitting"); +- log_error ("bugs on either our web page at www.isc.org or in the README file"); +- log_error ("before submitting a bug. These pages explain the proper"); +- log_error ("process and the information we find helpful for debugging."); ++ log_error ("This version of ISC DHCP is based on the release available"); ++ log_error ("on ftp.isc.org. Features have been added and other changes"); ++ log_error ("have been made to the base software release in order to make"); ++ log_error ("it work better with this distribution."); ++ log_error ("%s", ""); ++ log_error ("Please report issues with this software via: "); ++ log_error ("%s", bug_report_url()); + log_error ("%s", ""); + log_error ("exiting."); + +-- +2.14.5 + diff --git a/dhcp-dhclient-options.patch b/0002-additional-dhclient-options.patch similarity index 85% rename from dhcp-dhclient-options.patch rename to 0002-additional-dhclient-options.patch index 806ac636e8c95f5d8d7bf412bbd58653f64496fa..d700c004cce1b360c0c8490b85955151f6f76618 100644 --- a/dhcp-dhclient-options.patch +++ b/0002-additional-dhclient-options.patch @@ -1,5 +1,20 @@ +From a26161b0fd45cdbeed3038ac63ff04e3b727248f Mon Sep 17 00:00:00 2001 +From: Pavel Zhukov +Date: Thu, 21 Feb 2019 10:19:47 +0100 +Subject: [PATCH 02/26] additional dhclient options +Cc: pzhukov@redhat.com + +--- + client/clparse.c | 10 +- + client/dhclient.8 | 27 ++++++ + client/dhclient.c | 271 +++++++++++++++++++++++++++++++++++++++++++++++++++- + common/conflex.c | 2 + + includes/dhcpd.h | 3 + + includes/dhctoken.h | 1 + + 6 files changed, 308 insertions(+), 6 deletions(-) + diff --git a/client/clparse.c b/client/clparse.c -index 03190c3..2033427 100644 +index eaf48a8..7212e3a 100644 --- a/client/clparse.c +++ b/client/clparse.c @@ -189,6 +189,7 @@ isc_result_t read_client_conf () @@ -34,7 +49,7 @@ index 03190c3..2033427 100644 default: lose = 0; diff --git a/client/dhclient.8 b/client/dhclient.8 -index 24f8f12..aa2238d 100644 +index ebc750f..6d7fbdb 100644 --- a/client/dhclient.8 +++ b/client/dhclient.8 @@ -134,6 +134,33 @@ dhclient - Dynamic Host Configuration Protocol Client @@ -72,12 +87,12 @@ index 24f8f12..aa2238d 100644 .I seconds ] diff --git a/client/dhclient.c b/client/dhclient.c -index dcf3f1a..270a960 100644 +index 825ab00..26a333c 100644 --- a/client/dhclient.c +++ b/client/dhclient.c -@@ -40,6 +40,12 @@ - #include - #include +@@ -41,6 +41,12 @@ + #include + #include +/* + * Defined in stdio.h when _GNU_SOURCE is set, but we don't want to define @@ -88,7 +103,7 @@ index dcf3f1a..270a960 100644 TIME default_lease_time = 43200; /* 12 hours... */ TIME max_lease_time = 86400; /* 24 hours... */ -@@ -101,6 +107,10 @@ char *mockup_relay = NULL; +@@ -110,6 +116,10 @@ char *mockup_relay = NULL; char *progname = NULL; @@ -99,25 +114,27 @@ index dcf3f1a..270a960 100644 void run_stateless(int exit_mode, u_int16_t port); static isc_result_t write_duid(struct data_string *duid); -@@ -179,7 +189,11 @@ usage(const char *sfmt, const char *sarg) - " [-s server-addr] [-cf config-file]\n" - " [-df duid-file] [-lf lease-file]\n" - " [-pf pid-file] [--no-pid] [-e VAR=val]\n" -- " [-sf script-file] [interface]*", -+ " [-sf script-file] [interface]*\n" -+ " [-C ] [-B]\n" -+ " [-H | -F ] [--timeout ]\n" -+ " [-V ]\n" -+ " [--request-options ]", - isc_file_basename(progname)); - } +@@ -183,8 +193,12 @@ static const char use_v6command[] = "Command not used for DHCPv4: %s"; + " [-s server-addr] [-cf config-file]\n" \ + " [-df duid-file] [-lf lease-file]\n" \ + " [-pf pid-file] [--no-pid] [-e VAR=val]\n" \ +-" [-sf script-file] [interface]*" +- ++" [-sf script-file] [interface]*\n" \ ++" [-C ] [-B]\n" \ ++" [-H | -F ] [--timeout ]\n" \ ++" [-V ]\n" \ ++" [--request-options ]" ++ + #define DHCLIENT_USAGEH "{--version|--help|-h}" -@@ -216,6 +230,16 @@ main(int argc, char **argv) { + static void +@@ -243,6 +257,16 @@ main(int argc, char **argv) { + #else progname = argv[0]; #endif - -+ char *dhcp_client_identifier_arg = NULL; -+ char *dhcp_host_name_arg = NULL; ++ char *dhcp_client_identifier_arg = NULL; ++ char *dhcp_host_name_arg = NULL; + char *dhcp_fqdn_arg = NULL; + char *dhcp_vendor_class_identifier_arg = NULL; + char *dhclient_request_options = NULL; @@ -129,10 +146,10 @@ index dcf3f1a..270a960 100644 /* Initialize client globals. */ memset(&default_duid, 0, sizeof(default_duid)); -@@ -442,6 +466,88 @@ main(int argc, char **argv) { - strlen(PACKAGE_VERSION))); - IGNORE_RET(write(STDERR_FILENO, "\n", 1)); - exit(0); +@@ -558,6 +582,89 @@ main(int argc, char **argv) { + std_dhcid = 1; + } else if (!strcmp(argv[i], "-v")) { + quiet = 0; + } else if (!strcmp(argv[i], "-C")) { + if ((++i == argc) || (argv[i] == NULL) || (*(argv[i])=='\0')) { + usage(use_noarg, argv[i-1]); @@ -215,10 +232,11 @@ index dcf3f1a..270a960 100644 + } + + dhclient_request_options = argv[i]; ++ } else if (argv[i][0] == '-') { usage("Unknown command: %s", argv[i]); } else if (interfaces_requested < 0) { -@@ -641,6 +747,156 @@ main(int argc, char **argv) { +@@ -754,6 +861,156 @@ main(int argc, char **argv) { /* Parse the dhclient.conf file. */ read_client_conf(); @@ -375,7 +393,7 @@ index dcf3f1a..270a960 100644 /* Parse the lease database. */ read_client_leases(); -@@ -3092,7 +3348,8 @@ void make_discover (client, lease) +@@ -3226,7 +3483,8 @@ void make_discover (client, lease) client -> packet.xid = random (); client -> packet.secs = 0; /* filled in by send_discover. */ @@ -385,7 +403,7 @@ index dcf3f1a..270a960 100644 client -> packet.flags = 0; else client -> packet.flags = htons (BOOTP_BROADCAST); -@@ -3177,7 +3434,9 @@ void make_request (client, lease) +@@ -3311,7 +3569,9 @@ void make_request (client, lease) } else { memset (&client -> packet.ciaddr, 0, sizeof client -> packet.ciaddr); @@ -396,7 +414,7 @@ index dcf3f1a..270a960 100644 client -> packet.flags = 0; else client -> packet.flags = htons (BOOTP_BROADCAST); -@@ -3240,7 +3499,8 @@ void make_decline (client, lease) +@@ -3374,7 +3634,8 @@ void make_decline (client, lease) client -> packet.hops = 0; client -> packet.xid = client -> xid; client -> packet.secs = 0; /* Filled in by send_request. */ @@ -407,7 +425,7 @@ index dcf3f1a..270a960 100644 else client -> packet.flags = htons (BOOTP_BROADCAST); diff --git a/common/conflex.c b/common/conflex.c -index fe994ac..bdb4a52 100644 +index 045b655..71c0bf5 100644 --- a/common/conflex.c +++ b/common/conflex.c @@ -832,6 +832,8 @@ intern(char *atom, enum dhcp_token dfv) { @@ -420,10 +438,10 @@ index fe994ac..bdb4a52 100644 case 'c': if (!strcasecmp(atom + 1, "ase")) diff --git a/includes/dhcpd.h b/includes/dhcpd.h -index eab09a6..cfdac23 100644 +index 5930e6a..018fa34 100644 --- a/includes/dhcpd.h +++ b/includes/dhcpd.h -@@ -1251,6 +1251,9 @@ struct client_config { +@@ -1269,6 +1269,9 @@ struct client_config { int lease_id_format; /* format for IDs in lease file, TOKEN_OCTAL or TOKEN_HEX */ @@ -434,16 +452,17 @@ index eab09a6..cfdac23 100644 /* Per-interface state used in the dhcp client... */ diff --git a/includes/dhctoken.h b/includes/dhctoken.h -index 15bbd1c..b312e7a 100644 +index 5920f4f..7e7215a 100644 --- a/includes/dhctoken.h +++ b/includes/dhctoken.h -@@ -373,7 +373,8 @@ enum dhcp_token { - TOKEN_BIG_ENDIAN = 675, - LEASE_ID_FORMAT = 676, +@@ -377,6 +377,7 @@ enum dhcp_token { TOKEN_HEX = 677, -- TOKEN_OCTAL = 678 -+ TOKEN_OCTAL = 678, -+ BOOTP_BROADCAST_ALWAYS = 679 + TOKEN_OCTAL = 678, + KEY_ALGORITHM = 679 ++ BOOTP_BROADCAST_ALWAYS = 680 }; #define is_identifier(x) ((x) >= FIRST_TOKEN && \ +-- +2.14.5 + diff --git a/dhcp-release-by-ifup.patch b/0003-Handle-releasing-interfaces-requested-by-sbin-ifup.patch similarity index 80% rename from dhcp-release-by-ifup.patch rename to 0003-Handle-releasing-interfaces-requested-by-sbin-ifup.patch index 677eb5c752f0713bac56e01e83f972d911e5e2a1..2953c0fbcb19db7199af35c6e0f4a3042e12b9d7 100644 --- a/dhcp-release-by-ifup.patch +++ b/0003-Handle-releasing-interfaces-requested-by-sbin-ifup.patch @@ -1,7 +1,18 @@ -diff -up dhcp-4.3.0a1/client/dhclient.c.ifup dhcp-4.3.0a1/client/dhclient.c ---- dhcp-4.3.0a1/client/dhclient.c.ifup 2013-12-19 14:53:08.817760677 +0100 -+++ dhcp-4.3.0a1/client/dhclient.c 2013-12-19 15:05:16.290518574 +0100 -@@ -521,9 +521,81 @@ main(int argc, char **argv) { +From af504e99abde04b881768d18eaa0054b36b16303 Mon Sep 17 00:00:00 2001 +From: Pavel Zhukov +Date: Thu, 21 Feb 2019 10:21:14 +0100 +Subject: [PATCH 03/26] Handle releasing interfaces requested by /sbin/ifup +Cc: pzhukov@redhat.com + +--- + client/dhclient.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 72 insertions(+) + +diff --git a/client/dhclient.c b/client/dhclient.c +index 26a333c..2a2e9e6 100644 +--- a/client/dhclient.c ++++ b/client/dhclient.c +@@ -787,9 +787,81 @@ main(int argc, char **argv) { } } fclose(pidfd); @@ -83,3 +94,6 @@ diff -up dhcp-4.3.0a1/client/dhclient.c.ifup dhcp-4.3.0a1/client/dhclient.c if (!quiet) { log_info("%s %s", message, PACKAGE_VERSION); log_info(copyright); +-- +2.14.5 + diff --git a/dhcp-unicast-bootp.patch b/0004-Support-unicast-BOOTP-for-IBM-pSeries-systems-and-ma.patch similarity index 75% rename from dhcp-unicast-bootp.patch rename to 0004-Support-unicast-BOOTP-for-IBM-pSeries-systems-and-ma.patch index abf89f2377d9dee1098b2f2c9a83290ab1e280f6..7f414a30f9f4c66120690045f3b612f73cf32b65 100644 --- a/dhcp-unicast-bootp.patch +++ b/0004-Support-unicast-BOOTP-for-IBM-pSeries-systems-and-ma.patch @@ -1,6 +1,19 @@ -diff -up dhcp-4.3.4/server/bootp.c.unicast dhcp-4.3.4/server/bootp.c ---- dhcp-4.3.4/server/bootp.c.unicast 2016-03-22 14:16:51.000000000 +0100 -+++ dhcp-4.3.4/server/bootp.c 2016-05-02 15:09:40.023243008 +0200 +From 7e8cc8388ac31c5c2b1a423c6b2da0491b19f6f9 Mon Sep 17 00:00:00 2001 +From: Pavel Zhukov +Date: Thu, 21 Feb 2019 10:22:41 +0100 +Subject: [PATCH 04/26] Support unicast BOOTP for IBM pSeries systems (and + maybe others) +Cc: pzhukov@redhat.com + +--- + server/bootp.c | 12 +++++++++++- + server/dhcp.c | 33 ++++++++++++++++++++++++++------- + 2 files changed, 37 insertions(+), 8 deletions(-) + +diff --git a/server/bootp.c b/server/bootp.c +index 26a7607..2212f31 100644 +--- a/server/bootp.c ++++ b/server/bootp.c @@ -52,6 +52,7 @@ void bootp (packet) char msgbuf [1024]; int ignorep; @@ -34,10 +47,11 @@ diff -up dhcp-4.3.4/server/bootp.c.unicast dhcp-4.3.4/server/bootp.c /* If it comes from a client that already knows its address and is not requesting a broadcast response, and we can -diff -up dhcp-4.3.4/server/dhcp.c.unicast dhcp-4.3.4/server/dhcp.c ---- dhcp-4.3.4/server/dhcp.c.unicast 2016-03-22 14:16:51.000000000 +0100 -+++ dhcp-4.3.4/server/dhcp.c 2016-05-02 15:10:13.255267511 +0200 -@@ -5132,6 +5132,7 @@ int locate_network (packet) +diff --git a/server/dhcp.c b/server/dhcp.c +index 6f3a91f..20f2a62 100644 +--- a/server/dhcp.c ++++ b/server/dhcp.c +@@ -5224,6 +5224,7 @@ int locate_network (packet) struct data_string data; struct subnet *subnet = (struct subnet *)0; struct option_cache *oc; @@ -45,7 +59,7 @@ diff -up dhcp-4.3.4/server/dhcp.c.unicast dhcp-4.3.4/server/dhcp.c #if defined(DHCPv6) && defined(DHCP4o6) if (dhcpv4_over_dhcpv6 && (packet->dhcp4o6_response != NULL)) { -@@ -5153,12 +5154,24 @@ int locate_network (packet) +@@ -5245,12 +5246,24 @@ int locate_network (packet) from the interface, if there is one. If not, fail. */ if (!oc && !packet -> raw -> giaddr.s_addr) { if (packet -> interface -> shared_network) { @@ -75,7 +89,7 @@ diff -up dhcp-4.3.4/server/dhcp.c.unicast dhcp-4.3.4/server/dhcp.c } /* If there's an option indicating link connection, and it's valid, -@@ -5185,7 +5198,10 @@ int locate_network (packet) +@@ -5277,7 +5290,10 @@ int locate_network (packet) data_string_forget (&data, MDL); } else { ia.len = 4; @@ -87,7 +101,7 @@ diff -up dhcp-4.3.4/server/dhcp.c.unicast dhcp-4.3.4/server/dhcp.c } /* If we know the subnet on which the IP address lives, use it. */ -@@ -5193,7 +5209,10 @@ int locate_network (packet) +@@ -5285,7 +5301,10 @@ int locate_network (packet) shared_network_reference (&packet -> shared_network, subnet -> shared_network, MDL); subnet_dereference (&subnet, MDL); @@ -99,3 +113,6 @@ diff -up dhcp-4.3.4/server/dhcp.c.unicast dhcp-4.3.4/server/dhcp.c } /* Otherwise, fail. */ +-- +2.14.5 + diff --git a/dhcp-default-requested-options.patch b/0005-Change-default-requested-options.patch similarity index 69% rename from dhcp-default-requested-options.patch rename to 0005-Change-default-requested-options.patch index f57fa1fbdf6c21fc1ca1c4671aaa231cc30a7cb7..34ff7b50d377ac0c5c990e70c6ef8ba80f1aa805 100644 --- a/dhcp-default-requested-options.patch +++ b/0005-Change-default-requested-options.patch @@ -1,6 +1,19 @@ -diff -up dhcp-4.3.4/client/clparse.c.requested dhcp-4.3.4/client/clparse.c ---- dhcp-4.3.4/client/clparse.c.requested 2016-04-29 12:18:50.157151352 +0200 -+++ dhcp-4.3.4/client/clparse.c 2016-04-29 12:19:22.235137243 +0200 +From a2a3554ff9e05d1a8e2c8aa843f1b6a33fce87e3 Mon Sep 17 00:00:00 2001 +From: Pavel Zhukov +Date: Thu, 21 Feb 2019 10:24:24 +0100 +Subject: [PATCH 05/26] Change default requested options +Cc: pzhukov@redhat.com + +Add NIS domain, NIS servers, NTP servers, interface-mtu and domain-search +to the list of default requested DHCP options +--- + client/clparse.c | 27 ++++++++++++++++++++++++++- + 1 file changed, 26 insertions(+), 1 deletion(-) + +diff --git a/client/clparse.c b/client/clparse.c +index 7212e3a..39b95a0 100644 +--- a/client/clparse.c ++++ b/client/clparse.c @@ -31,7 +31,7 @@ struct client_config top_level_config; @@ -42,3 +55,6 @@ diff -up dhcp-4.3.4/client/clparse.c.requested dhcp-4.3.4/client/clparse.c for (code = 0 ; code < NUM_DEFAULT_REQUESTED_OPTS ; code++) { if (default_requested_options[code] == NULL) log_fatal("Unable to find option definition for " +-- +2.14.5 + diff --git a/0006-Various-man-page-only-fixes.patch b/0006-Various-man-page-only-fixes.patch new file mode 100644 index 0000000000000000000000000000000000000000..a98783c432bae8b31955182478b72b7b99d4f6ce --- /dev/null +++ b/0006-Various-man-page-only-fixes.patch @@ -0,0 +1,168 @@ +From 846779467f7393b19e8d206405116e1e26e16efc Mon Sep 17 00:00:00 2001 +From: Pavel Zhukov +Date: Thu, 21 Feb 2019 10:25:53 +0100 +Subject: [PATCH 06/26] Various man-page-only fixes +Cc: pzhukov@redhat.com + +--- + client/dhclient-script.8 | 22 +++++++++++++++++++++- + client/dhclient.conf.5 | 14 +++++++++++++- + common/dhcp-options.5 | 15 +++++++++++++++ + server/dhcpd.conf.5 | 14 +++++++++----- + 4 files changed, 58 insertions(+), 7 deletions(-) + +diff --git a/client/dhclient-script.8 b/client/dhclient-script.8 +index 3553afd..0db5516 100644 +--- a/client/dhclient-script.8 ++++ b/client/dhclient-script.8 +@@ -43,7 +43,7 @@ customizations are needed, they should be possible using the enter and + exit hooks provided (see HOOKS for details). These hooks will allow the + user to override the default behaviour of the client in creating a + .B /etc/resolv.conf +-file. ++file, and to handle DHCP options not handled by default. + .PP + No standard client script exists for some operating systems, even though + the actual client may work, so a pioneering user may well need to create +@@ -87,6 +87,26 @@ present. The + .B ETCDIR/dhclient-exit-hooks + script can modify the valid of exit_status to change the exit status + of dhclient-script. ++.PP ++Immediately after dhclient brings an interface UP with a new IP address, ++subnet mask, and routes, in the REBOOT/BOUND states, it will check for the ++existence of an executable ++.B ETCDIR/dhclient-up-hooks ++script, and source it if found. This script can handle DHCP options in ++the environment that are not handled by default. A per-interface. ++.B ETCDIR/dhclient-${IF}-up-hooks ++script will override the generic script and be sourced when interface ++$IF has been brought up. ++.PP ++Immediately before dhclient brings an interface DOWN, removing its IP ++address, subnet mask, and routes, in the STOP/RELEASE states, it will ++check for the existence of an executable ++.B ETCDIR/dhclient-down-hooks ++script, and source it if found. This script can handle DHCP options in ++the environment that are not handled by default. A per-interface ++.B ETCDIR/dhclient-${IF}-down-hooks ++script will override the generic script and be sourced when interface ++$IF is about to be brought down. + .SH OPERATION + When dhclient needs to invoke the client configuration script, it + defines a set of variables in the environment, and then invokes +diff --git a/client/dhclient.conf.5 b/client/dhclient.conf.5 +index fa3b908..566a881 100644 +--- a/client/dhclient.conf.5 ++++ b/client/dhclient.conf.5 +@@ -228,7 +228,8 @@ responding to the client send the client its values for the specified + options. Only the option names should be specified in the request + statement - not option parameters. By default, the DHCPv4 client + requests the subnet-mask, broadcast-address, time-offset, routers, +-domain-name, domain-name-servers and host-name options while the DHCPv6 ++domain-search, domain-name, domain-name-servers, host-name, nis-domain, ++nis-servers, ntp-servers and interface-mtu options while the DHCPv6 + client requests the dhcp6 name-servers and domain-search options. Note + that if you enter a \'request\' statement, you over-ride these defaults + and these options will not be requested. +@@ -735,6 +736,17 @@ broadcast packets transmitted by DHCP clients, but is only useful if you + know the DHCP service(s) anycast MAC address prior to configuring your + client. The \fIlink-type\fR and \fImac-address\fR parameters are configured + in a similar manner to the \fBhardware\fR statement. ++.PP ++ \fBbootp-broadcast-always;\fR ++.PP ++The ++.B bootp-broadcast-always ++statement instructs dhclient to always set the bootp broadcast flag in ++request packets, so that servers will always broadcast replies. ++This is equivalent to supplying the dhclient -B argument, and has ++the same effect as specifying 'always-broadcast' in the server's dhcpd.conf. ++This option is provided as an extension to enable dhclient to work ++on IBM s390 Linux guests. + .PP + .SH SAMPLE + The following configuration file was used on a laptop running NetBSD +diff --git a/common/dhcp-options.5 b/common/dhcp-options.5 +index 33d4804..d9e1197 100644 +--- a/common/dhcp-options.5 ++++ b/common/dhcp-options.5 +@@ -1068,6 +1068,21 @@ classless IP routing - it does not include a subnet mask. Since + classless IP routing is now the most widely deployed routing standard, + this option is virtually useless, and is not implemented by any of the + popular DHCP clients, for example the Microsoft DHCP client. ++.PP ++NOTE to Fedora dhclient users: ++.br ++dhclient-script interprets trailing 0 octets of the target as indicating ++the subnet class of the route, so for the following static-routes value: ++.br ++ option static-routes 172.0.0.0 172.16.2.254, ++.br ++ 192.168.0.0 192.168.2.254; ++.br ++dhclient-script will create routes: ++.br ++ 172/8 via 172.16.2.254 dev $interface ++.br ++ 192.168/16 via 192.168.2.254 dev $interface + .RE + .PP + .nf +diff --git a/server/dhcpd.conf.5 b/server/dhcpd.conf.5 +index 17330d4..89b5540 100644 +--- a/server/dhcpd.conf.5 ++++ b/server/dhcpd.conf.5 +@@ -527,6 +527,9 @@ pool { + }; + .fi + .PP ++Dynamic BOOTP leases are not compatible with failover, and, as such, ++you need to disallow BOOTP in pools that you are using failover for. ++.PP + The server currently does very little sanity checking, so if you + configure it wrong, it will just fail in odd ways. I would recommend + therefore that you either do failover or don't do failover, but don't +@@ -541,9 +544,9 @@ primary server might look like this: + failover peer "foo" { + primary; + address anthrax.rc.example.com; +- port 519; ++ port 647; + peer address trantor.rc.example.com; +- peer port 520; ++ peer port 847; + max-response-delay 60; + max-unacked-updates 10; + mclt 3600; +@@ -1323,7 +1326,7 @@ the zone containing PTR records - for ISC BIND, something like this: + .PP + .nf + key DHCP_UPDATER { +- algorithm HMAC-MD5.SIG-ALG.REG.INT; ++ algorithm hmac-md5; + secret pRP5FapFoJ95JEL06sv4PQ==; + }; + +@@ -1346,7 +1349,7 @@ dhcpd.conf file: + .PP + .nf + key DHCP_UPDATER { +- algorithm HMAC-MD5.SIG-ALG.REG.INT; ++ algorithm hmac-md5; + secret pRP5FapFoJ95JEL06sv4PQ==; + }; + +@@ -2912,7 +2915,8 @@ statement + The \fInext-server\fR statement is used to specify the host address of + the server from which the initial boot file (specified in the + \fIfilename\fR statement) is to be loaded. \fIServer-name\fR should +-be a numeric IP address or a domain name. ++be a numeric IP address or a domain name. If no \fInext-server\fR statement ++applies to a given client, the address 0.0.0.0 is used. + .RE + .PP + The +-- +2.14.5 + diff --git a/dhcp-paths.patch b/0007-Change-paths-to-conform-to-our-standards.patch similarity index 46% rename from dhcp-paths.patch rename to 0007-Change-paths-to-conform-to-our-standards.patch index 59a711dad7ee4464e026839ed746d0f8fe943639..87c4f8cd40e4c0ffa43761b9e583947f5149da9a 100644 --- a/dhcp-paths.patch +++ b/0007-Change-paths-to-conform-to-our-standards.patch @@ -1,7 +1,19 @@ -diff -up dhcp-4.3.0a1/doc/examples/dhcpd-dhcpv6.conf.paths dhcp-4.3.0a1/doc/examples/dhcpd-dhcpv6.conf ---- dhcp-4.3.0a1/doc/examples/dhcpd-dhcpv6.conf.paths 2013-11-07 20:15:08.000000000 +0100 -+++ dhcp-4.3.0a1/doc/examples/dhcpd-dhcpv6.conf 2013-12-19 15:34:16.262247711 +0100 -@@ -42,7 +42,7 @@ option dhcp6.domain-search "test.example +From ac65289663532db0bc1de449ca2a0eb4c8c2ca6f Mon Sep 17 00:00:00 2001 +From: Pavel Zhukov +Date: Thu, 21 Feb 2019 10:26:34 +0100 +Subject: [PATCH 07/26] Change paths to conform to our standards +Cc: pzhukov@redhat.com + +--- + doc/examples/dhcpd-dhcpv6.conf | 2 +- + includes/dhcpd.h | 6 +++--- + 2 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/doc/examples/dhcpd-dhcpv6.conf b/doc/examples/dhcpd-dhcpv6.conf +index 448a6a6..2357824 100644 +--- a/doc/examples/dhcpd-dhcpv6.conf ++++ b/doc/examples/dhcpd-dhcpv6.conf +@@ -43,7 +43,7 @@ option dhcp6.domain-search "test.example.com","example.com"; option dhcp6.info-refresh-time 21600; # The path of the lease file @@ -10,10 +22,11 @@ diff -up dhcp-4.3.0a1/doc/examples/dhcpd-dhcpv6.conf.paths dhcp-4.3.0a1/doc/exam # Static definition (must be global) host myclient { -diff -up dhcp-4.3.0a1/includes/dhcpd.h.paths dhcp-4.3.0a1/includes/dhcpd.h ---- dhcp-4.3.0a1/includes/dhcpd.h.paths 2013-12-19 15:34:16.253247840 +0100 -+++ dhcp-4.3.0a1/includes/dhcpd.h 2013-12-19 15:34:16.263247697 +0100 -@@ -1429,7 +1429,7 @@ typedef unsigned char option_mask [16]; +diff --git a/includes/dhcpd.h b/includes/dhcpd.h +index 018fa34..3632a6b 100644 +--- a/includes/dhcpd.h ++++ b/includes/dhcpd.h +@@ -1545,7 +1545,7 @@ typedef unsigned char option_mask [16]; #else /* !DEBUG */ #ifndef _PATH_DHCPD_CONF @@ -22,7 +35,7 @@ diff -up dhcp-4.3.0a1/includes/dhcpd.h.paths dhcp-4.3.0a1/includes/dhcpd.h #endif /* DEBUG */ #ifndef _PATH_DHCPD_DB -@@ -1451,11 +1451,11 @@ typedef unsigned char option_mask [16]; +@@ -1567,11 +1567,11 @@ typedef unsigned char option_mask [16]; #endif /* DEBUG */ #ifndef _PATH_DHCLIENT_CONF @@ -36,3 +49,6 @@ diff -up dhcp-4.3.0a1/includes/dhcpd.h.paths dhcp-4.3.0a1/includes/dhcpd.h #endif #ifndef _PATH_DHCLIENT_PID +-- +2.14.5 + diff --git a/dhcp-CLOEXEC.patch b/0008-Make-sure-all-open-file-descriptors-are-closed-on-ex.patch similarity index 67% rename from dhcp-CLOEXEC.patch rename to 0008-Make-sure-all-open-file-descriptors-are-closed-on-ex.patch index 309a87c1eb9acf1d81dc91b259d046cbafc2ca7c..829456360d8ba5e17bf878005838fca8872ce2ae 100644 --- a/dhcp-CLOEXEC.patch +++ b/0008-Make-sure-all-open-file-descriptors-are-closed-on-ex.patch @@ -1,7 +1,32 @@ -diff -up dhcp-4.3.3b1/client/clparse.c.cloexec dhcp-4.3.3b1/client/clparse.c ---- dhcp-4.3.3b1/client/clparse.c.cloexec 2015-08-10 10:46:20.264755543 +0200 -+++ dhcp-4.3.3b1/client/clparse.c 2015-08-10 10:46:20.274755510 +0200 -@@ -247,7 +247,7 @@ int read_client_conf_file (const char *n +From d2da34706f140101c34f6a9806c258411806a939 Mon Sep 17 00:00:00 2001 +From: Pavel Zhukov +Date: Thu, 21 Feb 2019 10:27:18 +0100 +Subject: [PATCH 08/26] Make sure all open file descriptors are closed-on-exec + for SELinux +Cc: pzhukov@redhat.com + +ISC-bug: #19148 +--- + client/clparse.c | 4 ++-- + client/dhclient.c | 28 ++++++++++++++-------------- + common/bpf.c | 2 +- + common/dlpi.c | 2 +- + common/nit.c | 2 +- + common/resolv.c | 2 +- + common/upf.c | 2 +- + omapip/trace.c | 6 +++--- + relay/dhcrelay.c | 10 +++++----- + server/confpars.c | 2 +- + server/db.c | 4 ++-- + server/dhcpd.c | 14 +++++++------- + server/ldap.c | 2 +- + 13 files changed, 40 insertions(+), 40 deletions(-) + +diff --git a/client/clparse.c b/client/clparse.c +index 39b95a0..44387ed 100644 +--- a/client/clparse.c ++++ b/client/clparse.c +@@ -288,7 +288,7 @@ int read_client_conf_file (const char *name, struct interface_info *ip, int token; isc_result_t status; @@ -10,7 +35,7 @@ diff -up dhcp-4.3.3b1/client/clparse.c.cloexec dhcp-4.3.3b1/client/clparse.c return uerr2isc (errno); cfile = NULL; -@@ -323,7 +323,7 @@ void read_client_leases () +@@ -364,7 +364,7 @@ void read_client_leases () /* Open the lease file. If we can't open it, just return - we can safely trust the server to remember our state. */ @@ -19,10 +44,11 @@ diff -up dhcp-4.3.3b1/client/clparse.c.cloexec dhcp-4.3.3b1/client/clparse.c return; cfile = NULL; -diff -up dhcp-4.3.3b1/client/dhclient.c.cloexec dhcp-4.3.3b1/client/dhclient.c ---- dhcp-4.3.3b1/client/dhclient.c.cloexec 2015-08-10 10:46:20.260755556 +0200 -+++ dhcp-4.3.3b1/client/dhclient.c 2015-08-10 10:46:20.275755506 +0200 -@@ -153,11 +153,11 @@ main(int argc, char **argv) { +diff --git a/client/dhclient.c b/client/dhclient.c +index 2a2e9e6..a86ab9e 100644 +--- a/client/dhclient.c ++++ b/client/dhclient.c +@@ -273,11 +273,11 @@ main(int argc, char **argv) { /* 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. */ @@ -37,7 +63,7 @@ diff -up dhcp-4.3.3b1/client/dhclient.c.cloexec dhcp-4.3.3b1/client/dhclient.c if (fd == 2) log_perror = 0; /* No sense logging to /dev/null. */ else if (fd != -1) -@@ -519,7 +519,7 @@ main(int argc, char **argv) { +@@ -765,7 +765,7 @@ main(int argc, char **argv) { long temp; int e; @@ -46,7 +72,7 @@ diff -up dhcp-4.3.3b1/client/dhclient.c.cloexec dhcp-4.3.3b1/client/dhclient.c e = fscanf(pidfd, "%ld\n", &temp); oldpid = (pid_t)temp; -@@ -574,7 +574,7 @@ main(int argc, char **argv) { +@@ -820,7 +820,7 @@ main(int argc, char **argv) { strncpy(new_path_dhclient_pid, path_dhclient_pid, pfx); sprintf(new_path_dhclient_pid + pfx, "-%s.pid", ip->name); @@ -55,7 +81,7 @@ diff -up dhcp-4.3.3b1/client/dhclient.c.cloexec dhcp-4.3.3b1/client/dhclient.c e = fscanf(pidfd, "%ld\n", &temp); oldpid = (pid_t)temp; -@@ -599,7 +599,7 @@ main(int argc, char **argv) { +@@ -845,7 +845,7 @@ main(int argc, char **argv) { int dhc_running = 0; char procfn[256] = ""; @@ -64,7 +90,7 @@ diff -up dhcp-4.3.3b1/client/dhclient.c.cloexec dhcp-4.3.3b1/client/dhclient.c if ((fscanf(pidfp, "%ld", &temp)==1) && ((dhcpid=(pid_t)temp) > 0)) { snprintf(procfn,256,"/proc/%u",dhcpid); dhc_running = (access(procfn, F_OK) == 0); -@@ -3120,7 +3120,7 @@ void rewrite_client_leases () +@@ -3808,7 +3808,7 @@ void rewrite_client_leases () if (leaseFile != NULL) fclose (leaseFile); @@ -73,7 +99,7 @@ diff -up dhcp-4.3.3b1/client/dhclient.c.cloexec dhcp-4.3.3b1/client/dhclient.c if (leaseFile == NULL) { log_error ("can't create %s: %m", path_dhclient_db); return; -@@ -3313,7 +3313,7 @@ write_duid(struct data_string *duid) +@@ -4003,7 +4003,7 @@ write_duid(struct data_string *duid) return DHCP_R_INVALIDARG; if (leaseFile == NULL) { /* XXX? */ @@ -82,7 +108,7 @@ diff -up dhcp-4.3.3b1/client/dhclient.c.cloexec dhcp-4.3.3b1/client/dhclient.c if (leaseFile == NULL) { log_error("can't create %s: %m", path_dhclient_db); return ISC_R_IOERROR; -@@ -3493,7 +3493,7 @@ int write_client_lease (client, lease, r +@@ -4207,7 +4207,7 @@ int write_client_lease (client, lease, rewrite, makesure) return 1; if (leaseFile == NULL) { /* XXX */ @@ -91,7 +117,7 @@ diff -up dhcp-4.3.3b1/client/dhclient.c.cloexec dhcp-4.3.3b1/client/dhclient.c if (leaseFile == NULL) { log_error ("can't create %s: %m", path_dhclient_db); return 0; -@@ -4011,9 +4011,9 @@ void go_daemon () +@@ -4786,9 +4786,9 @@ void detach () (void) close(2); /* Reopen them on /dev/null. */ @@ -104,7 +130,7 @@ diff -up dhcp-4.3.3b1/client/dhclient.c.cloexec dhcp-4.3.3b1/client/dhclient.c write_client_pid_file (); -@@ -4030,14 +4030,14 @@ void write_client_pid_file () +@@ -4806,14 +4806,14 @@ void write_client_pid_file () return; } @@ -121,10 +147,11 @@ diff -up dhcp-4.3.3b1/client/dhclient.c.cloexec dhcp-4.3.3b1/client/dhclient.c if (!pf) { close(pfdesc); log_error ("Can't fdopen %s: %m", path_dhclient_pid); -diff -up dhcp-4.3.3b1/common/bpf.c.cloexec dhcp-4.3.3b1/common/bpf.c ---- dhcp-4.3.3b1/common/bpf.c.cloexec 2015-07-30 15:17:16.000000000 +0200 -+++ dhcp-4.3.3b1/common/bpf.c 2015-08-10 10:46:20.275755506 +0200 -@@ -95,7 +95,7 @@ int if_register_bpf (info) +diff --git a/common/bpf.c b/common/bpf.c +index 16076fe..67b6d64 100644 +--- a/common/bpf.c ++++ b/common/bpf.c +@@ -94,7 +94,7 @@ int if_register_bpf (info) for (b = 0; 1; b++) { /* %Audit% 31 bytes max. %2004.06.17,Safe% */ sprintf(filename, BPF_FORMAT, b); @@ -133,10 +160,11 @@ diff -up dhcp-4.3.3b1/common/bpf.c.cloexec dhcp-4.3.3b1/common/bpf.c if (sock < 0) { if (errno == EBUSY) { continue; -diff -up dhcp-4.3.3b1/common/dlpi.c.cloexec dhcp-4.3.3b1/common/dlpi.c ---- dhcp-4.3.3b1/common/dlpi.c.cloexec 2015-07-30 15:17:16.000000000 +0200 -+++ dhcp-4.3.3b1/common/dlpi.c 2015-08-10 10:46:20.275755506 +0200 -@@ -804,7 +804,7 @@ dlpiopen(const char *ifname) { +diff --git a/common/dlpi.c b/common/dlpi.c +index 3990bf1..a941258 100644 +--- a/common/dlpi.c ++++ b/common/dlpi.c +@@ -817,7 +817,7 @@ dlpiopen(const char *ifname) { } *dp = '\0'; @@ -145,9 +173,10 @@ diff -up dhcp-4.3.3b1/common/dlpi.c.cloexec dhcp-4.3.3b1/common/dlpi.c } /* -diff -up dhcp-4.3.3b1/common/nit.c.cloexec dhcp-4.3.3b1/common/nit.c ---- dhcp-4.3.3b1/common/nit.c.cloexec 2015-07-30 15:17:16.000000000 +0200 -+++ dhcp-4.3.3b1/common/nit.c 2015-08-10 10:46:20.275755506 +0200 +diff --git a/common/nit.c b/common/nit.c +index d822c15..a9132bc 100644 +--- a/common/nit.c ++++ b/common/nit.c @@ -75,7 +75,7 @@ int if_register_nit (info) struct strioctl sio; @@ -157,10 +186,11 @@ diff -up dhcp-4.3.3b1/common/nit.c.cloexec dhcp-4.3.3b1/common/nit.c if (sock < 0) log_fatal ("Can't open NIT device for %s: %m", info -> name); -diff -up dhcp-4.3.3b1/common/resolv.c.cloexec dhcp-4.3.3b1/common/resolv.c ---- dhcp-4.3.3b1/common/resolv.c.cloexec 2015-07-30 15:17:16.000000000 +0200 -+++ dhcp-4.3.3b1/common/resolv.c 2015-08-10 10:46:20.276755503 +0200 -@@ -44,7 +44,7 @@ void read_resolv_conf (parse_time) +diff --git a/common/resolv.c b/common/resolv.c +index a01f520..b209e3f 100644 +--- a/common/resolv.c ++++ b/common/resolv.c +@@ -43,7 +43,7 @@ void read_resolv_conf (parse_time) struct domain_search_list *dp, *dl, *nd; isc_result_t status; @@ -169,9 +199,10 @@ diff -up dhcp-4.3.3b1/common/resolv.c.cloexec dhcp-4.3.3b1/common/resolv.c log_error ("Can't open %s: %m", path_resolv_conf); return; } -diff -up dhcp-4.3.3b1/common/upf.c.cloexec dhcp-4.3.3b1/common/upf.c ---- dhcp-4.3.3b1/common/upf.c.cloexec 2015-07-30 15:17:16.000000000 +0200 -+++ dhcp-4.3.3b1/common/upf.c 2015-08-10 10:46:20.276755503 +0200 +diff --git a/common/upf.c b/common/upf.c +index 9785879..e0a524f 100644 +--- a/common/upf.c ++++ b/common/upf.c @@ -71,7 +71,7 @@ int if_register_upf (info) /* %Audit% Cannot exceed 36 bytes. %2004.06.17,Safe% */ sprintf(filename, "/dev/pf/pfilt%d", b); @@ -181,10 +212,11 @@ diff -up dhcp-4.3.3b1/common/upf.c.cloexec dhcp-4.3.3b1/common/upf.c if (sock < 0) { if (errno == EBUSY) { continue; -diff -up dhcp-4.3.3b1/omapip/trace.c.cloexec dhcp-4.3.3b1/omapip/trace.c ---- dhcp-4.3.3b1/omapip/trace.c.cloexec 2015-07-30 15:17:16.000000000 +0200 -+++ dhcp-4.3.3b1/omapip/trace.c 2015-08-10 10:46:20.276755503 +0200 -@@ -138,10 +138,10 @@ isc_result_t trace_begin (const char *fi +diff --git a/omapip/trace.c b/omapip/trace.c +index 45bd508..5ea7486 100644 +--- a/omapip/trace.c ++++ b/omapip/trace.c +@@ -136,10 +136,10 @@ isc_result_t trace_begin (const char *filename, return DHCP_R_INVALIDARG; } @@ -197,7 +229,7 @@ diff -up dhcp-4.3.3b1/omapip/trace.c.cloexec dhcp-4.3.3b1/omapip/trace.c 0600); } -@@ -429,7 +429,7 @@ void trace_file_replay (const char *file +@@ -427,7 +427,7 @@ void trace_file_replay (const char *filename) isc_result_t result; int len; @@ -206,10 +238,11 @@ diff -up dhcp-4.3.3b1/omapip/trace.c.cloexec dhcp-4.3.3b1/omapip/trace.c if (!traceinfile) { log_error("Can't open tracefile %s: %m", filename); return; -diff -up dhcp-4.3.3b1/relay/dhcrelay.c.cloexec dhcp-4.3.3b1/relay/dhcrelay.c ---- dhcp-4.3.3b1/relay/dhcrelay.c.cloexec 2015-07-30 15:17:16.000000000 +0200 -+++ dhcp-4.3.3b1/relay/dhcrelay.c 2015-08-10 10:46:20.276755503 +0200 -@@ -187,11 +187,11 @@ main(int argc, char **argv) { +diff --git a/relay/dhcrelay.c b/relay/dhcrelay.c +index d8caaaf..ea1be18 100644 +--- a/relay/dhcrelay.c ++++ b/relay/dhcrelay.c +@@ -296,11 +296,11 @@ main(int argc, char **argv) { /* 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. */ @@ -224,8 +257,8 @@ diff -up dhcp-4.3.3b1/relay/dhcrelay.c.cloexec dhcp-4.3.3b1/relay/dhcrelay.c if (fd == 2) log_perror = 0; /* No sense logging to /dev/null. */ else if (fd != -1) -@@ -558,13 +558,13 @@ main(int argc, char **argv) { - +@@ -776,13 +776,13 @@ main(int argc, char **argv) { + /* Create the pid file. */ if (no_pid_file == ISC_FALSE) { pfdesc = open(path_dhcrelay_pid, - O_CREAT | O_TRUNC | O_WRONLY, 0644); @@ -240,10 +273,11 @@ diff -up dhcp-4.3.3b1/relay/dhcrelay.c.cloexec dhcp-4.3.3b1/relay/dhcrelay.c if (!pf) log_error("Can't fdopen %s: %m", path_dhcrelay_pid); -diff -up dhcp-4.3.3b1/server/confpars.c.cloexec dhcp-4.3.3b1/server/confpars.c ---- dhcp-4.3.3b1/server/confpars.c.cloexec 2015-07-30 15:17:16.000000000 +0200 -+++ dhcp-4.3.3b1/server/confpars.c 2015-08-10 10:46:20.277755500 +0200 -@@ -111,7 +111,7 @@ isc_result_t read_conf_file (const char +diff --git a/server/confpars.c b/server/confpars.c +index d2cedfe..2743979 100644 +--- a/server/confpars.c ++++ b/server/confpars.c +@@ -118,7 +118,7 @@ isc_result_t read_conf_file (const char *filename, struct group *group, } #endif @@ -252,19 +286,11 @@ diff -up dhcp-4.3.3b1/server/confpars.c.cloexec dhcp-4.3.3b1/server/confpars.c if (leasep) { log_error ("Can't open lease database %s: %m --", path_dhcpd_db); -diff -up dhcp-4.3.3b1/server/db.c.cloexec dhcp-4.3.3b1/server/db.c ---- dhcp-4.3.3b1/server/db.c.cloexec 2015-07-30 15:17:16.000000000 +0200 -+++ dhcp-4.3.3b1/server/db.c 2015-08-10 10:47:32.644518358 +0200 -@@ -1072,7 +1072,7 @@ void db_startup (testp) - } - #endif - if (!testp) { -- db_file = fopen (path_dhcpd_db, "a"); -+ db_file = fopen (path_dhcpd_db, "ae"); - if (!db_file) - log_fatal ("Can't open %s for append.", path_dhcpd_db); - expire_all_pools (); -@@ -1120,7 +1120,7 @@ int new_lease_file () +diff --git a/server/db.c b/server/db.c +index 67e6cc1..6181528 100644 +--- a/server/db.c ++++ b/server/db.c +@@ -1154,7 +1154,7 @@ int new_lease_file (int test_mode) path_dhcpd_db, (int)t) >= sizeof newfname) log_fatal("new_lease_file: lease file path too long"); @@ -273,7 +299,7 @@ diff -up dhcp-4.3.3b1/server/db.c.cloexec dhcp-4.3.3b1/server/db.c if (db_fd < 0) { log_error ("Can't create new lease file: %m"); return 0; -@@ -1141,7 +1141,7 @@ int new_lease_file () +@@ -1175,7 +1175,7 @@ int new_lease_file (int test_mode) } #endif /* PARANOIA */ @@ -282,10 +308,11 @@ diff -up dhcp-4.3.3b1/server/db.c.cloexec dhcp-4.3.3b1/server/db.c log_error("Can't fdopen new lease file: %m"); close(db_fd); goto fdfail; -diff -up dhcp-4.3.3b1/server/dhcpd.c.cloexec dhcp-4.3.3b1/server/dhcpd.c ---- dhcp-4.3.3b1/server/dhcpd.c.cloexec 2015-07-30 15:17:16.000000000 +0200 -+++ dhcp-4.3.3b1/server/dhcpd.c 2015-08-10 10:46:20.278755497 +0200 -@@ -194,11 +194,11 @@ main(int argc, char **argv) { +diff --git a/server/dhcpd.c b/server/dhcpd.c +index 55ffae7..530a923 100644 +--- a/server/dhcpd.c ++++ b/server/dhcpd.c +@@ -300,11 +300,11 @@ main(int argc, char **argv) { /* 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. */ @@ -300,7 +327,7 @@ diff -up dhcp-4.3.3b1/server/dhcpd.c.cloexec dhcp-4.3.3b1/server/dhcpd.c if (fd == 2) log_perror = 0; /* No sense logging to /dev/null. */ else if (fd != -1) -@@ -743,7 +743,7 @@ main(int argc, char **argv) { +@@ -975,7 +975,7 @@ main(int argc, char **argv) { * appropriate. */ if (no_pid_file == ISC_FALSE) { @@ -309,7 +336,7 @@ diff -up dhcp-4.3.3b1/server/dhcpd.c.cloexec dhcp-4.3.3b1/server/dhcpd.c if (i >= 0) { sprintf(pbuf, "%d\n", (int) getpid()); IGNORE_RET(write(i, pbuf, strlen(pbuf))); -@@ -787,9 +787,9 @@ main(int argc, char **argv) { +@@ -1028,9 +1028,9 @@ main(int argc, char **argv) { (void) close(2); /* Reopen them on /dev/null. */ @@ -322,10 +349,11 @@ diff -up dhcp-4.3.3b1/server/dhcpd.c.cloexec dhcp-4.3.3b1/server/dhcpd.c log_perror = 0; /* No sense logging to /dev/null. */ IGNORE_RET (chdir("/")); -diff -up dhcp-4.3.3b1/server/ldap.c.cloexec dhcp-4.3.3b1/server/ldap.c ---- dhcp-4.3.3b1/server/ldap.c.cloexec 2015-07-30 21:03:40.000000000 +0200 -+++ dhcp-4.3.3b1/server/ldap.c 2015-08-10 10:46:20.279755493 +0200 -@@ -1442,7 +1442,7 @@ ldap_start (void) +diff --git a/server/ldap.c b/server/ldap.c +index 5126d24..555545c 100644 +--- a/server/ldap.c ++++ b/server/ldap.c +@@ -1446,7 +1446,7 @@ ldap_start (void) if (ldap_debug_file != NULL && ldap_debug_fd == -1) { @@ -334,3 +362,6 @@ diff -up dhcp-4.3.3b1/server/ldap.c.cloexec dhcp-4.3.3b1/server/ldap.c S_IRUSR | S_IWUSR)) < 0) log_error ("Error opening debug LDAP log file %s: %s", ldap_debug_file, strerror (errno)); +-- +2.14.5 + diff --git a/dhcp-garbage-chars.patch b/0009-Fix-garbage-in-format-string-error.patch similarity index 40% rename from dhcp-garbage-chars.patch rename to 0009-Fix-garbage-in-format-string-error.patch index 131360be628cdd58172a8ffb686fb5731ed58211..f9d81ab7b47d57c9706132c1f234b101b0fb598d 100644 --- a/dhcp-garbage-chars.patch +++ b/0009-Fix-garbage-in-format-string-error.patch @@ -1,7 +1,19 @@ -diff -up dhcp-4.3.0rc1/common/tables.c.garbage dhcp-4.3.0rc1/common/tables.c ---- dhcp-4.3.0rc1/common/tables.c.garbage 2014-01-29 10:03:52.132624677 +0100 -+++ dhcp-4.3.0rc1/common/tables.c 2014-01-29 10:04:51.413875343 +0100 -@@ -213,7 +213,7 @@ static struct option dhcp_options[] = { +From a0a2186ce52a31357d4eb3c32d7d6887e4603814 Mon Sep 17 00:00:00 2001 +From: Pavel Zhukov +Date: Thu, 21 Feb 2019 10:28:13 +0100 +Subject: [PATCH 09/26] Fix 'garbage in format string' error +Cc: pzhukov@redhat.com + +RHBZ: 450042 +--- + common/tables.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/common/tables.c b/common/tables.c +index c1aa214..d2294c0 100644 +--- a/common/tables.c ++++ b/common/tables.c +@@ -215,7 +215,7 @@ static struct option dhcp_options[] = { { "name-service-search", "Sa", &dhcp_universe, 117, 1 }, #endif { "subnet-selection", "I", &dhcp_universe, 118, 1 }, @@ -10,3 +22,6 @@ diff -up dhcp-4.3.0rc1/common/tables.c.garbage dhcp-4.3.0rc1/common/tables.c { "vivco", "Evendor-class.", &dhcp_universe, 124, 1 }, { "vivso", "Evendor.", &dhcp_universe, 125, 1 }, #if 0 +-- +2.14.5 + diff --git a/0010-Handle-null-timeout.patch b/0010-Handle-null-timeout.patch new file mode 100644 index 0000000000000000000000000000000000000000..2b6e49b570bec1c805da1abc8e88d2c4243a3f78 --- /dev/null +++ b/0010-Handle-null-timeout.patch @@ -0,0 +1,32 @@ +From ed7610cdb2e8ebdbaee618e477879e7e008d4f29 Mon Sep 17 00:00:00 2001 +From: Pavel Zhukov +Date: Thu, 21 Feb 2019 10:29:08 +0100 +Subject: [PATCH 10/26] Handle null timeout +Cc: pzhukov@redhat.com + +Handle cases in add_timeout() where the function is called with a NULL +value for the 'when' parameter + +ISC-Bugs: #19867 (rejected) +--- + common/dispatch.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/common/dispatch.c b/common/dispatch.c +index 0207ad3..d7fe200 100644 +--- a/common/dispatch.c ++++ b/common/dispatch.c +@@ -209,6 +209,10 @@ void add_timeout (when, where, what, ref, unref) + isc_interval_t interval; + isc_time_t expires; + ++ if (when == NULL) { ++ return; ++ } ++ + /* See if this timeout supersedes an existing timeout. */ + t = (struct timeout *)0; + for (q = timeouts; q; q = q->next) { +-- +2.14.5 + diff --git a/dhcp-capability.patch b/0011-Drop-unnecessary-capabilities.patch similarity index 75% rename from dhcp-capability.patch rename to 0011-Drop-unnecessary-capabilities.patch index 49dfbeefa23b939c6b18fc708ab86201ffc06f6d..36ac7bf450d398f0352135e16fb5ed07b053a4b3 100644 --- a/dhcp-capability.patch +++ b/0011-Drop-unnecessary-capabilities.patch @@ -1,21 +1,38 @@ +From 3b37f4b7bb3a17f8bd655be919915a1912062ea6 Mon Sep 17 00:00:00 2001 +From: Pavel Zhukov +Date: Thu, 21 Feb 2019 10:30:28 +0100 +Subject: [PATCH 11/26] Drop unnecessary capabilities +Cc: pzhukov@redhat.com + +dhclient (#517649, #546765), dhcpd/dhcrelay (#699713) +--- + client/Makefile.am | 3 ++- + client/dhclient-script.8 | 10 ++++++++++ + client/dhclient.8 | 29 +++++++++++++++++++++++++++++ + client/dhclient.c | 24 ++++++++++++++++++++++++ + configure.ac | 35 +++++++++++++++++++++++++++++++++++ + relay/Makefile.am | 3 ++- + relay/dhcrelay.c | 29 +++++++++++++++++++++++++++++ + 7 files changed, 131 insertions(+), 2 deletions(-) + diff --git a/client/Makefile.am b/client/Makefile.am -index b1ecf82..387c097 100644 +index d177159..0689185 100644 --- a/client/Makefile.am +++ b/client/Makefile.am -@@ -15,6 +15,7 @@ dhclient_SOURCES = clparse.c dhclient.c dhc6.c \ - scripts/bsdos scripts/freebsd scripts/linux scripts/macos \ - scripts/netbsd scripts/nextstep scripts/openbsd \ - scripts/solaris scripts/openwrt --dhclient_LDADD = ../common/libdhcp.a ../omapip/libomapi.la $(BIND_LIBS) -+dhclient_LDADD = ../common/libdhcp.a ../omapip/libomapi.la \ -+ $(CAPNG_LDADD) $(BIND_LIBS) +@@ -17,6 +17,7 @@ dhclient_LDADD = ../common/libdhcp.@A@ ../omapip/libomapi.@A@ \ + @BINDLIBIRSDIR@/libirs.@A@ \ + @BINDLIBDNSDIR@/libdns.@A@ \ + @BINDLIBISCCFGDIR@/libisccfg.@A@ \ +- @BINDLIBISCDIR@/libisc.@A@ ++ @BINDLIBISCDIR@/libisc.@A@ \ ++ $(CAPNG_LDADD) man_MANS = dhclient.8 dhclient-script.8 dhclient.conf.5 dhclient.leases.5 EXTRA_DIST = $(man_MANS) diff --git a/client/dhclient-script.8 b/client/dhclient-script.8 -index 3a3aaf7..fec726c 100644 +index 0db5516..2eddb8f 100644 --- a/client/dhclient-script.8 +++ b/client/dhclient-script.8 -@@ -245,6 +245,16 @@ repeatedly initialized to the values provided by one server, and then +@@ -243,6 +243,16 @@ repeatedly initialized to the values provided by one server, and then the other. Assuming the information provided by both servers is valid, this shouldn't cause any real problems, but it could be confusing. @@ -33,7 +50,7 @@ index 3a3aaf7..fec726c 100644 dhclient(8), dhcpd(8), dhcrelay(8), dhclient.conf(5) and dhclient.leases(5). diff --git a/client/dhclient.8 b/client/dhclient.8 -index aa2238d..005cda5 100644 +index 6d7fbdb..0145b9f 100644 --- a/client/dhclient.8 +++ b/client/dhclient.8 @@ -134,6 +134,9 @@ dhclient - Dynamic Host Configuration Protocol Client @@ -46,7 +63,7 @@ index aa2238d..005cda5 100644 .B -B ] [ -@@ -320,6 +323,32 @@ not to exit when it doesn't find any such interfaces. The +@@ -328,6 +331,32 @@ not to exit when it doesn't find any such interfaces. The program can then be used to notify the client when a network interface has been added or removed, so that the client can attempt to configure an IP address on that interface. @@ -80,12 +97,12 @@ index aa2238d..005cda5 100644 .BI \-n Do not configure any interfaces. This is most likely to be useful in diff --git a/client/dhclient.c b/client/dhclient.c -index 09ae09b..2d564ff 100644 +index a86ab9e..5d3f5bc 100644 --- a/client/dhclient.c +++ b/client/dhclient.c -@@ -40,6 +40,10 @@ - #include - #include +@@ -41,6 +41,10 @@ + #include + #include +#ifdef HAVE_LIBCAP_NG +#include @@ -94,7 +111,7 @@ index 09ae09b..2d564ff 100644 /* * Defined in stdio.h when _GNU_SOURCE is set, but we don't want to define * that when building ISC code. -@@ -239,6 +243,9 @@ main(int argc, char **argv) { +@@ -266,6 +270,9 @@ main(int argc, char **argv) { int timeout_arg = 0; char *arg_conf = NULL; int arg_conf_len = 0; @@ -104,18 +121,18 @@ index 09ae09b..2d564ff 100644 /* Initialize client globals. */ memset(&default_duid, 0, sizeof(default_duid)); -@@ -548,6 +555,10 @@ main(int argc, char **argv) { - } +@@ -665,6 +672,10 @@ main(int argc, char **argv) { dhclient_request_options = argv[i]; + + } else if (!strcmp(argv[i], "-nc")) { +#ifdef HAVE_LIBCAP_NG -+ keep_capabilities = 1; ++ keep_capabilities = 1; +#endif } else if (argv[i][0] == '-') { usage("Unknown command: %s", argv[i]); } else if (interfaces_requested < 0) { -@@ -608,6 +619,19 @@ main(int argc, char **argv) { +@@ -725,6 +736,19 @@ main(int argc, char **argv) { path_dhclient_script = s; } @@ -136,10 +153,10 @@ index 09ae09b..2d564ff 100644 initialize_common_option_spaces(); diff --git a/configure.ac b/configure.ac -index adc98a8..8bbe5ca 100644 +index a797438..15fc0d7 100644 --- a/configure.ac +++ b/configure.ac -@@ -592,6 +592,41 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[void foo() __attribute__((noreturn)); +@@ -612,6 +612,41 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[void foo() __attribute__((noreturn)); # Look for optional headers. AC_CHECK_HEADERS(sys/socket.h net/if_dl.h net/if6.h regex.h) @@ -182,20 +199,21 @@ index adc98a8..8bbe5ca 100644 AC_SEARCH_LIBS(socket, [socket]) AC_SEARCH_LIBS(inet_ntoa, [nsl]) diff --git a/relay/Makefile.am b/relay/Makefile.am -index 316a524..999e543 100644 +index 2ba5979..8900e0b 100644 --- a/relay/Makefile.am +++ b/relay/Makefile.am -@@ -5,7 +5,7 @@ AM_CPPFLAGS = -DLOCALSTATEDIR='"@localstatedir@"' - sbin_PROGRAMS = dhcrelay - dhcrelay_SOURCES = dhcrelay.c - dhcrelay_LDADD = ../common/libdhcp.a ../omapip/libomapi.la \ -- $(BIND_LIBS) -+ $(CAPNG_LDADD) $(BIND_LIBS) +@@ -8,6 +8,7 @@ dhcrelay_LDADD = ../common/libdhcp.@A@ ../omapip/libomapi.@A@ \ + @BINDLIBIRSDIR@/libirs.@A@ \ + @BINDLIBDNSDIR@/libdns.@A@ \ + @BINDLIBISCCFGDIR@/libisccfg.@A@ \ +- @BINDLIBISCDIR@/libisc.@A@ ++ @BINDLIBISCDIR@/libisc.@A@ \ ++ $(CAPNG_LDADD) man_MANS = dhcrelay.8 EXTRA_DIST = $(man_MANS) diff --git a/relay/dhcrelay.c b/relay/dhcrelay.c -index eac119c..d2ab448 100644 +index ea1be18..7b4f4f1 100644 --- a/relay/dhcrelay.c +++ b/relay/dhcrelay.c @@ -32,6 +32,11 @@ @@ -210,7 +228,7 @@ index eac119c..d2ab448 100644 TIME default_lease_time = 43200; /* 12 hours... */ TIME max_lease_time = 86400; /* 24 hours... */ struct tree_cache *global_options[256]; -@@ -472,6 +477,10 @@ main(int argc, char **argv) { +@@ -590,6 +595,10 @@ main(int argc, char **argv) { if (++i == argc) usage(use_noarg, argv[i-1]); dhcrelay_sub_id = argv[i]; @@ -221,7 +239,7 @@ index eac119c..d2ab448 100644 #endif } else if (!strcmp(argv[i], "-pf")) { if (++i == argc) -@@ -547,6 +556,17 @@ main(int argc, char **argv) { +@@ -660,6 +669,17 @@ main(int argc, char **argv) { #endif } @@ -239,7 +257,7 @@ index eac119c..d2ab448 100644 if (!quiet) { log_info("%s %s", message, PACKAGE_VERSION); log_info(copyright); -@@ -699,6 +719,15 @@ main(int argc, char **argv) { +@@ -816,6 +836,15 @@ main(int argc, char **argv) { signal(SIGTERM, dhcp_signal_handler); /* kill */ #endif @@ -255,3 +273,6 @@ index eac119c..d2ab448 100644 /* Start dispatching packets and timeouts... */ dispatch(); +-- +2.14.5 + diff --git a/dhcp-rfc3442-classless-static-routes.patch b/0012-RFC-3442-Classless-Static-Route-Option-for-DHCPv4-51.patch similarity index 76% rename from dhcp-rfc3442-classless-static-routes.patch rename to 0012-RFC-3442-Classless-Static-Route-Option-for-DHCPv4-51.patch index 6c3a2392b6795fc333d39268b7193c48affa8c43..866527c2260f3aed1e0398e3988459ad1550c864 100644 --- a/dhcp-rfc3442-classless-static-routes.patch +++ b/0012-RFC-3442-Classless-Static-Route-Option-for-DHCPv4-51.patch @@ -1,6 +1,27 @@ -diff -up dhcp-4.3.4/client/clparse.c.rfc3442 dhcp-4.3.4/client/clparse.c ---- dhcp-4.3.4/client/clparse.c.rfc3442 2016-04-29 12:23:34.192032714 +0200 -+++ dhcp-4.3.4/client/clparse.c 2016-04-29 12:24:37.531016317 +0200 +From 01b1dcfef129a4eccfaf0f63a216774019f82dca Mon Sep 17 00:00:00 2001 +From: Pavel Zhukov +Date: Thu, 21 Feb 2019 10:32:35 +0100 +Subject: [PATCH 12/26] RFC 3442 - Classless Static Route Option for DHCPv4 + (#516325) +Cc: pzhukov@redhat.com + +(Submitted to dhcp-bugs@isc.org - [ISC-Bugs #24572]) +--- + client/clparse.c | 13 ++++++++++-- + common/dhcp-options.5 | 43 +++++++++++++++++++++++++++++++++++++++ + common/inet.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++ + common/options.c | 49 +++++++++++++++++++++++++++++++++++++++++++- + common/parse.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++- + common/tables.c | 2 ++ + includes/dhcp.h | 1 + + includes/dhcpd.h | 2 ++ + includes/dhctoken.h | 5 +++-- + 9 files changed, 219 insertions(+), 6 deletions(-) + +diff --git a/client/clparse.c b/client/clparse.c +index 44387ed..862e4f9 100644 +--- a/client/clparse.c ++++ b/client/clparse.c @@ -31,7 +31,7 @@ struct client_config top_level_config; @@ -35,10 +56,11 @@ diff -up dhcp-4.3.4/client/clparse.c.rfc3442 dhcp-4.3.4/client/clparse.c for (code = 0 ; code < NUM_DEFAULT_REQUESTED_OPTS ; code++) { if (default_requested_options[code] == NULL) log_fatal("Unable to find option definition for " -diff -up dhcp-4.3.4/common/dhcp-options.5.rfc3442 dhcp-4.3.4/common/dhcp-options.5 ---- dhcp-4.3.4/common/dhcp-options.5.rfc3442 2016-04-29 12:23:34.183032716 +0200 -+++ dhcp-4.3.4/common/dhcp-options.5 2016-04-29 12:23:34.237032703 +0200 -@@ -111,6 +111,26 @@ hexadecimal, separated by colons. For e +diff --git a/common/dhcp-options.5 b/common/dhcp-options.5 +index d9e1197..2343b19 100644 +--- a/common/dhcp-options.5 ++++ b/common/dhcp-options.5 +@@ -110,6 +110,26 @@ hexadecimal, separated by colons. For example: or option dhcp-client-identifier 43:4c:49:45:54:2d:46:4f:4f; .fi @@ -65,7 +87,7 @@ diff -up dhcp-4.3.4/common/dhcp-options.5.rfc3442 dhcp-4.3.4/common/dhcp-options .SH SETTING OPTION VALUES USING EXPRESSIONS Sometimes it's helpful to be able to set the value of a DHCP option based on some value that the client has sent. To do this, you can -@@ -1031,6 +1051,29 @@ dhclient-script will create routes: +@@ -1086,6 +1106,29 @@ dhclient-script will create routes: .RE .PP .nf @@ -95,10 +117,11 @@ diff -up dhcp-4.3.4/common/dhcp-options.5.rfc3442 dhcp-4.3.4/common/dhcp-options .B option \fBstreettalk-directory-assistance-server\fR \fIip-address\fR [\fB,\fR \fIip-address\fR...]\fB;\fR .fi -diff -up dhcp-4.3.4/common/inet.c.rfc3442 dhcp-4.3.4/common/inet.c ---- dhcp-4.3.4/common/inet.c.rfc3442 2016-03-22 14:16:51.000000000 +0100 -+++ dhcp-4.3.4/common/inet.c 2016-04-29 12:23:34.237032703 +0200 -@@ -519,6 +519,60 @@ free_iaddrcidrnetlist(struct iaddrcidrne +diff --git a/common/inet.c b/common/inet.c +index c4da73c..981fb92 100644 +--- a/common/inet.c ++++ b/common/inet.c +@@ -519,6 +519,60 @@ free_iaddrcidrnetlist(struct iaddrcidrnetlist **result) { return ISC_R_SUCCESS; } @@ -159,10 +182,11 @@ diff -up dhcp-4.3.4/common/inet.c.rfc3442 dhcp-4.3.4/common/inet.c /* piaddr() turns an iaddr structure into a printable address. */ /* XXX: should use a const pointer rather than passing the structure */ const char * -diff -up dhcp-4.3.4/common/options.c.rfc3442 dhcp-4.3.4/common/options.c ---- dhcp-4.3.4/common/options.c.rfc3442 2016-03-22 14:16:51.000000000 +0100 -+++ dhcp-4.3.4/common/options.c 2016-04-29 12:23:34.237032703 +0200 -@@ -713,7 +713,11 @@ cons_options(struct packet *inpacket, st +diff --git a/common/options.c b/common/options.c +index fc0e088..3034cf0 100644 +--- a/common/options.c ++++ b/common/options.c +@@ -729,7 +729,11 @@ cons_options(struct packet *inpacket, struct dhcp_packet *outpacket, * packet. */ priority_list[priority_len++] = DHO_SUBNET_MASK; @@ -175,7 +199,7 @@ diff -up dhcp-4.3.4/common/options.c.rfc3442 dhcp-4.3.4/common/options.c priority_list[priority_len++] = DHO_DOMAIN_NAME_SERVERS; priority_list[priority_len++] = DHO_HOST_NAME; priority_list[priority_len++] = DHO_FQDN; -@@ -1694,6 +1698,7 @@ const char *pretty_print_option (option, +@@ -1804,6 +1808,7 @@ const char *pretty_print_option (option, data, len, emit_commas, emit_quotes) unsigned long tval; isc_boolean_t a_array = ISC_FALSE; int len_used; @@ -183,7 +207,7 @@ diff -up dhcp-4.3.4/common/options.c.rfc3442 dhcp-4.3.4/common/options.c if (emit_commas) comma = ','; -@@ -1702,6 +1707,7 @@ const char *pretty_print_option (option, +@@ -1812,6 +1817,7 @@ const char *pretty_print_option (option, data, len, emit_commas, emit_quotes) memset (enumbuf, 0, sizeof enumbuf); @@ -191,7 +215,7 @@ diff -up dhcp-4.3.4/common/options.c.rfc3442 dhcp-4.3.4/common/options.c /* Figure out the size of the data. */ for (l = i = 0; option -> format [i]; i++, l++) { if (l >= sizeof(fmtbuf) - 1) -@@ -1894,6 +1900,33 @@ const char *pretty_print_option (option, +@@ -2004,6 +2010,33 @@ const char *pretty_print_option (option, data, len, emit_commas, emit_quotes) if (numhunk < 0) numhunk = 1; @@ -225,7 +249,7 @@ diff -up dhcp-4.3.4/common/options.c.rfc3442 dhcp-4.3.4/common/options.c /* Cycle through the array (or hunk) printing the data. */ for (i = 0; i < numhunk; i++) { if ((a_array == ISC_TRUE) && (i != 0) && (numelem > 0)) { -@@ -2049,6 +2082,20 @@ const char *pretty_print_option (option, +@@ -2159,6 +2192,20 @@ const char *pretty_print_option (option, data, len, emit_commas, emit_quotes) strcpy(op, piaddr(iaddr)); dp += 4; break; @@ -246,13 +270,15 @@ diff -up dhcp-4.3.4/common/options.c.rfc3442 dhcp-4.3.4/common/options.c case '6': iaddr.len = 16; memcpy(iaddr.iabuf, dp, 16); -diff -up dhcp-4.3.4/common/parse.c.rfc3442 dhcp-4.3.4/common/parse.c ---- dhcp-4.3.4/common/parse.c.rfc3442 2016-04-29 12:23:34.220032707 +0200 -+++ dhcp-4.3.4/common/parse.c 2016-04-29 12:23:34.238032702 +0200 -@@ -341,6 +341,39 @@ int parse_ip_addr (cfile, addr) +diff --git a/common/parse.c b/common/parse.c +index 3ac4ebf..f17bc0b 100644 +--- a/common/parse.c ++++ b/common/parse.c +@@ -344,6 +344,39 @@ int parse_ip_addr (cfile, addr) + return 0; } - /* ++/* + * destination-descriptor :== NUMBER DOT NUMBER | + * NUMBER DOT NUMBER DOT NUMBER | + * NUMBER DOT NUMBER DOT NUMBER DOT NUMBER | @@ -285,11 +311,10 @@ diff -up dhcp-4.3.4/common/parse.c.rfc3442 dhcp-4.3.4/common/parse.c + return 0; +} + -+/* + /* * Return true if every character in the string is hexadecimal. */ - static int -@@ -720,8 +753,10 @@ unsigned char *parse_numeric_aggregate ( +@@ -724,8 +757,10 @@ unsigned char *parse_numeric_aggregate (cfile, buf, if (count) { token = peek_token (&val, (unsigned *)0, cfile); if (token != separator) { @@ -301,7 +326,7 @@ diff -up dhcp-4.3.4/common/parse.c.rfc3442 dhcp-4.3.4/common/parse.c if (token != RBRACE && token != LBRACE) token = next_token (&val, (unsigned *)0, -@@ -1668,6 +1703,9 @@ int parse_option_code_definition (cfile, +@@ -1672,6 +1707,9 @@ int parse_option_code_definition (cfile, option) case IP_ADDRESS: type = 'I'; break; @@ -311,7 +336,7 @@ diff -up dhcp-4.3.4/common/parse.c.rfc3442 dhcp-4.3.4/common/parse.c case IP6_ADDRESS: type = '6'; break; -@@ -5097,6 +5135,15 @@ int parse_option_token (rv, cfile, fmt, +@@ -5101,6 +5139,15 @@ int parse_option_token (rv, cfile, fmt, expr, uniform, lookups) } break; @@ -327,7 +352,7 @@ diff -up dhcp-4.3.4/common/parse.c.rfc3442 dhcp-4.3.4/common/parse.c case '6': /* IPv6 address. */ if (!parse_ip6_addr(cfile, &addr)) { return 0; -@@ -5374,6 +5421,13 @@ int parse_option_decl (oc, cfile) +@@ -5378,6 +5425,13 @@ int parse_option_decl (oc, cfile) goto exit; len = ip_addr.len; dp = ip_addr.iabuf; @@ -341,10 +366,11 @@ diff -up dhcp-4.3.4/common/parse.c.rfc3442 dhcp-4.3.4/common/parse.c alloc: if (hunkix + len > sizeof hunkbuf) { -diff -up dhcp-4.3.4/common/tables.c.rfc3442 dhcp-4.3.4/common/tables.c ---- dhcp-4.3.4/common/tables.c.rfc3442 2016-04-29 12:23:34.209032710 +0200 -+++ dhcp-4.3.4/common/tables.c 2016-04-29 12:23:34.238032702 +0200 -@@ -45,6 +45,7 @@ HASH_FUNCTIONS (option_code, const unsig +diff --git a/common/tables.c b/common/tables.c +index d2294c0..f1be07d 100644 +--- a/common/tables.c ++++ b/common/tables.c +@@ -45,6 +45,7 @@ HASH_FUNCTIONS (option_code, const unsigned *, struct option, Format codes: I - IPv4 address @@ -360,10 +386,23 @@ diff -up dhcp-4.3.4/common/tables.c.rfc3442 dhcp-4.3.4/common/tables.c { "vivco", "Evendor-class.", &dhcp_universe, 124, 1 }, { "vivso", "Evendor.", &dhcp_universe, 125, 1 }, #if 0 -diff -up dhcp-4.3.4/includes/dhcpd.h.rfc3442 dhcp-4.3.4/includes/dhcpd.h ---- dhcp-4.3.4/includes/dhcpd.h.rfc3442 2016-04-29 12:23:34.186032716 +0200 -+++ dhcp-4.3.4/includes/dhcpd.h 2016-04-29 12:23:34.239032702 +0200 -@@ -2894,6 +2894,7 @@ isc_result_t range2cidr(struct iaddrcidr +diff --git a/includes/dhcp.h b/includes/dhcp.h +index 0a74137..95bf539 100644 +--- a/includes/dhcp.h ++++ b/includes/dhcp.h +@@ -158,6 +158,7 @@ struct dhcp_packet { + #define DHO_ASSOCIATED_IP 92 + #define DHO_SUBNET_SELECTION 118 /* RFC3011! */ + #define DHO_DOMAIN_SEARCH 119 /* RFC3397 */ ++#define DHO_CLASSLESS_STATIC_ROUTES 121 /* RFC3442 */ + #define DHO_VIVCO_SUBOPTIONS 124 + #define DHO_VIVSO_SUBOPTIONS 125 + +diff --git a/includes/dhcpd.h b/includes/dhcpd.h +index 3632a6b..2ac39ae 100644 +--- a/includes/dhcpd.h ++++ b/includes/dhcpd.h +@@ -2951,6 +2951,7 @@ isc_result_t range2cidr(struct iaddrcidrnetlist **result, const struct iaddr *lo, const struct iaddr *hi); isc_result_t free_iaddrcidrnetlist(struct iaddrcidrnetlist **result); const char *piaddr (struct iaddr); @@ -371,7 +410,7 @@ diff -up dhcp-4.3.4/includes/dhcpd.h.rfc3442 dhcp-4.3.4/includes/dhcpd.h char *piaddrmask(struct iaddr *, struct iaddr *); char *piaddrcidr(const struct iaddr *, unsigned int); u_int16_t validate_port(char *); -@@ -3108,6 +3109,7 @@ void parse_client_lease_declaration (str +@@ -3169,6 +3170,7 @@ void parse_client_lease_declaration (struct parse *, int parse_option_decl (struct option_cache **, struct parse *); void parse_string_list (struct parse *, struct string_list **, int); int parse_ip_addr (struct parse *, struct iaddr *); @@ -379,27 +418,22 @@ diff -up dhcp-4.3.4/includes/dhcpd.h.rfc3442 dhcp-4.3.4/includes/dhcpd.h int parse_ip_addr_with_subnet(struct parse *, struct iaddrmatch *); void parse_reject_statement (struct parse *, struct client_config *); -diff -up dhcp-4.3.4/includes/dhcp.h.rfc3442 dhcp-4.3.4/includes/dhcp.h ---- dhcp-4.3.4/includes/dhcp.h.rfc3442 2016-03-22 14:16:51.000000000 +0100 -+++ dhcp-4.3.4/includes/dhcp.h 2016-04-29 12:23:34.239032702 +0200 -@@ -159,6 +159,7 @@ struct dhcp_packet { - #define DHO_ASSOCIATED_IP 92 - #define DHO_SUBNET_SELECTION 118 /* RFC3011! */ - #define DHO_DOMAIN_SEARCH 119 /* RFC3397 */ -+#define DHO_CLASSLESS_STATIC_ROUTES 121 /* RFC3442 */ - #define DHO_VIVCO_SUBOPTIONS 124 - #define DHO_VIVSO_SUBOPTIONS 125 - -diff -up dhcp-4.3.4/includes/dhctoken.h.rfc3442 dhcp-4.3.4/includes/dhctoken.h ---- dhcp-4.3.4/includes/dhctoken.h.rfc3442 2016-04-29 12:23:34.239032702 +0200 -+++ dhcp-4.3.4/includes/dhctoken.h 2016-04-29 12:25:07.236008628 +0200 -@@ -374,7 +374,8 @@ enum dhcp_token { +diff --git a/includes/dhctoken.h b/includes/dhctoken.h +index 7e7215a..b4d93ba 100644 +--- a/includes/dhctoken.h ++++ b/includes/dhctoken.h +@@ -376,8 +376,9 @@ enum dhcp_token { LEASE_ID_FORMAT = 676, TOKEN_HEX = 677, TOKEN_OCTAL = 678, -- BOOTP_BROADCAST_ALWAYS = 679 -+ BOOTP_BROADCAST_ALWAYS = 679, -+ DESTINATION_DESCRIPTOR = 680 +- KEY_ALGORITHM = 679 +- BOOTP_BROADCAST_ALWAYS = 680 ++ KEY_ALGORITHM = 679, ++ BOOTP_BROADCAST_ALWAYS = 680, ++ DESTINATION_DESCRIPTOR = 681 }; #define is_identifier(x) ((x) >= FIRST_TOKEN && \ +-- +2.14.5 + diff --git a/dhcp-PPP.patch b/0013-DHCPv6-over-PPP-support-626514.patch similarity index 64% rename from dhcp-PPP.patch rename to 0013-DHCPv6-over-PPP-support-626514.patch index b3d82ea4d87387f5bd60d82fcaed45bb9fa1c1c2..5e0a6bab7593d67bb114a027afc3998829d19352 100644 --- a/dhcp-PPP.patch +++ b/0013-DHCPv6-over-PPP-support-626514.patch @@ -1,7 +1,24 @@ -diff -up dhcp-4.3.4/client/dhc6.c.PPP dhcp-4.3.4/client/dhc6.c ---- dhcp-4.3.4/client/dhc6.c.PPP 2016-04-29 12:46:29.824988665 +0200 -+++ dhcp-4.3.4/client/dhc6.c 2016-04-29 12:46:29.828988666 +0200 -@@ -5641,7 +5641,8 @@ make_client6_options(struct client_state +From 234747fbfd6c6429619ba843713d5b39fb4a513d Mon Sep 17 00:00:00 2001 +From: Pavel Zhukov +Date: Thu, 21 Feb 2019 10:33:06 +0100 +Subject: [PATCH 13/26] DHCPv6 over PPP support (#626514) +Cc: pzhukov@redhat.com + +--- + client/dhc6.c | 3 ++- + client/dhclient.c | 17 ++++++++++++++--- + common/bpf.c | 16 ++++++++++++++++ + common/lpf.c | 16 ++++++++++++++++ + includes/dhcp.h | 2 ++ + includes/dhcpd.h | 2 +- + server/dhcpv6.c | 3 +++ + 7 files changed, 54 insertions(+), 5 deletions(-) + +diff --git a/client/dhc6.c b/client/dhc6.c +index 16a0838..3171828 100644 +--- a/client/dhc6.c ++++ b/client/dhc6.c +@@ -5744,7 +5744,8 @@ make_client6_options(struct client_state *client, struct option_state **op, */ if ((oc = lookup_option(&dhcpv6_universe, *op, D6O_CLIENTID)) == NULL) { @@ -11,10 +28,11 @@ diff -up dhcp-4.3.4/client/dhc6.c.PPP dhcp-4.3.4/client/dhc6.c MDL)) log_fatal("Failure assembling a DUID."); -diff -up dhcp-4.3.4/client/dhclient.c.PPP dhcp-4.3.4/client/dhclient.c ---- dhcp-4.3.4/client/dhclient.c.PPP 2016-04-29 12:46:29.815988664 +0200 -+++ dhcp-4.3.4/client/dhclient.c 2016-04-29 12:46:29.830988666 +0200 -@@ -1077,8 +1077,8 @@ main(int argc, char **argv) { +diff --git a/client/dhclient.c b/client/dhclient.c +index 5d3f5bc..301132c 100644 +--- a/client/dhclient.c ++++ b/client/dhclient.c +@@ -1202,8 +1202,8 @@ main(int argc, char **argv) { if (default_duid.buffer != NULL) data_string_forget(&default_duid, MDL); @@ -25,7 +43,7 @@ diff -up dhcp-4.3.4/client/dhclient.c.PPP dhcp-4.3.4/client/dhclient.c } } -@@ -3808,7 +3808,7 @@ write_options(struct client_state *clien +@@ -3956,7 +3956,7 @@ write_options(struct client_state *client, struct option_state *options, * is not how it is intended. Upcoming rearchitecting the client should * address this "one daemon model." */ @@ -34,7 +52,7 @@ diff -up dhcp-4.3.4/client/dhclient.c.PPP dhcp-4.3.4/client/dhclient.c form_duid(struct data_string *duid, const char *file, int line) { struct interface_info *ip; -@@ -3821,6 +3821,15 @@ form_duid(struct data_string *duid, cons +@@ -3969,6 +3969,15 @@ form_duid(struct data_string *duid, const char *file, int line) if (ip == NULL) log_fatal("Impossible condition at %s:%d.", MDL); @@ -50,7 +68,7 @@ diff -up dhcp-4.3.4/client/dhclient.c.PPP dhcp-4.3.4/client/dhclient.c if ((ip->hw_address.hlen == 0) || (ip->hw_address.hlen > sizeof(ip->hw_address.hbuf))) log_fatal("Impossible hardware address length at %s:%d.", MDL); -@@ -3866,6 +3875,8 @@ form_duid(struct data_string *duid, cons +@@ -4014,6 +4023,8 @@ form_duid(struct data_string *duid, const char *file, int line) log_info("Created duid %s.", str); dfree(str, MDL); } @@ -59,10 +77,11 @@ diff -up dhcp-4.3.4/client/dhclient.c.PPP dhcp-4.3.4/client/dhclient.c } /* Write the default DUID to the lease store. */ -diff -up dhcp-4.3.4/common/bpf.c.PPP dhcp-4.3.4/common/bpf.c ---- dhcp-4.3.4/common/bpf.c.PPP 2016-04-29 12:46:29.794988660 +0200 -+++ dhcp-4.3.4/common/bpf.c 2016-04-29 12:46:29.830988666 +0200 -@@ -599,6 +599,22 @@ get_hw_addr(const char *name, struct har +diff --git a/common/bpf.c b/common/bpf.c +index 67b6d64..ffbd09a 100644 +--- a/common/bpf.c ++++ b/common/bpf.c +@@ -650,6 +650,22 @@ get_hw_addr(const char *name, struct hardware *hw) { memcpy(&hw->hbuf[1], LLADDR(sa), sa->sdl_alen); break; #endif /* IFT_FDDI */ @@ -85,10 +104,11 @@ diff -up dhcp-4.3.4/common/bpf.c.PPP dhcp-4.3.4/common/bpf.c default: log_fatal("Unsupported device type %d for \"%s\"", sa->sdl_type, name); -diff -up dhcp-4.3.4/common/lpf.c.PPP dhcp-4.3.4/common/lpf.c ---- dhcp-4.3.4/common/lpf.c.PPP 2016-03-22 14:16:51.000000000 +0100 -+++ dhcp-4.3.4/common/lpf.c 2016-04-29 12:46:29.830988666 +0200 -@@ -548,6 +548,22 @@ get_hw_addr(const char *name, struct har +diff --git a/common/lpf.c b/common/lpf.c +index 82a279b..b0ed01c 100644 +--- a/common/lpf.c ++++ b/common/lpf.c +@@ -563,6 +563,22 @@ get_hw_addr(const char *name, struct hardware *hw) { hw->hbuf[0] = HTYPE_FDDI; memcpy(&hw->hbuf[1], sa->sa_data, 6); break; @@ -111,22 +131,11 @@ diff -up dhcp-4.3.4/common/lpf.c.PPP dhcp-4.3.4/common/lpf.c default: log_fatal("Unsupported device type %ld for \"%s\"", (long int)sa->sa_family, name); -diff -up dhcp-4.3.4/includes/dhcpd.h.PPP dhcp-4.3.4/includes/dhcpd.h ---- dhcp-4.3.4/includes/dhcpd.h.PPP 2016-04-29 12:46:29.831988667 +0200 -+++ dhcp-4.3.4/includes/dhcpd.h 2016-04-29 12:47:13.167995959 +0200 -@@ -2990,7 +2990,7 @@ void client_dns_remove(struct client_sta - - void dhcpv4_client_assignments(void); - void dhcpv6_client_assignments(void); --void form_duid(struct data_string *duid, const char *file, int line); -+isc_result_t form_duid(struct data_string *duid, const char *file, int line); - - void dhcp4o6_start(void); - -diff -up dhcp-4.3.4/includes/dhcp.h.PPP dhcp-4.3.4/includes/dhcp.h ---- dhcp-4.3.4/includes/dhcp.h.PPP 2016-04-29 12:46:29.822988665 +0200 -+++ dhcp-4.3.4/includes/dhcp.h 2016-04-29 12:46:29.832988667 +0200 -@@ -81,6 +81,8 @@ struct dhcp_packet { +diff --git a/includes/dhcp.h b/includes/dhcp.h +index 95bf539..4cc547a 100644 +--- a/includes/dhcp.h ++++ b/includes/dhcp.h +@@ -80,6 +80,8 @@ struct dhcp_packet { * is no standard for this so we * just steal a type */ @@ -135,10 +144,24 @@ diff -up dhcp-4.3.4/includes/dhcp.h.PPP dhcp-4.3.4/includes/dhcp.h /* Magic cookie validating dhcp options field (and bootp vendor extensions field). */ #define DHCP_OPTIONS_COOKIE "\143\202\123\143" -diff -up dhcp-4.3.4/server/dhcpv6.c.PPP dhcp-4.3.4/server/dhcpv6.c ---- dhcp-4.3.4/server/dhcpv6.c.PPP 2016-03-22 14:16:51.000000000 +0100 -+++ dhcp-4.3.4/server/dhcpv6.c 2016-04-29 12:46:29.833988667 +0200 -@@ -454,6 +454,9 @@ generate_new_server_duid(void) { +diff --git a/includes/dhcpd.h b/includes/dhcpd.h +index 2ac39ae..faa9251 100644 +--- a/includes/dhcpd.h ++++ b/includes/dhcpd.h +@@ -3051,7 +3051,7 @@ void client_dns_remove(struct client_state *client, struct iaddr *addr); + + void dhcpv4_client_assignments(void); + void dhcpv6_client_assignments(void); +-void form_duid(struct data_string *duid, const char *file, int line); ++isc_result_t form_duid(struct data_string *duid, const char *file, int line); + + void dhcp4o6_start(void); + +diff --git a/server/dhcpv6.c b/server/dhcpv6.c +index a7110f9..c5ce7e8 100644 +--- a/server/dhcpv6.c ++++ b/server/dhcpv6.c +@@ -482,6 +482,9 @@ generate_new_server_duid(void) { if (p->hw_address.hlen > 0) { break; } @@ -148,3 +171,6 @@ diff -up dhcp-4.3.4/server/dhcpv6.c.PPP dhcp-4.3.4/server/dhcpv6.c } if (p == NULL) { return ISC_R_UNEXPECTED; +-- +2.14.5 + diff --git a/dhcp-lpf-ib.patch b/0014-IPoIB-support-660681.patch similarity index 77% rename from dhcp-lpf-ib.patch rename to 0014-IPoIB-support-660681.patch index 766d518ad1879612a07278c0f8c7a37da2511c07..a792e4fc64303c6e7ec29605be12639e1d8d6684 100644 --- a/dhcp-lpf-ib.patch +++ b/0014-IPoIB-support-660681.patch @@ -1,16 +1,33 @@ -diff -up dhcp-4.3.4/client/dhclient.c.lpf-ib dhcp-4.3.4/client/dhclient.c ---- dhcp-4.3.4/client/dhclient.c.lpf-ib 2016-05-02 14:37:36.945128001 +0200 -+++ dhcp-4.3.4/client/dhclient.c 2016-05-02 14:37:36.952128005 +0200 -@@ -163,6 +163,8 @@ static const char use_noarg[] = "No argu - static const char use_v6command[] = "Command not used for DHCPv4: %s"; - #endif +From 6d74c2d0ceadef2eb1c43c2da47f1d5b732adf8c Mon Sep 17 00:00:00 2001 +From: Pavel Zhukov +Date: Thu, 21 Feb 2019 10:34:21 +0100 +Subject: [PATCH 14/26] IPoIB support (#660681) +Cc: pzhukov@redhat.com + +(Submitted to dhcp-bugs@isc.org - [ISC-Bugs #24249]) +--- + client/dhclient.c | 32 +++++++ + common/bpf.c | 32 +++++++ + common/discover.c | 4 +- + common/lpf.c | 262 +++++++++++++++++++++++++++++++++++++++++++++++++----- + common/socket.c | 8 +- + includes/dhcpd.h | 6 +- + 6 files changed, 315 insertions(+), 29 deletions(-) + +diff --git a/client/dhclient.c b/client/dhclient.c +index 301132c..dc9080e 100644 +--- a/client/dhclient.c ++++ b/client/dhclient.c +@@ -205,6 +205,8 @@ static const char use_v6command[] = "Command not used for DHCPv4: %s"; + + #define DHCLIENT_USAGEH "{--version|--help|-h}" +static void setup_ib_interface(struct interface_info *ip); + static void usage(const char *sfmt, const char *sarg) { -@@ -1066,6 +1068,13 @@ main(int argc, char **argv) { +@@ -1191,6 +1193,13 @@ main(int argc, char **argv) { } srandom(seed + cur_time + (unsigned)getpid()); @@ -24,7 +41,7 @@ diff -up dhcp-4.3.4/client/dhclient.c.lpf-ib dhcp-4.3.4/client/dhclient.c /* * Establish a default DUID. We always do so for v6 and -@@ -1361,6 +1370,29 @@ int find_subnet (struct subnet **sp, +@@ -1486,6 +1495,29 @@ int find_subnet (struct subnet **sp, return 0; } @@ -54,12 +71,13 @@ diff -up dhcp-4.3.4/client/dhclient.c.lpf-ib dhcp-4.3.4/client/dhclient.c /* Individual States: * * Each routine is called from the dhclient_state_machine() in one of -diff -up dhcp-4.3.4/common/bpf.c.lpf-ib dhcp-4.3.4/common/bpf.c ---- dhcp-4.3.4/common/bpf.c.lpf-ib 2016-05-02 14:37:36.946128001 +0200 -+++ dhcp-4.3.4/common/bpf.c 2016-05-02 14:37:36.952128005 +0200 -@@ -198,11 +198,43 @@ struct bpf_insn dhcp_bpf_filter [] = { - BPF_STMT(BPF_RET+BPF_K, 0), - }; +diff --git a/common/bpf.c b/common/bpf.c +index ffbd09a..568e3d9 100644 +--- a/common/bpf.c ++++ b/common/bpf.c +@@ -237,11 +237,43 @@ int dhcp_bpf_relay_filter_len = + sizeof dhcp_bpf_relay_filter / sizeof (struct bpf_insn); + #endif +/* Packet filter program for DHCP over Infiniband. + * @@ -101,10 +119,11 @@ diff -up dhcp-4.3.4/common/bpf.c.lpf-ib dhcp-4.3.4/common/bpf.c #if defined (HAVE_TR_SUPPORT) struct bpf_insn dhcp_bpf_tr_filter [] = { /* accept all token ring packets due to variable length header */ -diff -up dhcp-4.3.4/common/discover.c.lpf-ib dhcp-4.3.4/common/discover.c ---- dhcp-4.3.4/common/discover.c.lpf-ib 2016-03-22 14:16:51.000000000 +0100 -+++ dhcp-4.3.4/common/discover.c 2016-05-02 14:38:08.257147982 +0200 -@@ -1235,7 +1235,7 @@ discover_interfaces(int state) { +diff --git a/common/discover.c b/common/discover.c +index 6ef8852..65881fc 100644 +--- a/common/discover.c ++++ b/common/discover.c +@@ -894,7 +894,7 @@ discover_interfaces(int state) { if_register_send(tmp); } else { /* get_hw_addr() was called by register. */ @@ -113,7 +132,7 @@ diff -up dhcp-4.3.4/common/discover.c.lpf-ib dhcp-4.3.4/common/discover.c } break; #ifdef DHCPv6 -@@ -1248,7 +1248,7 @@ discover_interfaces(int state) { +@@ -907,7 +907,7 @@ discover_interfaces(int state) { so now we have to call it explicitly to not leave the hardware address unknown (some code expects it cannot be. */ @@ -122,10 +141,11 @@ diff -up dhcp-4.3.4/common/discover.c.lpf-ib dhcp-4.3.4/common/discover.c } else { if_register_linklocal6(tmp); } -diff -up dhcp-4.3.4/common/lpf.c.lpf-ib dhcp-4.3.4/common/lpf.c ---- dhcp-4.3.4/common/lpf.c.lpf-ib 2016-05-02 14:37:36.947128002 +0200 -+++ dhcp-4.3.4/common/lpf.c 2016-05-02 14:37:36.953128006 +0200 -@@ -47,6 +47,17 @@ +diff --git a/common/lpf.c b/common/lpf.c +index b0ed01c..b732a86 100644 +--- a/common/lpf.c ++++ b/common/lpf.c +@@ -45,6 +45,17 @@ #include #include #include @@ -143,7 +163,7 @@ diff -up dhcp-4.3.4/common/lpf.c.lpf-ib dhcp-4.3.4/common/lpf.c #endif #if defined (USE_LPF_SEND) || defined (USE_LPF_RECEIVE) -@@ -80,10 +91,20 @@ int if_register_lpf (info) +@@ -78,10 +89,20 @@ int if_register_lpf (info) struct sockaddr common; } sa; struct ifreq ifr; @@ -166,7 +186,7 @@ diff -up dhcp-4.3.4/common/lpf.c.lpf-ib dhcp-4.3.4/common/lpf.c if (errno == ENOPROTOOPT || errno == EPROTONOSUPPORT || errno == ESOCKTNOSUPPORT || errno == EPFNOSUPPORT || errno == EAFNOSUPPORT || errno == EINVAL) { -@@ -106,6 +127,7 @@ int if_register_lpf (info) +@@ -104,6 +125,7 @@ int if_register_lpf (info) /* Bind to the interface name */ memset (&sa, 0, sizeof sa); sa.ll.sll_family = AF_PACKET; @@ -174,7 +194,7 @@ diff -up dhcp-4.3.4/common/lpf.c.lpf-ib dhcp-4.3.4/common/lpf.c sa.ll.sll_ifindex = ifr.ifr_ifindex; if (bind (sock, &sa.common, sizeof sa)) { if (errno == ENOPROTOOPT || errno == EPROTONOSUPPORT || -@@ -122,8 +144,6 @@ int if_register_lpf (info) +@@ -120,8 +142,6 @@ int if_register_lpf (info) } @@ -183,16 +203,16 @@ diff -up dhcp-4.3.4/common/lpf.c.lpf-ib dhcp-4.3.4/common/lpf.c return sock; } #endif /* USE_LPF_SEND || USE_LPF_RECEIVE */ -@@ -178,6 +198,8 @@ void if_deregister_send (info) +@@ -176,6 +196,8 @@ void if_deregister_send (info) in bpf includes... */ extern struct sock_filter dhcp_bpf_filter []; extern int dhcp_bpf_filter_len; +extern struct sock_filter dhcp_ib_bpf_filter []; +extern int dhcp_ib_bpf_filter_len; - #if defined (HAVE_TR_SUPPORT) - extern struct sock_filter dhcp_bpf_tr_filter []; -@@ -196,11 +218,12 @@ void if_register_receive (info) + #if defined(RELAY_PORT) + extern struct sock_filter dhcp_bpf_relay_filter []; +@@ -199,11 +221,12 @@ void if_register_receive (info) #ifdef PACKET_AUXDATA { int val = 1; @@ -210,45 +230,7 @@ diff -up dhcp-4.3.4/common/lpf.c.lpf-ib dhcp-4.3.4/common/lpf.c } } } -@@ -250,15 +273,28 @@ static void lpf_gen_filter_setup (info) - - memset(&p, 0, sizeof(p)); - -- /* Set up the bpf filter program structure. This is defined in -- bpf.c */ -- p.len = dhcp_bpf_filter_len; -- p.filter = dhcp_bpf_filter; -- -- /* Patch the server port into the LPF program... -- XXX changes to filter program may require changes -- to the insn number(s) used below! XXX */ -- dhcp_bpf_filter [8].k = ntohs ((short)local_port); -+ if (info->hw_address.hbuf[0] == HTYPE_INFINIBAND) { -+ /* Set up the bpf filter program structure. */ -+ p.len = dhcp_ib_bpf_filter_len; -+ p.filter = dhcp_ib_bpf_filter; -+ -+ /* Patch the server port into the LPF program... -+ XXX -+ changes to filter program may require changes -+ to the insn number(s) used below! -+ XXX */ -+ dhcp_ib_bpf_filter[6].k = ntohs ((short)local_port); -+ } else { -+ /* Set up the bpf filter program structure. -+ This is defined in bpf.c */ -+ p.len = dhcp_bpf_filter_len; -+ p.filter = dhcp_bpf_filter; -+ -+ /* Patch the server port into the LPF program... -+ XXX changes to filter program may require changes -+ to the insn number(s) used below! XXX */ -+ dhcp_bpf_filter [8].k = ntohs ((short)local_port); -+ } - - if (setsockopt (info -> rfdesc, SOL_SOCKET, SO_ATTACH_FILTER, &p, - sizeof p) < 0) { -@@ -315,6 +351,54 @@ static void lpf_tr_filter_setup (info) +@@ -330,6 +353,54 @@ static void lpf_tr_filter_setup (info) #endif /* USE_LPF_RECEIVE */ #ifdef USE_LPF_SEND @@ -303,7 +285,7 @@ diff -up dhcp-4.3.4/common/lpf.c.lpf-ib dhcp-4.3.4/common/lpf.c ssize_t send_packet (interface, packet, raw, len, from, to, hto) struct interface_info *interface; struct packet *packet; -@@ -335,6 +419,11 @@ ssize_t send_packet (interface, packet, +@@ -350,6 +421,11 @@ ssize_t send_packet (interface, packet, raw, len, from, to, hto) return send_fallback (interface, packet, raw, len, from, to, hto); @@ -315,7 +297,7 @@ diff -up dhcp-4.3.4/common/lpf.c.lpf-ib dhcp-4.3.4/common/lpf.c if (hto == NULL && interface->anycast_mac_addr.hlen) hto = &interface->anycast_mac_addr; -@@ -355,6 +444,42 @@ ssize_t send_packet (interface, packet, +@@ -370,6 +446,42 @@ ssize_t send_packet (interface, packet, raw, len, from, to, hto) #endif /* USE_LPF_SEND */ #ifdef USE_LPF_RECEIVE @@ -358,7 +340,7 @@ diff -up dhcp-4.3.4/common/lpf.c.lpf-ib dhcp-4.3.4/common/lpf.c ssize_t receive_packet (interface, buf, len, from, hfrom) struct interface_info *interface; unsigned char *buf; -@@ -393,6 +518,10 @@ ssize_t receive_packet (interface, buf, +@@ -408,6 +520,10 @@ ssize_t receive_packet (interface, buf, len, from, hfrom) }; #endif /* PACKET_AUXDATA */ @@ -369,7 +351,7 @@ diff -up dhcp-4.3.4/common/lpf.c.lpf-ib dhcp-4.3.4/common/lpf.c length = recvmsg (interface->rfdesc, &msg, 0); if (length <= 0) return length; -@@ -506,11 +635,33 @@ void maybe_setup_fallback () +@@ -521,11 +637,33 @@ void maybe_setup_fallback () #endif #if defined (USE_LPF_RECEIVE) || defined (USE_LPF_HWADDR) @@ -406,7 +388,7 @@ diff -up dhcp-4.3.4/common/lpf.c.lpf-ib dhcp-4.3.4/common/lpf.c if (strlen(name) >= sizeof(tmp.ifr_name)) { log_fatal("Device name too long: \"%s\"", name); -@@ -524,16 +675,61 @@ get_hw_addr(const char *name, struct har +@@ -539,16 +677,61 @@ get_hw_addr(const char *name, struct hardware *hw) { memset(&tmp, 0, sizeof(tmp)); strcpy(tmp.ifr_name, name); if (ioctl(sock, SIOCGIFHWADDR, &tmp) < 0) { @@ -471,7 +453,7 @@ diff -up dhcp-4.3.4/common/lpf.c.lpf-ib dhcp-4.3.4/common/lpf.c break; case ARPHRD_IEEE802: #ifdef ARPHRD_IEEE802_TR -@@ -541,18 +737,50 @@ get_hw_addr(const char *name, struct har +@@ -556,18 +739,50 @@ get_hw_addr(const char *name, struct hardware *hw) { #endif /* ARPHRD_IEEE802_TR */ hw->hlen = 7; hw->hbuf[0] = HTYPE_IEEE802; @@ -526,7 +508,7 @@ diff -up dhcp-4.3.4/common/lpf.c.lpf-ib dhcp-4.3.4/common/lpf.c hw->hlen = 0; hw->hbuf[0] = HTYPE_RESERVED; /* 0xdeadbeef should never occur on the wire, -@@ -565,10 +793,13 @@ get_hw_addr(const char *name, struct har +@@ -580,10 +795,13 @@ get_hw_addr(const char *name, struct hardware *hw) { break; #endif default: @@ -543,10 +525,11 @@ diff -up dhcp-4.3.4/common/lpf.c.lpf-ib dhcp-4.3.4/common/lpf.c + freeifaddrs(ifaddrs); } #endif -diff -up dhcp-4.3.4/common/socket.c.lpf-ib dhcp-4.3.4/common/socket.c ---- dhcp-4.3.4/common/socket.c.lpf-ib 2016-03-22 14:16:51.000000000 +0100 -+++ dhcp-4.3.4/common/socket.c 2016-05-02 14:37:36.953128006 +0200 -@@ -328,7 +328,7 @@ void if_register_send (info) +diff --git a/common/socket.c b/common/socket.c +index 483eb9c..6e1caac 100644 +--- a/common/socket.c ++++ b/common/socket.c +@@ -350,7 +350,7 @@ void if_register_send (info) info->wfdesc = if_register_socket(info, AF_INET, 0, NULL); /* If this is a normal IPv4 address, get the hardware address. */ if (strcmp(info->name, "fallback") != 0) @@ -555,7 +538,7 @@ diff -up dhcp-4.3.4/common/socket.c.lpf-ib dhcp-4.3.4/common/socket.c #if defined (USE_SOCKET_FALLBACK) /* Fallback only registers for send, but may need to receive as well. */ -@@ -391,7 +391,7 @@ void if_register_receive (info) +@@ -413,7 +413,7 @@ void if_register_receive (info) #endif /* IP_PKTINFO... */ /* If this is a normal IPv4 address, get the hardware address. */ if (strcmp(info->name, "fallback") != 0) @@ -564,7 +547,7 @@ diff -up dhcp-4.3.4/common/socket.c.lpf-ib dhcp-4.3.4/common/socket.c if (!quiet_interface_discovery) log_info ("Listening on Socket/%s%s%s", -@@ -505,7 +505,7 @@ if_register6(struct interface_info *info +@@ -567,7 +567,7 @@ if_register6(struct interface_info *info, int do_multicast) { if (req_multi) if_register_multicast(info); @@ -573,7 +556,7 @@ diff -up dhcp-4.3.4/common/socket.c.lpf-ib dhcp-4.3.4/common/socket.c if (!quiet_interface_discovery) { if (info->shared_network != NULL) { -@@ -561,7 +561,7 @@ if_register_linklocal6(struct interface_ +@@ -623,7 +623,7 @@ if_register_linklocal6(struct interface_info *info) { info->rfdesc = sock; info->wfdesc = sock; @@ -582,10 +565,11 @@ diff -up dhcp-4.3.4/common/socket.c.lpf-ib dhcp-4.3.4/common/socket.c if (!quiet_interface_discovery) { if (info->shared_network != NULL) { -diff -up dhcp-4.3.4/includes/dhcpd.h.lpf-ib dhcp-4.3.4/includes/dhcpd.h ---- dhcp-4.3.4/includes/dhcpd.h.lpf-ib 2016-05-02 14:37:36.948128002 +0200 -+++ dhcp-4.3.4/includes/dhcpd.h 2016-05-02 14:37:36.954128006 +0200 -@@ -482,6 +482,9 @@ struct packet { +diff --git a/includes/dhcpd.h b/includes/dhcpd.h +index faa9251..0c1a0aa 100644 +--- a/includes/dhcpd.h ++++ b/includes/dhcpd.h +@@ -485,6 +485,9 @@ struct packet { #define HARDWARE_ADDR_LEN 20 @@ -595,7 +579,7 @@ diff -up dhcp-4.3.4/includes/dhcpd.h.lpf-ib dhcp-4.3.4/includes/dhcpd.h struct hardware { u_int8_t hlen; u_int8_t hbuf[HARDWARE_ADDR_LEN + 1]; -@@ -1343,6 +1346,7 @@ struct interface_info { +@@ -1365,6 +1368,7 @@ struct interface_info { struct shared_network *shared_network; /* Networks connected to this interface. */ struct hardware hw_address; /* Its physical address. */ @@ -603,7 +587,7 @@ diff -up dhcp-4.3.4/includes/dhcpd.h.lpf-ib dhcp-4.3.4/includes/dhcpd.h struct in_addr *addresses; /* Addresses associated with this * interface. */ -@@ -2580,7 +2584,7 @@ void print_dns_status (int, struct dhcp_ +@@ -2633,7 +2637,7 @@ void print_dns_status (int, struct dhcp_ddns_cb *, isc_result_t); #endif const char *print_time(TIME); @@ -612,3 +596,6 @@ diff -up dhcp-4.3.4/includes/dhcpd.h.lpf-ib dhcp-4.3.4/includes/dhcpd.h char *buf_to_hex (const unsigned char *s, unsigned len, const char *file, int line); char *format_lease_id(const unsigned char *s, unsigned len, int format, +-- +2.14.5 + diff --git a/dhcp-IPoIB-log-id.patch b/0015-Add-GUID-DUID-to-dhcpd-logs-1064416.patch similarity index 43% rename from dhcp-IPoIB-log-id.patch rename to 0015-Add-GUID-DUID-to-dhcpd-logs-1064416.patch index e0369bb08ee48931b687d23f0fb8b1fa0bcd5e8f..1f88d7d99686b762280e62e345b2f7a434a3be93 100644 --- a/dhcp-IPoIB-log-id.patch +++ b/0015-Add-GUID-DUID-to-dhcpd-logs-1064416.patch @@ -1,6 +1,171 @@ ---- a/server/dhcp.c 2017-07-14 15:32:14.611104590 +0200 -+++ b/server/dhcp.c 2017-07-14 15:34:17.508858018 +0200 -@@ -87,6 +87,42 @@ +From 3d3e442ed1316930a5360e4d5a56b46a42a29419 Mon Sep 17 00:00:00 2001 +From: Pavel Zhukov +Date: Thu, 21 Feb 2019 10:35:47 +0100 +Subject: [PATCH 15/26] Add GUID/DUID to dhcpd logs (#1064416) +Cc: pzhukov@redhat.com + +--- + client/dhclient.c | 75 ++++++++++++++++++++++++++++++++++++++++++---------- + server/dhcp.c | 78 +++++++++++++++++++++++++++++++++---------------------- + 2 files changed, 108 insertions(+), 45 deletions(-) + +diff --git a/client/dhclient.c b/client/dhclient.c +index dc9080e..8e57da9 100644 +--- a/client/dhclient.c ++++ b/client/dhclient.c +@@ -1170,6 +1170,26 @@ main(int argc, char **argv) { + } + } + ++ /* We create a backup seed before rediscovering interfaces in order to ++ have a seed built using all of the available interfaces ++ It's interesting if required interfaces doesn't let us defined ++ a really unique seed due to a lack of valid HW addr later ++ (this is the case with DHCP over IB) ++ We only use the last device as using a sum could broke the ++ uniqueness of the seed among multiple nodes ++ */ ++ unsigned backup_seed = 0; ++ for (ip = interfaces; ip; ip = ip -> next) { ++ int junk; ++ if ( ip -> hw_address.hlen <= sizeof seed ) ++ continue; ++ memcpy (&junk, ++ &ip -> hw_address.hbuf [ip -> hw_address.hlen - ++ sizeof seed], sizeof seed); ++ backup_seed = junk; ++ } ++ ++ + /* At this point, all the interfaces that the script thinks + are relevant should be running, so now we once again call + discover_interfaces(), and this time ask it to actually set +@@ -1184,14 +1204,36 @@ main(int argc, char **argv) { + Not much entropy, but we're booting, so we're not likely to + find anything better. */ + seed = 0; ++ int seed_flag = 0; + for (ip = interfaces; ip; ip = ip->next) { + int junk; ++ if ( ip -> hw_address.hlen <= sizeof seed ) ++ continue; + memcpy(&junk, + &ip->hw_address.hbuf[ip->hw_address.hlen - + sizeof seed], sizeof seed); + seed += junk; ++ seed_flag = 1; + } +- srandom(seed + cur_time + (unsigned)getpid()); ++ if ( seed_flag == 0 ) { ++ if ( backup_seed != 0 ) { ++ seed = backup_seed; ++ log_info ("xid: rand init seed (0x%x) built using all" ++ " available interfaces",seed); ++ } ++ else { ++ seed = cur_time^((unsigned) gethostid()) ; ++ log_info ("xid: warning: no netdev with useable HWADDR found" ++ " for seed's uniqueness enforcement"); ++ log_info ("xid: rand init seed (0x%x) built using gethostid", ++ seed); ++ } ++ /* we only use seed and no current time as a broadcast reply */ ++ /* will certainly be used by the hwaddrless interface */ ++ srandom(seed + ((unsigned)(cur_tv.tv_usec * 1000000)) + (unsigned)getpid()); ++ } ++ else ++ srandom(seed + ((unsigned)(cur_tv.tv_usec * 1000000)) + (unsigned)getpid()); + + /* Setup specific Infiniband options */ + for (ip = interfaces; ip; ip = ip->next) { +@@ -1746,10 +1788,10 @@ void dhcpack (packet) + #endif + return; + } +- +- log_info ("DHCPACK of %s from %s", +- inet_ntoa(packet->raw->yiaddr), +- piaddr (packet->client_addr)); ++ log_info ("DHCPACK of %s from %s (xid=0x%x)", ++ inet_ntoa(packet->raw->yiaddr), ++ piaddr (packet -> client_addr), ++ ntohl(client -> xid)); + + lease = packet_to_lease (packet, client); + if (!lease) { +@@ -2669,7 +2711,7 @@ void dhcpnak (packet) + return; + } + +- log_info ("DHCPNAK from %s", piaddr (packet -> client_addr)); ++ log_info ("DHCPNAK from %s (xid=0x%x)", piaddr (packet -> client_addr), ntohl(client -> xid)); + + if (!client -> active) { + #if defined (DEBUG) +@@ -2802,10 +2844,10 @@ void send_discover (cpp) + (long)(client -> interval)); + } else + #endif +- log_info ("DHCPDISCOVER on %s to %s port %d interval %ld", ++ log_info ("DHCPDISCOVER on %s to %s port %d interval %ld (xid=0x%x)", + client -> name ? client -> name : client -> interface -> name, + inet_ntoa (sockaddr_broadcast.sin_addr), +- ntohs (sockaddr_broadcast.sin_port), (long)(client -> interval)); ++ ntohs (sockaddr_broadcast.sin_port), (long)(client -> interval), ntohl(client -> xid)); + + /* Send out a packet. */ + #if defined(DHCPv6) && defined(DHCP4o6) +@@ -3108,10 +3150,12 @@ void send_request (cpp) + } + + strncpy(rip_buf, rip_str, sizeof(rip_buf)-1); +- log_info ("DHCPREQUEST for %s on %s to %s port %d", rip_buf, ++ log_info ("DHCPREQUEST for %s on %s to %s port %d (xid=0x%x)", ++ rip_buf, + client->name ? client->name : client->interface->name, + inet_ntoa(destination.sin_addr), +- ntohs (destination.sin_port)); ++ ntohs (destination.sin_port), ++ ntohl(client -> xid)); + + #if defined(DHCPv6) && defined(DHCP4o6) + if (dhcpv4_over_dhcpv6) { +@@ -3168,11 +3212,13 @@ void send_decline (cpp) + log_info ("DHCPDECLINE"); + } else + #endif +- log_info ("DHCPDECLINE of %s on %s to %s port %d", ++ log_info ("DHCPDECLINE of %s on %s to %s port %d (xid=0x%x)", + piaddr(client->requested_address), + (client->name ? client->name : client->interface->name), + inet_ntoa(sockaddr_broadcast.sin_addr), +- ntohs(sockaddr_broadcast.sin_port)); ++ ntohs(sockaddr_broadcast.sin_port), ++ ntohl(client -> xid)); ++ + + /* Send out a packet. */ + #if defined(DHCPv6) && defined(DHCP4o6) +@@ -3231,11 +3277,12 @@ void send_release (cpp) + log_info ("DHCPRELEASE"); + } else + #endif +- log_info ("DHCPRELEASE of %s on %s to %s port %d", ++ log_info ("DHCPRELEASE of %s on %s to %s port %d (xid=0x%x)", + piaddr(client->active->address), + client->name ? client->name : client->interface->name, + inet_ntoa (destination.sin_addr), +- ntohs (destination.sin_port)); ++ ntohs (destination.sin_port), ++ ntohl(client -> xid)); + + #if defined(DHCPv6) && defined(DHCP4o6) + if (dhcpv4_over_dhcpv6) { +diff --git a/server/dhcp.c b/server/dhcp.c +index 20f2a62..0582c4c 100644 +--- a/server/dhcp.c ++++ b/server/dhcp.c +@@ -87,6 +87,42 @@ const int dhcp_type_name_max = ((sizeof dhcp_type_names) / sizeof (char *)); static TIME leaseTimeCheck(TIME calculated, TIME alternate); @@ -43,7 +208,7 @@ void dhcp (struct packet *packet) { int ms_nulltp = 0; -@@ -129,9 +165,7 @@ +@@ -129,9 +165,7 @@ dhcp (struct packet *packet) { log_info("%s from %s via %s: %s", s, (packet->raw->htype @@ -54,7 +219,7 @@ : ""), packet->raw->giaddr.s_addr ? inet_ntoa(packet->raw->giaddr) -@@ -328,9 +362,7 @@ +@@ -328,9 +362,7 @@ void dhcpdiscover (packet, ms_nulltp) #endif snprintf (msgbuf, sizeof msgbuf, "DHCPDISCOVER from %s %s%s%svia %s", (packet -> raw -> htype @@ -65,7 +230,7 @@ : (lease ? print_hex_1(lease->uid_len, lease->uid, 60) : "")), -@@ -542,9 +574,7 @@ +@@ -542,9 +574,7 @@ void dhcprequest (packet, ms_nulltp, ip_lease) "DHCPREQUEST for %s%s from %s %s%s%svia %s", piaddr (cip), smbuf, (packet -> raw -> htype @@ -76,7 +241,7 @@ : (lease ? print_hex_1(lease->uid_len, lease->uid, 60) : "")), -@@ -785,9 +815,7 @@ +@@ -785,9 +815,7 @@ void dhcprelease (packet, ms_nulltp) if ((oc = lookup_option (&dhcp_universe, packet -> options, DHO_DHCP_REQUESTED_ADDRESS))) { log_info ("DHCPRELEASE from %s specified requested-address.", @@ -87,7 +252,7 @@ } oc = lookup_option (&dhcp_universe, packet -> options, -@@ -879,9 +907,7 @@ +@@ -879,9 +907,7 @@ void dhcprelease (packet, ms_nulltp) "DHCPRELEASE of %s from %s %s%s%svia %s (%sfound)", cstr, (packet -> raw -> htype @@ -98,7 +263,7 @@ : (lease ? print_hex_1(lease->uid_len, lease->uid, 60) : "")), -@@ -986,9 +1012,7 @@ +@@ -986,9 +1012,7 @@ void dhcpdecline (packet, ms_nulltp) "DHCPDECLINE of %s from %s %s%s%svia %s", piaddr (cip), (packet -> raw -> htype @@ -109,7 +274,7 @@ : (lease ? print_hex_1(lease->uid_len, lease->uid, 60) : "")), -@@ -1707,8 +1731,7 @@ +@@ -1732,8 +1756,7 @@ void dhcpinform (packet, ms_nulltp) /* Report what we're sending. */ snprintf(msgbuf, sizeof msgbuf, "DHCPACK to %s (%s) via", piaddr(cip), (packet->raw->htype && packet->raw->hlen) ? @@ -119,7 +284,7 @@ ""); log_info("%s %s", msgbuf, gip.len ? piaddr(gip) : packet->interface->name); -@@ -1886,9 +1909,7 @@ +@@ -1918,9 +1941,7 @@ void nak_lease (packet, cip, network_group) #endif log_info ("DHCPNAK on %s to %s via %s", piaddr (*cip), @@ -130,7 +295,7 @@ packet -> raw -> giaddr.s_addr ? inet_ntoa (packet -> raw -> giaddr) : packet -> interface -> name); -@@ -3897,7 +3918,7 @@ +@@ -3936,7 +3957,7 @@ void dhcp_reply (lease) ? (state -> offer == DHCPACK ? "DHCPACK" : "DHCPOFFER") : "BOOTREPLY"), piaddr (lease -> ip_addr), @@ -139,7 +304,7 @@ ? print_hw_addr (lease -> hardware_addr.hbuf [0], lease -> hardware_addr.hlen - 1, &lease -> hardware_addr.hbuf [1]) -@@ -4450,10 +4471,7 @@ +@@ -4497,10 +4518,7 @@ int find_lease (struct lease **lp, if (uid_lease) { if (uid_lease->binding_state == FTS_ACTIVE) { log_error ("client %s has duplicate%s on %s", @@ -151,7 +316,7 @@ " leases", (ip_lease -> subnet -> shared_network -> name)); -@@ -4620,9 +4638,7 @@ +@@ -4667,9 +4685,7 @@ int find_lease (struct lease **lp, log_error("uid lease %s for client %s is duplicate " "on %s", piaddr(uid_lease->ip_addr), @@ -162,3 +327,6 @@ uid_lease->subnet->shared_network->name); if (!packet -> raw -> ciaddr.s_addr && +-- +2.14.5 + diff --git a/0016-Turn-on-creating-sending-of-DUID.patch b/0016-Turn-on-creating-sending-of-DUID.patch new file mode 100644 index 0000000000000000000000000000000000000000..bafffb5a18b80e08b80d9d62dc2a09d6eb9304b7 --- /dev/null +++ b/0016-Turn-on-creating-sending-of-DUID.patch @@ -0,0 +1,126 @@ +From 2f6b827e89305adcff45288c632785ac054adb8e Mon Sep 17 00:00:00 2001 +From: Pavel Zhukov +Date: Thu, 21 Feb 2019 10:36:30 +0100 +Subject: [PATCH 16/26] Turn on creating/sending of DUID +Cc: pzhukov@redhat.com + +as client identifier with DHCPv4 clients (#560361c#40, rfc4361) +--- + client/dhclient.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- + 1 file changed, 70 insertions(+), 4 deletions(-) + +diff --git a/client/dhclient.c b/client/dhclient.c +index 8e57da9..ccc98e4 100644 +--- a/client/dhclient.c ++++ b/client/dhclient.c +@@ -4021,6 +4021,59 @@ write_options(struct client_state *client, struct option_state *options, + } + } + ++int unhexchar(char c) { ++ ++ if (c >= '0' && c <= '9') ++ return c - '0'; ++ ++ if (c >= 'a' && c <= 'f') ++ return c - 'a' + 10; ++ ++ if (c >= 'A' && c <= 'F') ++ return c - 'A' + 10; ++ ++ return -1; ++} ++ ++isc_result_t ++read_uuid(u_int8_t* uuid) { ++ const char *id_fname = "/etc/machine-id"; ++ char id[32]; ++ size_t nread; ++ FILE * file = fopen( id_fname , "r"); ++ if (!file) { ++ log_debug("Cannot open %s", id_fname); ++ return ISC_R_IOERROR; ++ } ++ nread = fread(id, 1, sizeof id, file); ++ fclose(file); ++ ++ if (nread < 32) { ++ log_debug("Not enough data in %s", id_fname); ++ return ISC_R_IOERROR; ++ } ++ int j; ++ for (j = 0; j < 16; j++) { ++ int a, b; ++ ++ a = unhexchar(id[j*2]); ++ b = unhexchar(id[j*2+1]); ++ ++ if (a < 0 || b < 0) { ++ log_debug("Wrong data in %s", id_fname); ++ return ISC_R_IOERROR; ++ } ++ uuid[j] = a << 4 | b; ++ } ++ ++ /* Set UUID version to 4 --- truly random generation */ ++ uuid[6] = (uuid[6] & 0x0F) | 0x40; ++ /* Set the UUID variant to DCE */ ++ uuid[8] = (uuid[8] & 0x3F) | 0x80; ++ ++ return ISC_R_SUCCESS; ++} ++ + /* + * The "best" default DUID, since we cannot predict any information + * about the system (such as whether or not the hardware addresses are +@@ -4041,6 +4094,7 @@ form_duid(struct data_string *duid, const char *file, int line) + struct interface_info *ip; + int len; + char *str; ++ u_int8_t uuid[16]; + + /* For now, just use the first interface on the list. */ + ip = interfaces; +@@ -4061,9 +4115,16 @@ form_duid(struct data_string *duid, const char *file, int line) + (ip->hw_address.hlen > sizeof(ip->hw_address.hbuf))) + log_fatal("Impossible hardware address length at %s:%d.", MDL); + +- if (duid_type == 0) +- duid_type = stateless ? DUID_LL : DUID_LLT; +- ++ if (duid_type == 0) { ++ if (read_uuid(uuid) == ISC_R_SUCCESS) ++ duid_type = DUID_UUID; ++ else ++ duid_type = stateless ? DUID_LL : DUID_LLT; ++ } ++ ++ if (duid_type == DUID_UUID) ++ len = 2 + sizeof (uuid); ++ else { + /* + * 2 bytes for the 'duid type' field. + * 2 bytes for the 'htype' field. +@@ -4074,13 +4135,18 @@ form_duid(struct data_string *duid, const char *file, int line) + len = 4 + (ip->hw_address.hlen - 1); + if (duid_type == DUID_LLT) + len += 4; ++ } + if (!buffer_allocate(&duid->buffer, len, MDL)) + log_fatal("no memory for default DUID!"); + duid->data = duid->buffer->data; + duid->len = len; + ++ if (duid_type == DUID_UUID) { ++ putUShort(duid->buffer->data, DUID_UUID); ++ memcpy(duid->buffer->data + 2, uuid, sizeof(uuid)); ++ } + /* Basic Link Local Address type of DUID. */ +- if (duid_type == DUID_LLT) { ++ else if (duid_type == DUID_LLT) { + putUShort(duid->buffer->data, DUID_LLT); + putUShort(duid->buffer->data + 2, ip->hw_address.hbuf[0]); + putULong(duid->buffer->data + 4, cur_time - DUID_TIME_EPOCH); +-- +2.14.5 + diff --git a/dhcp-client-request-release-bind-iface.patch b/0017-Send-unicast-request-release-via-correct-interface.patch similarity index 70% rename from dhcp-client-request-release-bind-iface.patch rename to 0017-Send-unicast-request-release-via-correct-interface.patch index 7b9f271138b3f148535509391a2d1ceb2267b695..26c8b9655abb732e0ca37d6d7018209b8bea1633 100644 --- a/dhcp-client-request-release-bind-iface.patch +++ b/0017-Send-unicast-request-release-via-correct-interface.patch @@ -1,7 +1,20 @@ -diff -up dhcp-4.3.4/client/dhclient.c.bind-iface dhcp-4.3.4/client/dhclient.c ---- dhcp-4.3.4/client/dhclient.c.bind-iface 2016-04-29 13:06:50.595257108 +0200 -+++ dhcp-4.3.4/client/dhclient.c 2016-04-29 13:08:30.237281528 +0200 -@@ -3023,6 +3023,14 @@ void send_request (cpp) +From 193c4d7631fd623efa601f52fdab6018bf8be771 Mon Sep 17 00:00:00 2001 +From: Pavel Zhukov +Date: Thu, 21 Feb 2019 10:39:36 +0100 +Subject: [PATCH 17/26] Send unicast request/release via correct interface +Cc: pzhukov@redhat.com + +(#800561, #1177351) +(Submitted to dhcp-bugs@isc.org - [ISC-Bugs #30544]) +--- + client/dhclient.c | 30 ++++++++++++++++++++++++++++++ + 1 file changed, 30 insertions(+) + +diff --git a/client/dhclient.c b/client/dhclient.c +index ccc98e4..27fde69 100644 +--- a/client/dhclient.c ++++ b/client/dhclient.c +@@ -3171,6 +3171,14 @@ void send_request (cpp) #endif if (destination.sin_addr.s_addr != INADDR_BROADCAST && fallback_interface) { @@ -16,7 +29,7 @@ diff -up dhcp-4.3.4/client/dhclient.c.bind-iface dhcp-4.3.4/client/dhclient.c result = send_packet(fallback_interface, NULL, &client->packet, client->packet_length, from, &destination, NULL); -@@ -3032,6 +3040,13 @@ void send_request (cpp) +@@ -3180,6 +3188,13 @@ void send_request (cpp) client->packet_length, fallback_interface->name); } @@ -30,7 +43,7 @@ diff -up dhcp-4.3.4/client/dhclient.c.bind-iface dhcp-4.3.4/client/dhclient.c } else { /* Send out a packet. */ -@@ -3144,6 +3159,14 @@ void send_release (cpp) +@@ -3297,6 +3312,14 @@ void send_release (cpp) } else #endif if (fallback_interface) { @@ -45,7 +58,7 @@ diff -up dhcp-4.3.4/client/dhclient.c.bind-iface dhcp-4.3.4/client/dhclient.c result = send_packet(fallback_interface, NULL, &client->packet, client->packet_length, from, &destination, NULL); -@@ -3153,6 +3176,13 @@ void send_release (cpp) +@@ -3306,6 +3329,13 @@ void send_release (cpp) client->packet_length, fallback_interface->name); } @@ -59,3 +72,6 @@ diff -up dhcp-4.3.4/client/dhclient.c.bind-iface dhcp-4.3.4/client/dhclient.c } else { /* Send out a packet. */ result = send_packet(client->interface, NULL, &client->packet, +-- +2.14.5 + diff --git a/dhcp-no-subnet-error2info.patch b/0018-No-subnet-declaration-for-iface-should-be-info-not-e.patch similarity index 70% rename from dhcp-no-subnet-error2info.patch rename to 0018-No-subnet-declaration-for-iface-should-be-info-not-e.patch index 975a4d4090881e47fae9e650ce808fd55d5a6a8f..2ff4030ef999d708f5a81639daf730526a57bef4 100644 --- a/dhcp-no-subnet-error2info.patch +++ b/0018-No-subnet-declaration-for-iface-should-be-info-not-e.patch @@ -1,7 +1,19 @@ -diff -up dhcp-4.3.0a1/common/discover.c.error2info dhcp-4.3.0a1/common/discover.c ---- dhcp-4.3.0a1/common/discover.c.error2info 2013-12-20 13:59:15.148553898 +0100 -+++ dhcp-4.3.0a1/common/discover.c 2013-12-20 13:59:15.181553438 +0100 -@@ -779,9 +779,9 @@ discover_interfaces(int state) { +From 2277d041692b8ebdf6b86d41e3a0bc0381cd1e47 Mon Sep 17 00:00:00 2001 +From: Pavel Zhukov +Date: Thu, 21 Feb 2019 10:40:51 +0100 +Subject: [PATCH 18/26] No subnet declaration for ' should be info, not + error. +Cc: pzhukov@redhat.com + +--- + common/discover.c | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +diff --git a/common/discover.c b/common/discover.c +index 65881fc..056342c 100644 +--- a/common/discover.c ++++ b/common/discover.c +@@ -801,9 +801,9 @@ discover_interfaces(int state) { /* We must have a subnet declaration for each interface. */ if (!tmp->shared_network && (state == DISCOVER_SERVER)) { @@ -13,7 +25,7 @@ diff -up dhcp-4.3.0a1/common/discover.c.error2info dhcp-4.3.0a1/common/discover. tmp->name, (tmp->addresses == NULL) ? "no IPv4 addresses" : -@@ -796,26 +796,26 @@ discover_interfaces(int state) { +@@ -818,26 +818,26 @@ discover_interfaces(int state) { } else { strcpy(abuf, "no IPv6 addresses"); } @@ -46,3 +58,6 @@ diff -up dhcp-4.3.0a1/common/discover.c.error2info dhcp-4.3.0a1/common/discover. goto next; } else { log_error ("You must write a %s", +-- +2.14.5 + diff --git a/0019-dhclient-write-DUID_LLT-even-in-stateless-mode-11563.patch b/0019-dhclient-write-DUID_LLT-even-in-stateless-mode-11563.patch new file mode 100644 index 0000000000000000000000000000000000000000..3405ea13bd5a038601bf50806451d2fa6c4ac0ce --- /dev/null +++ b/0019-dhclient-write-DUID_LLT-even-in-stateless-mode-11563.patch @@ -0,0 +1,29 @@ +From 6ea56e988df1da51f7d0bdd8984b38e40102c17b Mon Sep 17 00:00:00 2001 +From: Pavel Zhukov +Date: Thu, 21 Feb 2019 10:41:14 +0100 +Subject: [PATCH 19/26] dhclient: write DUID_LLT even in stateless mode + (#1156356) +Cc: pzhukov@redhat.com + +(Submitted to dhcp-bugs@isc.org - [ISC-Bugs #38144]) +--- + client/dhclient.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/client/dhclient.c b/client/dhclient.c +index 27fde69..4e5546a 100644 +--- a/client/dhclient.c ++++ b/client/dhclient.c +@@ -1442,6 +1442,9 @@ void run_stateless(int exit_mode, u_int16_t port) + data_string_forget(&default_duid, MDL); + + form_duid(&default_duid, MDL); ++ if (form_duid(&default_duid, MDL) == ISC_R_SUCCESS && ++ duid_type == DUID_LLT) ++ write_duid(&default_duid); + } + + #ifdef DHCP4o6 +-- +2.14.5 + diff --git a/dhcp-iface_hwaddr_discovery.patch b/0020-Discover-all-hwaddress-for-xid-uniqueness.patch similarity index 71% rename from dhcp-iface_hwaddr_discovery.patch rename to 0020-Discover-all-hwaddress-for-xid-uniqueness.patch index 2cd1d8ad72e3e7ecba871e990af3a071cf5bec54..c838d7ac9ba919c23bfad7a69085c3cfb0d0c49b 100644 --- a/dhcp-iface_hwaddr_discovery.patch +++ b/0020-Discover-all-hwaddress-for-xid-uniqueness.patch @@ -1,8 +1,20 @@ +From 01ce61b8a0331a2f068ca2191bfb897b505c1b9d Mon Sep 17 00:00:00 2001 +From: Pavel Zhukov +Date: Thu, 21 Feb 2019 10:42:50 +0100 +Subject: [PATCH 20/26] Discover all hwaddress for xid uniqueness +Cc: pzhukov@redhat.com + +--- + common/discover.c | 2 ++ + common/lpf.c | 27 ++++++++++++++++++++++----- + includes/dhcpd.h | 3 +++ + 3 files changed, 27 insertions(+), 5 deletions(-) + diff --git a/common/discover.c b/common/discover.c -index 26a78ca..ed01e45 100644 +index 056342c..e66e1c5 100644 --- a/common/discover.c +++ b/common/discover.c -@@ -635,6 +635,8 @@ discover_interfaces(int state) { +@@ -648,6 +648,8 @@ discover_interfaces(int state) { interface_dereference(&tmp, MDL); tmp = interfaces; /* XXX */ } @@ -12,10 +24,10 @@ index 26a78ca..ed01e45 100644 if (dhcp_interface_discovery_hook) { (*dhcp_interface_discovery_hook)(tmp); diff --git a/common/lpf.c b/common/lpf.c -index 4a252ca..467b055 100644 +index b732a86..a708a5d 100644 --- a/common/lpf.c +++ b/common/lpf.c -@@ -697,8 +697,22 @@ ioctl_get_ll(char *name) +@@ -699,8 +699,22 @@ ioctl_get_ll(char *name) return sll; } @@ -38,7 +50,7 @@ index 4a252ca..467b055 100644 { struct hardware *hw = &info->hw_address; char *name = info->name; -@@ -708,7 +722,8 @@ get_hw_addr(struct interface_info *info) +@@ -710,7 +724,8 @@ get_hw_addr(struct interface_info *info) int sll_allocated = 0; char *dup = NULL; char *colon = NULL; @@ -48,7 +60,7 @@ index 4a252ca..467b055 100644 if (getifaddrs(&ifaddrs) == -1) log_fatal("Failed to get interfaces"); -@@ -792,14 +807,16 @@ get_hw_addr(struct interface_info *info) +@@ -794,14 +809,16 @@ get_hw_addr(struct interface_info *info) hw->hbuf[4] = 0xef; break; #endif @@ -70,10 +82,10 @@ index 4a252ca..467b055 100644 } #endif diff --git a/includes/dhcpd.h b/includes/dhcpd.h -index d534f8c..66a21fb 100644 +index 0c1a0aa..635c510 100644 --- a/includes/dhcpd.h +++ b/includes/dhcpd.h -@@ -2591,7 +2591,10 @@ void print_dns_status (int, struct dhcp_ddns_cb *, isc_result_t); +@@ -2637,7 +2637,10 @@ void print_dns_status (int, struct dhcp_ddns_cb *, isc_result_t); #endif const char *print_time(TIME); @@ -84,3 +96,6 @@ index d534f8c..66a21fb 100644 char *buf_to_hex (const unsigned char *s, unsigned len, const char *file, int line); char *format_lease_id(const unsigned char *s, unsigned len, int format, +-- +2.14.5 + diff --git a/0021-Load-leases-DB-in-non-replay-mode-only.patch b/0021-Load-leases-DB-in-non-replay-mode-only.patch new file mode 100644 index 0000000000000000000000000000000000000000..d3989183b69686a0ff937e02fc94eabaa7852217 --- /dev/null +++ b/0021-Load-leases-DB-in-non-replay-mode-only.patch @@ -0,0 +1,50 @@ +commit 50c2b3ba8ce030a47b55dd707bb8a6ab20444a05 +Author: Pavel Zhukov +Date: Thu Feb 21 10:44:06 2019 +0100 + + Load leases DB in non-replay mode only + +diff --git a/server/confpars.c b/server/confpars.c +index 2743979..6b61964 100644 +--- a/server/confpars.c ++++ b/server/confpars.c +@@ -134,6 +134,11 @@ isc_result_t read_conf_file (const char *filename, struct group *group, + + cfile = (struct parse *)0; + #if defined (TRACING) ++ // No need to dmalloc huge memory region if we're not going to re-play ++ if (!trace_record()){ ++ status = new_parse(&cfile, file, NULL, 0, filename, 0); ++ goto noreplay; ++ }; + flen = lseek (file, (off_t)0, SEEK_END); + if (flen < 0) { + boom: +@@ -165,7 +170,6 @@ isc_result_t read_conf_file (const char *filename, struct group *group, + if (result != ulen) + log_fatal ("%s: short read of %d bytes instead of %d.", + filename, ulen, result); +- close (file); + memfile: + /* If we're recording, write out the filename and file contents. */ + if (trace_record ()) +@@ -174,6 +178,9 @@ isc_result_t read_conf_file (const char *filename, struct group *group, + #else + status = new_parse(&cfile, file, NULL, 0, filename, 0); + #endif ++ noreplay: ++ if (!trace_playback()) ++ close (file); + if (status != ISC_R_SUCCESS || cfile == NULL) + return status; + +@@ -183,7 +190,8 @@ isc_result_t read_conf_file (const char *filename, struct group *group, + status = conf_file_subparse (cfile, group, group_type); + end_parse (&cfile); + #if defined (TRACING) +- dfree (dbuf, MDL); ++ if (trace_record()) ++ dfree (dbuf, MDL); + #endif + return status; + } diff --git a/dhcp-dhclient-preinit6s.patch b/0022-dhclient-make-sure-link-local-address-is-ready-in-st.patch similarity index 67% rename from dhcp-dhclient-preinit6s.patch rename to 0022-dhclient-make-sure-link-local-address-is-ready-in-st.patch index 0ce1cf827555311999bdd8e1bffcf065a7fcf110..85ea650688ca5a4f7c7fe36ad21e7d618f43abc6 100644 --- a/dhcp-dhclient-preinit6s.patch +++ b/0022-dhclient-make-sure-link-local-address-is-ready-in-st.patch @@ -1,7 +1,20 @@ -diff -up dhcp-4.3.4/client/dhclient.c.preinit6s dhcp-4.3.4/client/dhclient.c ---- dhcp-4.3.4/client/dhclient.c.preinit6s 2016-04-29 13:15:10.361379493 +0200 -+++ dhcp-4.3.4/client/dhclient.c 2016-04-29 13:17:43.622415423 +0200 -@@ -812,6 +812,12 @@ main(int argc, char **argv) { +From 9975d198a2c02e32c31c3e0f43d2aa79dfa7f508 Mon Sep 17 00:00:00 2001 +From: Pavel Zhukov +Date: Thu, 28 Feb 2019 15:30:21 +0100 +Subject: [PATCH 22/26] dhclient: make sure link-local address is ready in + stateless mode +Cc: pzhukov@redhat.com + +Bug-url: https://bugzilla.redhat.com/1263466 +--- + client/dhclient.c | 30 ++++++++++++++++++++---------- + 1 file changed, 20 insertions(+), 10 deletions(-) + +diff --git a/client/dhclient.c b/client/dhclient.c +index 4e5546a..9b65438 100644 +--- a/client/dhclient.c ++++ b/client/dhclient.c +@@ -937,6 +937,12 @@ main(int argc, char **argv) { inaddr_any.s_addr = INADDR_ANY; @@ -14,8 +27,8 @@ diff -up dhcp-4.3.4/client/dhclient.c.preinit6s dhcp-4.3.4/client/dhclient.c /* Stateless special case. */ if (stateless) { if (release_mode || (wanted_ia_na > 0) || -@@ -828,12 +834,6 @@ main(int argc, char **argv) { - return 0; +@@ -953,12 +959,6 @@ main(int argc, char **argv) { + finish(0); } - /* Discover all the network interfaces. */ @@ -27,7 +40,7 @@ diff -up dhcp-4.3.4/client/dhclient.c.preinit6s dhcp-4.3.4/client/dhclient.c /* Parse any extra command line configuration arguments: */ if ((dhcp_client_identifier_arg != NULL) && (*dhcp_client_identifier_arg != '\0')) { arg_conf_len = asprintf(&arg_conf, "send dhcp-client-identifier \"%s\";", dhcp_client_identifier_arg); -@@ -1288,20 +1288,30 @@ void run_stateless(int exit_mode, u_int1 +@@ -1413,20 +1413,30 @@ void run_stateless(int exit_mode, u_int16_t port) IGNORE_UNUSED(port); #endif @@ -62,3 +75,6 @@ diff -up dhcp-4.3.4/client/dhclient.c.preinit6s dhcp-4.3.4/client/dhclient.c /* Parse the lease database. */ read_client_leases(); +-- +2.14.5 + diff --git a/dhcp-option97-pxe-client-id.patch b/0023-option-97-pxe-client-id.patch similarity index 69% rename from dhcp-option97-pxe-client-id.patch rename to 0023-option-97-pxe-client-id.patch index fac2ace5a2e435db7af27bf5b883eabc8522b0fe..6cc432893f8905efc0662a730684f0acedc95142 100644 --- a/dhcp-option97-pxe-client-id.patch +++ b/0023-option-97-pxe-client-id.patch @@ -1,7 +1,27 @@ -diff -up dhcp-4.3.5b1/common/options.c.option97 dhcp-4.3.5b1/common/options.c ---- dhcp-4.3.5b1/common/options.c.option97 2016-09-12 17:17:13.972691041 +0200 -+++ dhcp-4.3.5b1/common/options.c 2016-09-12 17:19:17.706790276 +0200 -@@ -4434,13 +4434,26 @@ int validate_packet(struct packet *packe +From 6fd7894ea57791c8eee16c21d19da34b909e016e Mon Sep 17 00:00:00 2001 +From: Pavel Zhukov +Date: Thu, 28 Feb 2019 16:40:38 +0100 +Subject: [PATCH 23/26] option 97 - pxe-client-id +Cc: pzhukov@redhat.com + +Bug-url: https://bugzilla.redhat.com/1058674 +ISC-Bugs #38110 +--- + common/options.c | 27 ++++++++++++++++++++------- + common/tables.c | 3 ++- + includes/dhcp.h | 1 + + server/dhcp.c | 19 +++++++++++++++++++ + server/dhcpd.conf.5 | 9 ++++++--- + server/dhcpleasequery.c | 18 +++++++++++++++--- + server/failover.c | 3 +++ + server/mdb.c | 5 +++-- + 8 files changed, 69 insertions(+), 16 deletions(-) + +diff --git a/common/options.c b/common/options.c +index 3034cf0..686dd12 100644 +--- a/common/options.c ++++ b/common/options.c +@@ -4465,13 +4465,26 @@ int validate_packet(struct packet *packet) "a future version of ISC DHCP will reject this"); } } else { @@ -35,12 +55,13 @@ diff -up dhcp-4.3.5b1/common/options.c.option97 dhcp-4.3.5b1/common/options.c } } -diff -up dhcp-4.3.5b1/common/tables.c.option97 dhcp-4.3.5b1/common/tables.c ---- dhcp-4.3.5b1/common/tables.c.option97 2016-09-12 17:17:13.927691005 +0200 -+++ dhcp-4.3.5b1/common/tables.c 2016-09-12 17:17:13.972691041 +0200 +diff --git a/common/tables.c b/common/tables.c +index f1be07d..4419220 100644 +--- a/common/tables.c ++++ b/common/tables.c @@ -196,8 +196,9 @@ static struct option dhcp_options[] = { /* Defined by RFC 4578 */ - { "pxe-system-type", "S", &dhcp_universe, 93, 1 }, + { "pxe-system-type", "Sa", &dhcp_universe, 93, 1 }, { "pxe-interface-id", "BBB", &dhcp_universe, 94, 1 }, - { "pxe-client-id", "BX", &dhcp_universe, 97, 1 }, #endif @@ -49,10 +70,11 @@ diff -up dhcp-4.3.5b1/common/tables.c.option97 dhcp-4.3.5b1/common/tables.c { "uap-servers", "t", &dhcp_universe, 98, 1 }, #if defined(RFC4776_OPTIONS) { "geoconf-civic", "X", &dhcp_universe, 99, 1 }, -diff -up dhcp-4.3.5b1/includes/dhcp.h.option97 dhcp-4.3.5b1/includes/dhcp.h ---- dhcp-4.3.5b1/includes/dhcp.h.option97 2016-09-12 17:17:13.936691013 +0200 -+++ dhcp-4.3.5b1/includes/dhcp.h 2016-09-12 17:17:13.972691041 +0200 -@@ -159,6 +159,7 @@ struct dhcp_packet { +diff --git a/includes/dhcp.h b/includes/dhcp.h +index 4cc547a..4eb9791 100644 +--- a/includes/dhcp.h ++++ b/includes/dhcp.h +@@ -158,6 +158,7 @@ struct dhcp_packet { #define DHO_AUTHENTICATE 90 /* RFC3118, was 210 */ #define DHO_CLIENT_LAST_TRANSACTION_TIME 91 #define DHO_ASSOCIATED_IP 92 @@ -60,21 +82,22 @@ diff -up dhcp-4.3.5b1/includes/dhcp.h.option97 dhcp-4.3.5b1/includes/dhcp.h #define DHO_SUBNET_SELECTION 118 /* RFC3011! */ #define DHO_DOMAIN_SEARCH 119 /* RFC3397 */ #define DHO_CLASSLESS_STATIC_ROUTES 121 /* RFC3442 */ -diff -up dhcp-4.3.5b1/server/dhcp.c.option97 dhcp-4.3.5b1/server/dhcp.c ---- dhcp-4.3.5b1/server/dhcp.c.option97 2016-09-12 17:17:13.947691021 +0200 -+++ dhcp-4.3.5b1/server/dhcp.c 2016-09-12 17:17:13.973691042 +0200 -@@ -221,6 +221,10 @@ dhcp (struct packet *packet) { +diff --git a/server/dhcp.c b/server/dhcp.c +index 0582c4c..4e86262 100644 +--- a/server/dhcp.c ++++ b/server/dhcp.c +@@ -222,6 +222,10 @@ dhcp (struct packet *packet) { + if (lease -> uid_len) { oc = lookup_option (&dhcp_universe, packet -> options, DHO_DHCP_CLIENT_IDENTIFIER); - if (!oc) ++ if (!oc) + oc = lookup_option (&dhcp_universe, + packet -> options, + DHO_PXE_CLIENT_ID); -+ if (!oc) + if (!oc) goto nolease; - memset (&data, 0, sizeof data); -@@ -818,6 +822,9 @@ void dhcprelease (packet, ms_nulltp) +@@ -820,6 +824,9 @@ void dhcprelease (packet, ms_nulltp) oc = lookup_option (&dhcp_universe, packet -> options, DHO_DHCP_CLIENT_IDENTIFIER); @@ -84,7 +107,7 @@ diff -up dhcp-4.3.5b1/server/dhcp.c.option97 dhcp-4.3.5b1/server/dhcp.c memset (&data, 0, sizeof data); if (oc && evaluate_option_cache (&data, packet, (struct lease *)0, -@@ -1286,6 +1293,9 @@ void dhcpinform (packet, ms_nulltp) +@@ -1331,6 +1338,9 @@ void dhcpinform (packet, ms_nulltp) */ oc = lookup_option(&dhcp_universe, packet->options, DHO_DHCP_CLIENT_IDENTIFIER); @@ -94,7 +117,7 @@ diff -up dhcp-4.3.5b1/server/dhcp.c.option97 dhcp-4.3.5b1/server/dhcp.c memset(&d1, 0, sizeof(d1)); if (oc && evaluate_option_cache(&d1, packet, NULL, NULL, -@@ -2381,6 +2391,9 @@ void ack_lease (packet, lease, offer, wh +@@ -2441,6 +2451,9 @@ void ack_lease (packet, lease, offer, when, msg, ms_nulltp, hp) can be used. */ oc = lookup_option (&dhcp_universe, packet -> options, DHO_DHCP_CLIENT_IDENTIFIER); @@ -104,7 +127,7 @@ diff -up dhcp-4.3.5b1/server/dhcp.c.option97 dhcp-4.3.5b1/server/dhcp.c if (oc && evaluate_option_cache (&d1, packet, lease, (struct client_state *)0, -@@ -2962,6 +2975,9 @@ void ack_lease (packet, lease, offer, wh +@@ -3033,6 +3046,9 @@ void ack_lease (packet, lease, offer, when, msg, ms_nulltp, hp) /* Record the uid, if given... */ oc = lookup_option (&dhcp_universe, packet -> options, DHO_DHCP_CLIENT_IDENTIFIER); @@ -114,7 +137,7 @@ diff -up dhcp-4.3.5b1/server/dhcp.c.option97 dhcp-4.3.5b1/server/dhcp.c if (oc && evaluate_option_cache(&d1, packet, lease, NULL, packet->options, state->options, -@@ -4068,6 +4084,9 @@ int find_lease (struct lease **lp, +@@ -4150,6 +4166,9 @@ int find_lease (struct lease **lp, specified unique client identifier. */ oc = lookup_option (&dhcp_universe, packet -> options, DHO_DHCP_CLIENT_IDENTIFIER); @@ -124,10 +147,11 @@ diff -up dhcp-4.3.5b1/server/dhcp.c.option97 dhcp-4.3.5b1/server/dhcp.c memset (&client_identifier, 0, sizeof client_identifier); if (oc && evaluate_option_cache (&client_identifier, -diff -up dhcp-4.3.5b1/server/dhcpd.conf.5.option97 dhcp-4.3.5b1/server/dhcpd.conf.5 ---- dhcp-4.3.5b1/server/dhcpd.conf.5.option97 2016-09-12 17:17:13.885690972 +0200 -+++ dhcp-4.3.5b1/server/dhcpd.conf.5 2016-09-12 17:17:13.974691043 +0200 -@@ -1587,10 +1587,12 @@ should be a name identifying the host. +diff --git a/server/dhcpd.conf.5 b/server/dhcpd.conf.5 +index 89b5540..4751a8b 100644 +--- a/server/dhcpd.conf.5 ++++ b/server/dhcpd.conf.5 +@@ -1664,10 +1664,12 @@ should be a name identifying the host. If a \fIhostname\fR option is not specified for the host, \fIhostname\fR is used. .PP \fIHost\fR declarations are matched to actual DHCP or BOOTP clients @@ -142,7 +166,7 @@ diff -up dhcp-4.3.5b1/server/dhcpd.conf.5.option97 dhcp-4.3.5b1/server/dhcpd.con parameter in the \fIhost\fR declaration to the network hardware address supplied by the client. BOOTP clients do not normally provide a \fIdhcp-client-identifier\fR, so the hardware address must -@@ -1602,7 +1604,8 @@ to identify hosts. +@@ -1679,7 +1681,8 @@ to identify hosts. .PP Please be aware that .B only @@ -152,10 +176,11 @@ diff -up dhcp-4.3.5b1/server/dhcpd.conf.5.option97 dhcp-4.3.5b1/server/dhcpd.con used to match a host declaration, or the \fIhost-identifier option\fR parameter for DHCPv6 servers. For example, it is not possible to match a host declaration to a \fIhost-name\fR option. This is -diff -up dhcp-4.3.5b1/server/dhcpleasequery.c.option97 dhcp-4.3.5b1/server/dhcpleasequery.c ---- dhcp-4.3.5b1/server/dhcpleasequery.c.option97 2016-08-26 20:19:53.000000000 +0200 -+++ dhcp-4.3.5b1/server/dhcpleasequery.c 2016-09-12 17:17:13.974691043 +0200 -@@ -273,7 +273,7 @@ dhcpleasequery(struct packet *packet, in +diff --git a/server/dhcpleasequery.c b/server/dhcpleasequery.c +index 7be0788..2fee698 100644 +--- a/server/dhcpleasequery.c ++++ b/server/dhcpleasequery.c +@@ -276,7 +276,7 @@ dhcpleasequery(struct packet *packet, int ms_nulltp) { */ memset(&uid, 0, sizeof(uid)); @@ -164,7 +189,7 @@ diff -up dhcp-4.3.5b1/server/dhcpleasequery.c.option97 dhcp-4.3.5b1/server/dhcpl &dhcp_universe, packet, NULL, -@@ -283,8 +283,20 @@ dhcpleasequery(struct packet *packet, in +@@ -286,8 +286,20 @@ dhcpleasequery(struct packet *packet, int ms_nulltp) { packet->options, &global_scope, DHO_DHCP_CLIENT_IDENTIFIER, @@ -187,10 +212,11 @@ diff -up dhcp-4.3.5b1/server/dhcpleasequery.c.option97 dhcp-4.3.5b1/server/dhcpl snprintf(dbg_info, sizeof(dbg_info), "client-id %s", -diff -up dhcp-4.3.5b1/server/failover.c.option97 dhcp-4.3.5b1/server/failover.c ---- dhcp-4.3.5b1/server/failover.c.option97 2016-08-26 20:19:53.000000000 +0200 -+++ dhcp-4.3.5b1/server/failover.c 2016-09-12 17:17:13.975691044 +0200 -@@ -5957,6 +5957,9 @@ int load_balance_mine (struct packet *pa +diff --git a/server/failover.c b/server/failover.c +index 72f7b00..40fa691 100644 +--- a/server/failover.c ++++ b/server/failover.c +@@ -5988,6 +5988,9 @@ int load_balance_mine (struct packet *packet, dhcp_failover_state_t *state) oc = lookup_option(&dhcp_universe, packet->options, DHO_DHCP_CLIENT_IDENTIFIER); @@ -200,10 +226,11 @@ diff -up dhcp-4.3.5b1/server/failover.c.option97 dhcp-4.3.5b1/server/failover.c memset(&ds, 0, sizeof ds); if (oc && evaluate_option_cache(&ds, packet, NULL, NULL, -diff -up dhcp-4.3.5b1/server/mdb.c.option97 dhcp-4.3.5b1/server/mdb.c ---- dhcp-4.3.5b1/server/mdb.c.option97 2016-08-26 20:19:53.000000000 +0200 -+++ dhcp-4.3.5b1/server/mdb.c 2016-09-12 17:17:13.975691044 +0200 -@@ -129,8 +129,9 @@ static int find_uid_statement (struct ex +diff --git a/server/mdb.c b/server/mdb.c +index 052df67..8851366 100644 +--- a/server/mdb.c ++++ b/server/mdb.c +@@ -129,8 +129,9 @@ static int find_uid_statement (struct executable_statement *esp, esp -> data.option && (esp -> data.option -> option -> universe == &dhcp_universe) && @@ -215,3 +242,6 @@ diff -up dhcp-4.3.5b1/server/mdb.c.option97 dhcp-4.3.5b1/server/mdb.c if (condp) { log_error ("dhcp client identifier may not be %s", "specified conditionally."); +-- +2.14.5 + diff --git a/0024-Detect-system-time-changes.patch b/0024-Detect-system-time-changes.patch new file mode 100644 index 0000000000000000000000000000000000000000..cf38d0d7239888a81423fb58e594750d42abd55b --- /dev/null +++ b/0024-Detect-system-time-changes.patch @@ -0,0 +1,93 @@ +From 41c6032ace65119e6a400365f7e90283c930afd4 Mon Sep 17 00:00:00 2001 +From: Pavel Zhukov +Date: Tue, 22 Oct 2019 16:23:01 +0200 +Subject: [PATCH 24/26] Detect system time changes +Cc: pzhukov@redhat.com + +--- + client/dhclient.c | 6 ++++++ + common/dispatch.c | 11 ++++++++++- + includes/dhcpd.h | 3 ++- + server/dhcpd.c | 6 ++++++ + 4 files changed, 24 insertions(+), 2 deletions(-) + +diff --git a/client/dhclient.c b/client/dhclient.c +index 9b65438..44d508a 100644 +--- a/client/dhclient.c ++++ b/client/dhclient.c +@@ -5408,6 +5408,12 @@ isc_result_t dhcp_set_control_state (control_object_state_t oldstate, + case server_awaken: + state_reboot (client); + break; ++ ++ case server_time_changed: ++ if (client->active){ ++ state_reboot (client); ++ } ++ break; + } + } + } +diff --git a/common/dispatch.c b/common/dispatch.c +index d7fe200..8a24499 100644 +--- a/common/dispatch.c ++++ b/common/dispatch.c +@@ -118,7 +118,6 @@ dispatch(void) + * signal. It will return ISC_R_RELOAD in that + * case. That is a normal behavior. + */ +- + if (status == ISC_R_RELOAD) { + /* + * dhcp_set_control_state() will do the job. +@@ -129,6 +128,16 @@ dispatch(void) + if (status == ISC_R_SUCCESS) + status = ISC_R_RELOAD; + } ++ ++ ++ if (status == ISC_R_TIMESHIFTED){ ++ status = dhcp_set_control_state(server_time_changed, ++ server_time_changed); ++ status = ISC_R_RELOAD; ++ log_info ("System time has been changed. Unable to use existing leases. Restarting"); ++ // do nothing, restart context ++ }; ++ + } while (status == ISC_R_RELOAD); + + log_fatal ("Dispatch routine failed: %s -- exiting", +diff --git a/includes/dhcpd.h b/includes/dhcpd.h +index 635c510..ec6c227 100644 +--- a/includes/dhcpd.h ++++ b/includes/dhcpd.h +@@ -524,7 +524,8 @@ typedef enum { + server_running = 1, + server_shutdown = 2, + server_hibernate = 3, +- server_awaken = 4 ++ server_awaken = 4, ++ server_time_changed = 5 + } control_object_state_t; + + typedef struct { +diff --git a/server/dhcpd.c b/server/dhcpd.c +index 530a923..4aef16b 100644 +--- a/server/dhcpd.c ++++ b/server/dhcpd.c +@@ -1767,6 +1767,12 @@ isc_result_t dhcp_set_control_state (control_object_state_t oldstate, + { + struct timeval tv; + ++ if (newstate == server_time_changed){ ++ log_error ("System time has been changed. Leases information unreliable!"); ++ return ISC_R_SUCCESS; ++ } ++ ++ + if (newstate != server_shutdown) + return DHCP_R_INVALIDARG; + /* Re-entry. */ +-- +2.14.5 + diff --git a/0025-bind-Detect-system-time-changes.patch b/0025-bind-Detect-system-time-changes.patch new file mode 100644 index 0000000000000000000000000000000000000000..80191b26c90e6fa1d7e5412605da18c75985f0a6 --- /dev/null +++ b/0025-bind-Detect-system-time-changes.patch @@ -0,0 +1,197 @@ +From ef4f5e80d8a1ea1507829ea6f5214f276478f475 Mon Sep 17 00:00:00 2001 +From: Pavel Zhukov +Date: Tue, 22 Oct 2019 16:23:24 +0200 +Subject: [PATCH 25/27] bind: Detect system time changes +Cc: pzhukov@redhat.com + +--- + bind/bind/lib/isc/include/isc/result.h | 4 ++- + bind/bind/lib/isc/include/isc/util.h | 4 +++ + bind/bind/lib/isc/result.c | 2 ++ + bind/bind/lib/isc/unix/app.c | 41 ++++++++++++++++++++++++++++--- + bind/bind/lib/isc/unix/include/isc/time.h | 20 +++++++++++++++ + bind/bind/lib/isc/unix/time.c | 22 +++++++++++++++++ + 6 files changed, 89 insertions(+), 4 deletions(-) + +diff --git a/bind/bind/lib/isc/include/isc/result.h b/bind/bind/lib/isc/include/isc/result.h +index 0389efa..0e35f98 100644 +--- a/bind/bind/lib/isc/include/isc/result.h ++++ b/bind/bind/lib/isc/include/isc/result.h +@@ -89,7 +89,9 @@ + #define ISC_R_DISCFULL 67 /*%< disc full */ + #define ISC_R_DEFAULT 68 /*%< default */ + #define ISC_R_IPV4PREFIX 69 /*%< IPv4 prefix */ +-#define ISC_R_NRESULTS 70 ++#define ISC_R_TIMESHIFTED 70 /*%< system time changed */ ++/*% Not a result code: the number of results. */ ++#define ISC_R_NRESULTS 71 + + ISC_LANG_BEGINDECLS + +diff --git a/bind/bind/lib/isc/include/isc/util.h b/bind/bind/lib/isc/include/isc/util.h +index 973c348..cceeb5e 100644 +--- a/bind/bind/lib/isc/include/isc/util.h ++++ b/bind/bind/lib/isc/include/isc/util.h +@@ -289,6 +289,10 @@ extern void mock_assert(const int result, const char* const expression, + * Time + */ + #define TIME_NOW(tp) RUNTIME_CHECK(isc_time_now((tp)) == ISC_R_SUCCESS) ++#ifdef CLOCK_BOOTTIME ++#define TIME_MONOTONIC(tp) RUNTIME_CHECK(isc_time_boottime((tp)) == ISC_R_SUCCESS) ++#endif ++ + + /*% + * Alignment +diff --git a/bind/bind/lib/isc/result.c b/bind/bind/lib/isc/result.c +index a9db132..7c04831 100644 +--- a/bind/bind/lib/isc/result.c ++++ b/bind/bind/lib/isc/result.c +@@ -105,6 +105,7 @@ static const char *description[ISC_R_NRESULTS] = { + "disc full", /*%< 67 */ + "default", /*%< 68 */ + "IPv4 prefix", /*%< 69 */ ++ "time changed", /*%< 70 */ + }; + + static const char *identifier[ISC_R_NRESULTS] = { +@@ -178,6 +179,7 @@ static const char *identifier[ISC_R_NRESULTS] = { + "ISC_R_DISCFULL", + "ISC_R_DEFAULT", + "ISC_R_IPV4PREFIX", ++ "ISC_R_TIMESHIFTED", + }; + + #define ISC_RESULT_RESULTSET 2 +diff --git a/bind/bind/lib/isc/unix/app.c b/bind/bind/lib/isc/unix/app.c +index a6e9882..dbd23f7 100644 +--- a/bind/bind/lib/isc/unix/app.c ++++ b/bind/bind/lib/isc/unix/app.c +@@ -442,15 +442,51 @@ isc__app_ctxonrun(isc_appctx_t *ctx0, isc_mem_t *mctx, isc_task_t *task, + static isc_result_t + evloop(isc__appctx_t *ctx) { + isc_result_t result; ++ isc_time_t now; ++#ifdef CLOCK_BOOTTIME ++ isc_time_t monotonic; ++ uint64_t diff = 0; ++#else ++ isc_time_t prev; ++ TIME_NOW(&prev); ++#endif ++ ++ ++ + + while (!ctx->want_shutdown) { + int n; +- isc_time_t when, now; ++ isc_time_t when; ++ + struct timeval tv, *tvp; + isc_socketwait_t *swait; + bool readytasks; + bool call_timer_dispatch = false; + ++ uint64_t us; ++ ++#ifdef CLOCK_BOOTTIME ++ // TBD macros for following three lines ++ TIME_NOW(&now); ++ TIME_MONOTONIC(&monotonic); ++ INSIST(now.seconds > monotonic.seconds) ++ us = isc_time_microdiff (&now, &monotonic); ++ if (us < diff){ ++ us = diff - us; ++ if (us > 1000000){ // ignoring shifts less than one second ++ return ISC_R_TIMESHIFTED; ++ }; ++ diff = isc_time_microdiff (&now, &monotonic); ++ } else { ++ diff = isc_time_microdiff (&now, &monotonic); ++ // not implemented ++ } ++#else ++ TIME_NOW(&now); ++ if (isc_time_compare (&now, &prev) < 0) ++ return ISC_R_TIMESHIFTED; ++ TIME_NOW(&prev); ++#endif + /* + * Check the reload (or suspend) case first for exiting the + * loop as fast as possible in case: +@@ -475,9 +511,8 @@ evloop(isc__appctx_t *ctx) { + if (result != ISC_R_SUCCESS) + tvp = NULL; + else { +- uint64_t us; +- + TIME_NOW(&now); ++ + us = isc_time_microdiff(&when, &now); + if (us == 0) + call_timer_dispatch = true; +diff --git a/bind/bind/lib/isc/unix/include/isc/time.h b/bind/bind/lib/isc/unix/include/isc/time.h +index b864c29..5dd43c9 100644 +--- a/bind/bind/lib/isc/unix/include/isc/time.h ++++ b/bind/bind/lib/isc/unix/include/isc/time.h +@@ -132,6 +132,26 @@ isc_time_isepoch(const isc_time_t *t); + *\li 't' is a valid pointer. + */ + ++#ifdef CLOCK_BOOTTIME ++isc_result_t ++isc_time_boottime(isc_time_t *t); ++/*%< ++ * Set 't' to monotonic time from previous boot ++ * it's not affected by system time change. It also ++ * includes the time system was suspended ++ * ++ * Requires: ++ *\li 't' is a valid pointer. ++ * ++ * Returns: ++ * ++ *\li Success ++ *\li Unexpected error ++ * Getting the time from the system failed. ++ */ ++#endif /* CLOCK_BOOTTIME */ ++ ++ + isc_result_t + isc_time_now(isc_time_t *t); + /*%< +diff --git a/bind/bind/lib/isc/unix/time.c b/bind/bind/lib/isc/unix/time.c +index 8edc9df..fe0bb91 100644 +--- a/bind/bind/lib/isc/unix/time.c ++++ b/bind/bind/lib/isc/unix/time.c +@@ -498,3 +498,25 @@ isc_time_formatISO8601ms(const isc_time_t *t, char *buf, unsigned int len) { + t->nanoseconds / NS_PER_MS); + } + } ++ ++ ++#ifdef CLOCK_BOOTTIME ++isc_result_t ++isc_time_boottime(isc_time_t *t) { ++ struct timespec ts; ++ ++ char strbuf[ISC_STRERRORSIZE]; ++ ++ if (clock_gettime (CLOCK_BOOTTIME, &ts) != 0){ ++ isc__strerror(errno, strbuf, sizeof(strbuf)); ++ UNEXPECTED_ERROR(__FILE__, __LINE__, "%s", strbuf); ++ return (ISC_R_UNEXPECTED); ++ } ++ ++ t->seconds = ts.tv_sec; ++ t->nanoseconds = ts.tv_nsec; ++ ++ return (ISC_R_SUCCESS); ++ ++}; ++#endif +-- +2.14.5 + diff --git a/0026-Add-dhclient-5-B-option-description.patch b/0026-Add-dhclient-5-B-option-description.patch new file mode 100644 index 0000000000000000000000000000000000000000..7ddfacf55e0e115353f6c0434ea61b574fd29f60 --- /dev/null +++ b/0026-Add-dhclient-5-B-option-description.patch @@ -0,0 +1,24 @@ +commit 6acfd3125546a0e5db8fae8a9964cd2f88bf68c0 +Author: Pavel Zhukov +Date: Tue Oct 22 16:28:04 2019 +0200 + + Add dhclient(5) -B option description + + Bug-Url: https://bugzilla.redhat.com/1764088 + +diff --git a/client/dhclient.8 b/client/dhclient.8 +index 0145b9f..5226de5 100644 +--- a/client/dhclient.8 ++++ b/client/dhclient.8 +@@ -552,6 +552,11 @@ Path to the network configuration script invoked by + when it gets a lease. If unspecified, the default + .B CLIENTBINDIR/dhclient-script + is used. See \fBdhclient-script(8)\fR for a description of this file. ++.TP ++.BI \-B ++Always set the bootp broadcast flag in request packets, so that ++servers will always broadcast replies. This option is provided as ++an extension to enable dhclient to work on IBM s390 Linux guests. + .PP + .SH PORTS + During operations the client may use multiple UDP ports diff --git a/dhcp-sd_notify.patch b/0027-Add-missed-sd-notify-patch-to-manage-dhcpd-with-syst.patch similarity index 63% rename from dhcp-sd_notify.patch rename to 0027-Add-missed-sd-notify-patch-to-manage-dhcpd-with-syst.patch index a123923604e7115616a4c0cd8414ae733372e5b8..cde51de58b299d93e5bc148f7b7dd6985524f786 100644 --- a/dhcp-sd_notify.patch +++ b/0027-Add-missed-sd-notify-patch-to-manage-dhcpd-with-syst.patch @@ -1,7 +1,20 @@ -diff -up dhcp-4.3.4/configure.ac.sd_notify dhcp-4.3.4/configure.ac ---- dhcp-4.3.4/configure.ac.sd_notify 2016-04-29 13:08:52.813287060 +0200 -+++ dhcp-4.3.4/configure.ac 2016-04-29 13:08:52.872287075 +0200 -@@ -832,6 +832,17 @@ if test x$ldap = xyes || test x$ldapcryp +From 8d974fd1f667e1b957ad4092fe66a8bb94f5f8fd Mon Sep 17 00:00:00 2001 +From: Pavel Zhukov +Date: Thu, 7 Nov 2019 14:47:45 +0100 +Subject: [PATCH 1/1] Add missed sd notify patch to manage dhcpd with systemd +Cc: pzhukov@redhat.com + +--- + configure.ac | 11 +++++++++++ + relay/dhcrelay.c | 12 ++++++++++++ + server/dhcpd.c | 12 ++++++++++++ + 3 files changed, 35 insertions(+) + +diff --git a/configure.ac b/configure.ac +index 15fc0d7..0c08000 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -1014,6 +1014,17 @@ if test x$ldap = xyes || test x$ldapcrypto = xyes || test x$ldap_gssapi = xyes; AC_SUBST(LDAP_CFLAGS, [$LDAP_CFLAGS]) fi @@ -19,9 +32,10 @@ diff -up dhcp-4.3.4/configure.ac.sd_notify dhcp-4.3.4/configure.ac # Append selected warning levels to CFLAGS before substitution (but after # AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],[],[]) & etc). CFLAGS="$CFLAGS $STD_CWARNINGS" -diff -up dhcp-4.3.4/relay/dhcrelay.c.sd_notify dhcp-4.3.4/relay/dhcrelay.c ---- dhcp-4.3.4/relay/dhcrelay.c.sd_notify 2016-04-29 13:08:52.814287061 +0200 -+++ dhcp-4.3.4/relay/dhcrelay.c 2016-04-29 13:08:52.872287075 +0200 +diff --git a/relay/dhcrelay.c b/relay/dhcrelay.c +index 7b4f4f1..9eb5bfd 100644 +--- a/relay/dhcrelay.c ++++ b/relay/dhcrelay.c @@ -37,6 +37,10 @@ int keep_capabilities = 0; #endif @@ -33,7 +47,7 @@ diff -up dhcp-4.3.4/relay/dhcrelay.c.sd_notify dhcp-4.3.4/relay/dhcrelay.c TIME default_lease_time = 43200; /* 12 hours... */ TIME max_lease_time = 86400; /* 24 hours... */ struct tree_cache *global_options[256]; -@@ -709,6 +713,14 @@ main(int argc, char **argv) { +@@ -845,6 +849,14 @@ main(int argc, char **argv) { } #endif @@ -48,12 +62,13 @@ diff -up dhcp-4.3.4/relay/dhcrelay.c.sd_notify dhcp-4.3.4/relay/dhcrelay.c /* Start dispatching packets and timeouts... */ dispatch(); -diff -up dhcp-4.3.4/server/dhcpd.c.sd_notify dhcp-4.3.4/server/dhcpd.c ---- dhcp-4.3.4/server/dhcpd.c.sd_notify 2016-04-29 13:08:52.873287075 +0200 -+++ dhcp-4.3.4/server/dhcpd.c 2016-04-29 13:12:00.655333096 +0200 -@@ -57,6 +57,10 @@ uid_t set_uid = 0; - gid_t set_gid = 0; - #endif /* PARANOIA */ +diff --git a/server/dhcpd.c b/server/dhcpd.c +index 4aef16b..778ef8d 100644 +--- a/server/dhcpd.c ++++ b/server/dhcpd.c +@@ -60,6 +60,10 @@ gid_t set_gid = 0; + struct class unknown_class; + struct class known_class; +#ifdef HAVE_LIBSYSTEMD +#include @@ -62,7 +77,7 @@ diff -up dhcp-4.3.4/server/dhcpd.c.sd_notify dhcp-4.3.4/server/dhcpd.c struct iaddr server_identifier; int server_identifier_matched; -@@ -931,6 +935,14 @@ main(int argc, char **argv) { +@@ -1057,6 +1061,14 @@ main(int argc, char **argv) { /* Log that we are about to start working */ log_info("Server starting service."); @@ -77,3 +92,6 @@ diff -up dhcp-4.3.4/server/dhcpd.c.sd_notify dhcp-4.3.4/server/dhcpd.c /* * Receive packets and dispatch them... * dispatch() will never return. +-- +2.14.5 + diff --git a/12-dhcpd b/12-dhcpd deleted file mode 100644 index e75aa939eccae4f3f92057e87f44c61730deb092..0000000000000000000000000000000000000000 --- a/12-dhcpd +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash - -INTERFACE=$1 # The interface which is brought up or down -STATUS=$2 # The new state of the interface - -# whenever interface is brought up by NM (rhbz #565921) -if [ "$STATUS" = "up" ]; then - # wait a few seconds to allow interface startup to complete - # (important at boot time without this the service still fails - # time-out for dispatcher script is 3s (rhbz#1003695#8) - sleep 2 - # restart the services - # In case this dispatcher script is called several times in a short period of time, it might happen that - # systemd refuses to further restart the units. Therefore we use reset-failed command to prevent it. - systemctl -q is-enabled dhcpd.service && systemctl restart dhcpd.service && systemctl reset-failed dhcpd.service - systemctl -q is-enabled dhcpd6.service && systemctl restart dhcpd6.service && systemctl reset-failed dhcpd6.service -fi - -exit 0 diff --git a/CVE-2019-6470.patch b/CVE-2019-6470.patch deleted file mode 100644 index b431817fbb6b96508dca91099d38cb4584308e69..0000000000000000000000000000000000000000 --- a/CVE-2019-6470.patch +++ /dev/null @@ -1,218 +0,0 @@ -From abacf8ad0d8844685e5cd76645a34ef2b8da3253 Mon Sep 17 00:00:00 2001 -From: Thomas Markwalder -Date: Fri, 1 Dec 2017 09:13:26 -0500 -Subject: [PATCH] [master] Use 0 instead of -1 to indicate empty heap index - - Merges in rt46719. ---- - RELNOTES | 5 +++++ - includes/dhcpd.h | 5 +++-- - server/mdb6.c | 42 ++++++++++++++++++++++-------------------- - server/tests/mdb6_unittest.c | 9 +++++++-- - 4 files changed, 37 insertions(+), 24 deletions(-) - -#diff --git a/RELNOTES b/RELNOTES -#index ececd89e..b93af612 100644 -#--- a/RELNOTES -#+++ b/RELNOTES -#@@ -1176,6 +1176,11 @@ dhcp-users@lists.isc.org. -# in the lease file causing issues with DDNS and so forth. -# [ISC-bugs #43786] -# -#+- Replaced iasubopt::heap_index with separate values for active and inactive -#+ heaps: iasubopt::active_index and iasubopt::inactive_index. This was done -#+ to accomodate a change in behavior in BIND9 isc_heap_delete(). -#+ [ISC-bugs #46719] -#+ -# Changes since 4.2.0 (new features) -# -# - If a client renews before 'dhcp-cache-threshold' percent of its lease -Index: isc-dhcp-4.3.5/includes/dhcpd.h -=================================================================== ---- isc-dhcp-4.3.5.orig/includes/dhcpd.h 2019-05-06 08:57:34.738578132 -0400 -+++ isc-dhcp-4.3.5/includes/dhcpd.h 2019-05-06 08:57:34.734578119 -0400 -@@ -1624,8 +1624,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. -Index: isc-dhcp-4.3.5/server/mdb6.c -=================================================================== ---- isc-dhcp-4.3.5.orig/server/mdb6.c 2019-05-06 08:57:34.738578132 -0400 -+++ isc-dhcp-4.3.5/server/mdb6.c 2019-05-06 08:57:34.734578119 -0400 -@@ -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) { -Index: isc-dhcp-4.3.5/server/tests/mdb6_unittest.c -=================================================================== ---- isc-dhcp-4.3.5.orig/server/tests/mdb6_unittest.c 2019-05-06 08:57:34.738578132 -0400 -+++ isc-dhcp-4.3.5/server/tests/mdb6_unittest.c 2019-05-06 08:57:34.734578119 -0400 -@@ -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); diff --git a/Correct-BIND9-dns-API-call-constant.patch b/Correct-BIND9-dns-API-call-constant.patch deleted file mode 100644 index ded9b0833e107697b8aa6a7b989675a3715662df..0000000000000000000000000000000000000000 --- a/Correct-BIND9-dns-API-call-constant.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 63b155800d98d3d245147c7cfcf9053e574fedbf Mon Sep 17 00:00:00 2001 -From: Thomas Markwalder -Date: Wed, 26 Sep 2018 10:54:45 -0400 -Subject: [PATCH 2/2] Correct BIND9 dns API call constant - - Merges in rt47757 ---- - common/dns.c | 4 ++-- - 1 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/common/dns.c b/common/dns.c -index 18ad704..1646760 100644 ---- a/common/dns.c -+++ b/common/dns.c -@@ -2271,7 +2271,7 @@ ddns_modify_fwd(dhcp_ddns_cb_t *ddns_cb, const char *file, int line) - dns_rdataclass_in, zname, - &prereqlist, &updatelist, - zlist, tsec_key, -- DNS_CLIENTRESOPT_ALLOWRUN, -+ DNS_CLIENTUPDOPT_ALLOWRUN, - dhcp_gbl_ctx.task, - ddns_interlude, - (void *)ddns_cb, -@@ -2498,7 +2498,7 @@ ddns_modify_ptr(dhcp_ddns_cb_t *ddns_cb, const char *file, int line) - dns_rdataclass_in, zname, - NULL, &updatelist, - zlist, tsec_key, -- DNS_CLIENTRESOPT_ALLOWRUN, -+ DNS_CLIENTUPDOPT_ALLOWRUN, - dhcp_gbl_ctx.task, - ddns_interlude, (void *)ddns_cb, - &ddns_cb->transaction); --- -1.8.3.1 - diff --git a/Corrected-dhclient-command-line-parsing-of-dad-wait-.patch b/Corrected-dhclient-command-line-parsing-of-dad-wait-.patch deleted file mode 100644 index de5783a61eeadfb7ab9b7a2e24f4bbc06afb0818..0000000000000000000000000000000000000000 --- a/Corrected-dhclient-command-line-parsing-of-dad-wait-.patch +++ /dev/null @@ -1,27 +0,0 @@ -From cbe1a3e5e51beabaf0a8dad3b51d349bd900b076 Mon Sep 17 00:00:00 2001 -From: Thomas Markwalder -Date: Mon, 27 Nov 2017 13:30:27 -0500 -Subject: [PATCH 1/2] Corrected dhclient command line parsing of - --dad-wait-time - - Merges in rt46535 ---- - client/dhclient.c | 2 ++ - 1 files changed, 2 insertions(+) - -diff --git a/client/dhclient.c b/client/dhclient.c -index 057dec9..5d9538b 100644 ---- a/client/dhclient.c -+++ b/client/dhclient.c -@@ -446,6 +446,8 @@ main(int argc, char **argv) { - if (++i == argc) { - usage(use_noarg, argv[i-1]); - } -+ -+ errno = 0; - dad_wait_time = (int)strtol(argv[i], &s, 10); - if (errno || (*s != '\0') || (dad_wait_time < 0)) { - usage("Invalid value for --dad-wait-time: %s", argv[i]); --- -1.8.3.1 - diff --git a/adds-address-prefix-len-to-dhclient-cli.patch b/adds-address-prefix-len-to-dhclient-cli.patch deleted file mode 100644 index bd786cbea95cccc38c02181984a9318a73847174..0000000000000000000000000000000000000000 --- a/adds-address-prefix-len-to-dhclient-cli.patch +++ /dev/null @@ -1,78 +0,0 @@ -From 3286e40ff01e78c172dfb0cdb684b58854af7604 Mon Sep 17 00:00:00 2001 -From: liuzhikang -Date: Thu, 31 Oct 2019 16:07:22 +0800 - -Signed-off-by: liuzhikang ---- - client/dhc6.c | 3 ++- - client/dhclient.c | 17 +++++++++++++++-- - 2 files changed, 17 insertions(+), 3 deletions(-) - -diff --git a/client/dhc6.c b/client/dhc6.c -index 5460ee1..fe0057c 100644 ---- a/client/dhc6.c -+++ b/client/dhc6.c -@@ -148,6 +148,7 @@ static int dhc6_score_lease(struct client_state *client, - - extern int onetry; - extern int stateless; -+extern int address_prefix_len; - - /* - * Assign DHCPv6 port numbers as a client. -@@ -4364,7 +4365,7 @@ dhc6_marshall_values(const char *prefix, struct client_state *client, - (unsigned) addr->plen); - } else { - client_envadd(client, prefix, "ip6_prefixlen", -- "%d", DHCLIENT_DEFAULT_PREFIX_LEN); -+ "%d", address_prefix_len); - client_envadd(client, prefix, "ip6_address", - "%s", piaddr(addr->address)); - } -diff --git a/client/dhclient.c b/client/dhclient.c -index 62b90cf..9f8ba06 100644 ---- a/client/dhclient.c -+++ b/client/dhclient.c -@@ -108,6 +108,7 @@ int require_all_ias = 0; /* If the user requires all of the IAs to - be available before accepting a lease - 0 = no, 1 = requries */ - int dad_wait_time = 0; -+int address_prefix_len = DHCLIENT_DEFAULT_PREFIX_LEN; - char *mockup_relay = NULL; - - char *progname = NULL; -@@ -190,9 +191,11 @@ usage(const char *sfmt, const char *sarg) - #ifdef DHCP4o6 - "[-4|-6] [-SNTPRI1dvrxi] [-nw] -4o6 ] [-p ]\n" - " [-D LL|LLT] [--dad-wait-time seconds]\n" -+ " [--address-prefix-len length]\n" - #else /* DHCP4o6 */ - "[-4|-6] [-SNTPRI1dvrxi] [-nw] [-p ]\n" -- " [-D LL|LLT] [--dad-wait-time seconds]\n" -+ " [-D LL|LLT] [--dad-wait-time seconds]\n" -+ " [--address-prefix-len length]\n" - #endif - #else /* DHCPv6 */ - "[-I1dvrxi] [-nw] [-p ] [-D LL|LLT] \n" -@@ -452,7 +455,17 @@ main(int argc, char **argv) { - if (errno || (*s != '\0') || (dad_wait_time < 0)) { - usage("Invalid value for --dad-wait-time: %s", argv[i]); - } -- -+ } else if (!strcmp(argv[i], "--address-prefix-len")) { -+ if (++i == argc) { -+ usage(use_noarg, argv[i-1]); -+ } -+ errno = 0; -+ address_prefix_len = (int)strtol(argv[i], &s, 10); -+ if (errno || (*s != '\0') || -+ (address_prefix_len < 0)) { -+ usage("Invalid value for" -+ " --address-prefix-len: %s", argv[i]); -+ } - #endif /* DHCPv6 */ - } else if (!strcmp(argv[i], "-D")) { - duid_v4 = 1; --- -2.19.1 - diff --git a/bugfix-dhclient-check-if-pid-was-held.patch b/bugfix-dhclient-check-if-pid-was-held.patch index dd53f0b6b5d547089779c5746eeaddfa9177e2fe..89cb262c93af983a1ac0a62ea72b7577760b645a 100644 --- a/bugfix-dhclient-check-if-pid-was-held.patch +++ b/bugfix-dhclient-check-if-pid-was-held.patch @@ -1,7 +1,7 @@ -From bab9f6ff2345fb5a1db048349fe088c1ee7d440b Mon Sep 17 00:00:00 2001 -From: Anonymous_Z -Date: Tue, 3 Mar 2020 17:36:41 +0800 -Subject: [PATCH] dhcp: recheck whether last pid was held by other process +From 569ca7918daa63832207e0d96f7d0b2d78300850 Mon Sep 17 00:00:00 2001 +From: zhanglu +Date: Thu, 27 Feb 2020 20:47:22 +0800 +Subject: [PATCH] dhcp: solve start dhclient when last pid was held. Signed-off-by: zhanglu --- @@ -9,7 +9,7 @@ Signed-off-by: zhanglu 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/client/dhclient.c b/client/dhclient.c -index 9f8ba06..97b04e0 100644 +index 9f8ba06..eff3444 100644 --- a/client/dhclient.c +++ b/client/dhclient.c @@ -774,15 +774,26 @@ main(int argc, char **argv) { @@ -30,8 +30,8 @@ index 9f8ba06..97b04e0 100644 - dhc_running = (access(procfn, F_OK) == 0); + snprintf(pidname_path,256,"%s/comm",procfn); + -+ if(access(procfn, F_OK) == 0) { -+ if((commfp = fopen(pidname_path, "r")) != NULL) { ++ if (access(procfn, F_OK) == 0) { ++ if ((commfp = fopen(pidname_path, "r")) != NULL) { + fscanf(commfp, "%s", pidname); + dhc_running = (strncmp("dhclient", pidname, strlen("dhclient")) == 0); + fclose(commfp); @@ -41,5 +41,5 @@ index 9f8ba06..97b04e0 100644 fclose(pidfp); -- -1.8.3.1 +2.19.1 diff --git a/bugfix-dhcp-4.2.5-check-dhclient-pid.patch b/bugfix-dhcp-4.2.5-check-dhclient-pid.patch index d771445f1ff13ee629ea9c423005d993b84a17e7..aa5b15b6d93decc120fff2112841ec09b3c6d058 100644 --- a/bugfix-dhcp-4.2.5-check-dhclient-pid.patch +++ b/bugfix-dhcp-4.2.5-check-dhclient-pid.patch @@ -9,15 +9,14 @@ extern struct option *default_requested_options[]; void run_stateless(int exit_mode, u_int16_t port); -@@ -129,6 +131,8 @@ - static void dhclient_ddns_cb_free(dhcp_ddns_cb_t *ddns_cb, +@@ -143,6 +143,7 @@ static void dhclient_ddns_cb_free(dhcp_ddns_cb_t *ddns_cb, char* file, int line); - + #endif /* defined NSUPDATE */ + +static int check_dhclient_pid(pid_t pid); -+ + /*! * - * \brief Print the generic usage message @@ -682,7 +686,8 @@ e = fscanf(pidfd, "%ld\n", &temp); oldpid = (pid_t)temp; diff --git a/bugfix-reduce-getifaddr-calls.patch b/bugfix-reduce-getifaddr-calls.patch index 730390be195e334540a46c9c3aec6d424df88fd7..02ea83571f216114aa6ab82bc1903d181f934f75 100644 --- a/bugfix-reduce-getifaddr-calls.patch +++ b/bugfix-reduce-getifaddr-calls.patch @@ -13,16 +13,14 @@ Signed-off-by: LuZhang 3 files changed, 122 insertions(+), 1 deletion(-) diff --git a/common/discover.c b/common/discover.c -index afa33eb..4033feb 100644 +index 6860645..26be5de 100644 --- a/common/discover.c +++ b/common/discover.c -@@ -573,11 +573,14 @@ discover_interfaces(int state) { - int ir; - isc_result_t status; - int wifcount = 0; -+ struct ifaddrs *ifaddrs_start = NULL; +@@ -588,9 +588,12 @@ discover_interfaces(int state) { + #endif static int setup_fallback = 0; ++ struct ifaddrs *ifaddrs_start = NULL; if (!begin_iface_scan(&ifaces)) { log_fatal("Can't get list of interfaces."); @@ -31,7 +29,7 @@ index afa33eb..4033feb 100644 } /* If we already have a list of interfaces, and we're running as -@@ -636,7 +639,7 @@ discover_interfaces(int state) { +@@ -651,7 +654,7 @@ discover_interfaces(int state) { tmp = interfaces; /* XXX */ } if (tmp != NULL) @@ -40,7 +38,6 @@ index afa33eb..4033feb 100644 if (dhcp_interface_discovery_hook) { (*dhcp_interface_discovery_hook)(tmp); -diff --git a/common/lpf.c b/common/lpf.c index 9ec8a31..823ba6b 100644 --- a/common/lpf.c +++ b/common/lpf.c diff --git a/dhcp-4.3.6-isc-util.patch b/dhcp-4.3.6-isc-util.patch deleted file mode 100644 index 50a02480a6ff2029c2a7af3381cd7c2dce0278bd..0000000000000000000000000000000000000000 --- a/dhcp-4.3.6-isc-util.patch +++ /dev/null @@ -1,77 +0,0 @@ -From c37721f799e6b32da156759a830011949311205a Mon Sep 17 00:00:00 2001 -From: Petr Mensik -Date: Fri, 16 Feb 2018 17:50:40 +0100 -Subject: [PATCH] New bind includes never includes isc/util.h from any public - headers. Include them to all compiled files that require it. - ---- - client/dhclient.c | 1 + - common/execute.c | 1 + - common/parse.c | 1 + - common/socket.c | 1 + - omapip/connection.c | 1 + - 5 files changed, 5 insertions(+) - -diff --git a/client/dhclient.c b/client/dhclient.c -index 228b4fe..014365d 100644 ---- a/client/dhclient.c -+++ b/client/dhclient.c -@@ -38,6 +38,7 @@ - #include - #include - #include -+#include - #include - - #ifdef HAVE_LIBCAP_NG -diff --git a/common/execute.c b/common/execute.c -index fa4e0f8..1ee1e7d 100644 ---- a/common/execute.c -+++ b/common/execute.c -@@ -28,6 +28,7 @@ - - #include "dhcpd.h" - #include -+#include - #include - #include - -diff --git a/common/parse.c b/common/parse.c -index d08cd2c..729d442 100644 ---- a/common/parse.c -+++ b/common/parse.c -@@ -27,6 +27,7 @@ - */ - - #include "dhcpd.h" -+#include - #include - - /* Enumerations can be specified in option formats, and are used for -diff --git a/common/socket.c b/common/socket.c -index 2b352a1..94ce334 100644 ---- a/common/socket.c -+++ b/common/socket.c -@@ -35,6 +35,7 @@ - */ - - #include "dhcpd.h" -+#include - #include - #include - #include -diff --git a/omapip/connection.c b/omapip/connection.c -index 9aac0c8..a74becc 100644 ---- a/omapip/connection.c -+++ b/omapip/connection.c -@@ -30,6 +30,7 @@ - #include "dhcpd.h" - - #include -+#include - #include - #include - #include --- -2.14.3 - diff --git a/dhcp-4.3.6-omapi-leak.patch b/dhcp-4.3.6-omapi-leak.patch deleted file mode 100644 index 0ffcfe3d096084677cb1ccc250dfcd3757224343..0000000000000000000000000000000000000000 --- a/dhcp-4.3.6-omapi-leak.patch +++ /dev/null @@ -1,52 +0,0 @@ -commit ccff9ed69d0b26d33ce9cac8e83dab535b64d627 -Author: Thomas Markwalder -Date: Tue Dec 5 15:12:34 2017 -0500 - - [46767] Plugged a socket descriptor leak in OMAPI - - If disconnect is triggered by the reader closing the socket, while there - is data left to write, the socket would be orphaned. - - omapip/buffer.c - omapi_connection_writea() - added logic to recall disconnect once - pending data has been written - - omapip/message.c - Removed static declaration from omapi_message_unregister so you can - actually compile when DEBUG_PROTOCOL is defined. - - Added a release note - -diff --git a/omapip/buffer.c b/omapip/buffer.c -index 6e0621b..a21f0a8 100644 ---- a/omapip/buffer.c -+++ b/omapip/buffer.c -@@ -565,6 +565,15 @@ isc_result_t omapi_connection_writer (omapi_object_t *h) - omapi_buffer_dereference (&buffer, MDL); - } - } -+ -+ /* If we had data left to write when we're told to disconnect, -+ * we need recall disconnect, now that we're done writing. -+ * See rt46767. */ -+ if (c->out_bytes == 0 && c->state == omapi_connection_disconnecting) { -+ omapi_disconnect (h, 1); -+ return ISC_R_SHUTTINGDOWN; -+ } -+ - return ISC_R_SUCCESS; - } - -diff --git a/omapip/message.c b/omapip/message.c -index ee15d82..37abbd2 100644 ---- a/omapip/message.c -+++ b/omapip/message.c -@@ -339,7 +339,7 @@ isc_result_t omapi_message_unregister (omapi_object_t *mo) - } - - #ifdef DEBUG_PROTOCOL --static const char *omapi_message_op_name(int op) { -+const char *omapi_message_op_name(int op) { - switch (op) { - case OMAPI_OP_OPEN: return "OMAPI_OP_OPEN"; - case OMAPI_OP_REFRESH: return "OMAPI_OP_REFRESH"; diff --git a/dhcp-4.3.6-options_overflow.patch b/dhcp-4.3.6-options_overflow.patch deleted file mode 100644 index a51c0ccf4911a462f539bd6bd3c3e95a07de9345..0000000000000000000000000000000000000000 --- a/dhcp-4.3.6-options_overflow.patch +++ /dev/null @@ -1,41 +0,0 @@ -diff --git a/common/options.c b/common/options.c -index 83e0384..8a1deca 100644 ---- a/common/options.c -+++ b/common/options.c -@@ -1672,7 +1672,8 @@ format_min_length(format, oc) - - - /* Format the specified option so that a human can easily read it. */ -- -+/* Maximum pretty printed size */ -+#define MAX_OUTPUT_SIZE 32*1024 - const char *pretty_print_option (option, data, len, emit_commas, emit_quotes) - struct option *option; - const unsigned char *data; -@@ -1680,8 +1681,9 @@ const char *pretty_print_option (option, data, len, emit_commas, emit_quotes) - int emit_commas; - int emit_quotes; - { -- static char optbuf [32768]; /* XXX */ -- static char *endbuf = &optbuf[sizeof(optbuf)]; -+ /* We add 128 byte pad so we don't have to add checks everywhere. */ -+ static char optbuf [MAX_OUTPUT_SIZE + 128]; /* XXX */ -+ static char *endbuf = optbuf + MAX_OUTPUT_SIZE; - int hunksize = 0; - int opthunk = 0; - int hunkinc = 0; -@@ -2132,7 +2134,14 @@ const char *pretty_print_option (option, data, len, emit_commas, emit_quotes) - log_error ("Unexpected format code %c", - fmtbuf [j]); - } -+ - op += strlen (op); -+ if (op >= endbuf) { -+ log_error ("Option data exceeds" -+ " maximum size %d", MAX_OUTPUT_SIZE); -+ return (""); -+ } -+ - if (dp == data + len) - break; - if (j + 1 < numelem && comma != ':') diff --git a/dhcp-4.3.6-reference_count_overflow.patch b/dhcp-4.3.6-reference_count_overflow.patch deleted file mode 100644 index c6c94cd49debdff8ee49b214efa6a3b2d57cfbec..0000000000000000000000000000000000000000 --- a/dhcp-4.3.6-reference_count_overflow.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/common/options.c b/common/options.c -index 83e0384..a58c5fc 100644 ---- a/common/options.c -+++ b/common/options.c -@@ -189,6 +189,8 @@ int parse_option_buffer (options, buffer, length, universe) - - /* If the length is outrageous, the options are bad. */ - if (offset + len > length) { -+ /* Avoid reference count overflow */ -+ option_dereference(&option, MDL); - reason = "option length exceeds option buffer length"; - bogus: - log_error("parse_option_buffer: malformed option " diff --git a/dhcp-4.3.6.tar.gz b/dhcp-4.4.2.tar.gz similarity index 54% rename from dhcp-4.3.6.tar.gz rename to dhcp-4.4.2.tar.gz index f77bfc0445608eeb97c52c33c08bdad4809739d1..4c027d3fdb0767a8f91fa1e118da735488761317 100644 Binary files a/dhcp-4.3.6.tar.gz and b/dhcp-4.4.2.tar.gz differ diff --git a/dhcp-64_bit_lease_parse.patch b/dhcp-64_bit_lease_parse.patch deleted file mode 100644 index a07b5b032ad28105d898a8e7ae48975682fb1670..0000000000000000000000000000000000000000 --- a/dhcp-64_bit_lease_parse.patch +++ /dev/null @@ -1,75 +0,0 @@ -diff -up dhcp-4.3.0a1/common/parse.c.64-bit_lease_parse dhcp-4.3.0a1/common/parse.c ---- dhcp-4.3.0a1/common/parse.c.64-bit_lease_parse 2013-12-11 01:25:12.000000000 +0100 -+++ dhcp-4.3.0a1/common/parse.c 2013-12-19 15:45:25.990771814 +0100 -@@ -938,8 +938,8 @@ TIME - parse_date_core(cfile) - struct parse *cfile; - { -- int guess; -- int tzoff, year, mon, mday, hour, min, sec; -+ TIME guess; -+ long int tzoff, year, mon, mday, hour, min, sec; - const char *val; - enum dhcp_token token; - static int months[11] = { 31, 59, 90, 120, 151, 181, -@@ -965,7 +965,7 @@ parse_date_core(cfile) - } - - skip_token(&val, NULL, cfile); /* consume number */ -- guess = atoi(val); -+ guess = atol(val); - - return((TIME)guess); - } -@@ -993,7 +993,7 @@ parse_date_core(cfile) - somebody invents a time machine, I think we can safely disregard - it. This actually works around a stupid Y2K bug that was present - in a very early beta release of dhcpd. */ -- year = atoi(val); -+ year = atol(val); - if (year > 1900) - year -= 1900; - -@@ -1039,7 +1039,7 @@ parse_date_core(cfile) - return((TIME)0); - } - skip_token(&val, NULL, cfile); /* consume day of month */ -- mday = atoi(val); -+ mday = atol(val); - - /* Hour... */ - token = peek_token(&val, NULL, cfile); -@@ -1050,7 +1050,7 @@ parse_date_core(cfile) - return((TIME)0); - } - skip_token(&val, NULL, cfile); /* consume hour */ -- hour = atoi(val); -+ hour = atol(val); - - /* Colon separating hour from minute... */ - token = peek_token(&val, NULL, cfile); -@@ -1072,7 +1072,7 @@ parse_date_core(cfile) - return((TIME)0); - } - skip_token(&val, NULL, cfile); /* consume minute */ -- min = atoi(val); -+ min = atol(val); - - /* Colon separating minute from second... */ - token = peek_token(&val, NULL, cfile); -@@ -1094,13 +1094,13 @@ parse_date_core(cfile) - return((TIME)0); - } - skip_token(&val, NULL, cfile); /* consume second */ -- sec = atoi(val); -+ sec = atol(val); - - tzoff = 0; - token = peek_token(&val, NULL, cfile); - if (token == NUMBER) { - skip_token(&val, NULL, cfile); /* consume tzoff */ -- tzoff = atoi(val); -+ tzoff = atol(val); - } else if (token != SEMI) { - skip_token(&val, NULL, cfile); - parse_warn(cfile, diff --git a/dhcp-add_timeout_when_NULL.patch b/dhcp-add_timeout_when_NULL.patch deleted file mode 100644 index 103824c384d50c77323fb8b9069dcb66c5f77935..0000000000000000000000000000000000000000 --- a/dhcp-add_timeout_when_NULL.patch +++ /dev/null @@ -1,14 +0,0 @@ -diff -up dhcp-4.3.0a1/common/dispatch.c.dracut dhcp-4.3.0a1/common/dispatch.c ---- dhcp-4.3.0a1/common/dispatch.c.dracut 2013-12-11 01:25:12.000000000 +0100 -+++ dhcp-4.3.0a1/common/dispatch.c 2013-12-19 15:39:50.350505860 +0100 -@@ -210,6 +210,10 @@ void add_timeout (when, where, what, ref - isc_interval_t interval; - isc_time_t expires; - -+ if (when == NULL) { -+ return; -+ } -+ - /* See if this timeout supersedes an existing timeout. */ - t = (struct timeout *)0; - for (q = timeouts; q; q = q->next) { diff --git a/dhcp-dhclient-decline-backoff.patch b/dhcp-dhclient-decline-backoff.patch deleted file mode 100644 index 1fc1c127c0c711fc792a51ad34dd913bba04c4d5..0000000000000000000000000000000000000000 --- a/dhcp-dhclient-decline-backoff.patch +++ /dev/null @@ -1,63 +0,0 @@ -diff -up dhcp-4.3.4/client/dhclient.c.backoff dhcp-4.3.4/client/dhclient.c ---- dhcp-4.3.4/client/dhclient.c.backoff 2016-04-29 12:16:26.976245611 +0200 -+++ dhcp-4.3.4/client/dhclient.c 2016-04-29 12:16:26.979245609 +0200 -@@ -1423,6 +1423,8 @@ void state_init (cpp) - void *cpp; - { - struct client_state *client = cpp; -+ enum dhcp_state init_state = client->state; -+ struct timeval tv; - - ASSERT_STATE(state, S_INIT); - -@@ -1435,9 +1437,18 @@ void state_init (cpp) - client -> first_sending = cur_time; - client -> interval = client -> config -> initial_interval; - -- /* Add an immediate timeout to cause the first DHCPDISCOVER packet -- to go out. */ -- send_discover (client); -+ if (init_state != S_DECLINED) { -+ /* Add an immediate timeout to cause the first DHCPDISCOVER packet -+ to go out. */ -+ send_discover(client); -+ } else { -+ /* We've received an OFFER and it has been DECLINEd by dhclient-script. -+ * wait for a random time between 1 and backoff_cutoff seconds before -+ * trying again. */ -+ tv . tv_sec = cur_time + ((1 + (random() >> 2)) % client->config->backoff_cutoff); -+ tv . tv_usec = 0; -+ add_timeout(&tv, send_discover, client, 0, 0); -+ } - } - - /* -@@ -1734,5 +1745,6 @@ void bind_lease (client) -#endif - exit(2); - } else { -+ client -> state = S_DECLINED; - state_init(client); - return; - } -@@ -4626,6 +4638,7 @@ void client_location_changed () - case S_INIT: - case S_REBINDING: - case S_STOPPED: -+ case S_DECLINED: - break; - } - client -> state = S_INIT; -diff -up dhcp-4.3.4/includes/dhcpd.h.backoff dhcp-4.3.4/includes/dhcpd.h ---- dhcp-4.3.4/includes/dhcpd.h.backoff 2016-04-29 12:16:26.980245609 +0200 -+++ dhcp-4.3.4/includes/dhcpd.h 2016-04-29 12:17:30.893203533 +0200 -@@ -1171,7 +1171,8 @@ enum dhcp_state { - S_BOUND = 5, - S_RENEWING = 6, - S_REBINDING = 7, -- S_STOPPED = 8 -+ S_STOPPED = 8, -+ S_DECLINED = 9 - }; - - /* Possible pending client operations. */ diff --git a/dhcp-fix-dhclient-default-len-64-to-128.patch b/dhcp-fix-dhclient-default-len-64-to-128.patch deleted file mode 100644 index 1abbdf5703541f8a3ff7ad33a421fcb65b4ef18f..0000000000000000000000000000000000000000 --- a/dhcp-fix-dhclient-default-len-64-to-128.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- dhcp-4.3.6/includes/site.h.bak 2019-09-03 09:41:12.816000000 -0400 -+++ dhcp-4.3.6/includes/site.h 2019-09-03 09:55:03.308000000 -0400 -@@ -286,7 +286,7 @@ - is a host address and doesn't include any on-link information. - 64 indicates that the first 64 bits are the subnet or on-link - prefix. */ --#define DHCLIENT_DEFAULT_PREFIX_LEN 64 -+#define DHCLIENT_DEFAULT_PREFIX_LEN 128 - - /* Enable the gentle shutdown signal handling. Currently this - means that on SIGINT or SIGTERM a client will release its diff --git a/dhcp-handle_ctx_signals.patch b/dhcp-handle_ctx_signals.patch deleted file mode 100644 index 9bbe5487fe2a82ddf2aacf03e5576e0ff84c9fad..0000000000000000000000000000000000000000 --- a/dhcp-handle_ctx_signals.patch +++ /dev/null @@ -1,44 +0,0 @@ -diff --git a/omapip/isclib.c b/omapip/isclib.c -index 9ec1a0f..42d82ff 100644 ---- a/omapip/isclib.c -+++ b/omapip/isclib.c -@@ -185,16 +185,6 @@ dhcp_context_create(int flags, - if (result != ISC_R_SUCCESS) - goto cleanup; - -- result = isc_app_ctxstart(dhcp_gbl_ctx.actx); -- if (result != ISC_R_SUCCESS) -- return (result); -- dhcp_gbl_ctx.actx_started = ISC_TRUE; -- -- /* Not all OSs support suppressing SIGPIPE through socket -- * options, so set the sigal action to be ignore. This allows -- * broken connections to fail gracefully with EPIPE on writes */ -- handle_signal(SIGPIPE, SIG_IGN); -- - result = isc_taskmgr_createinctx(dhcp_gbl_ctx.mctx, - dhcp_gbl_ctx.actx, - 1, 0, -@@ -217,6 +207,21 @@ dhcp_context_create(int flags, - result = isc_task_create(dhcp_gbl_ctx.taskmgr, 0, &dhcp_gbl_ctx.task); - if (result != ISC_R_SUCCESS) - goto cleanup; -+ -+ result = isc_app_ctxstart(dhcp_gbl_ctx.actx); -+ if (result != ISC_R_SUCCESS) -+ return (result); -+ dhcp_gbl_ctx.actx_started = ISC_TRUE; -+ -+ /* Not all OSs support suppressing SIGPIPE through socket -+ * options, so set the sigal action to be ignore. This allows -+ * broken connections to fail gracefully with EPIPE on writes */ -+ handle_signal(SIGPIPE, SIG_IGN); -+ -+ /* Reset handlers installed by isc_app_ctxstart() -+ * to default for control-c and kill */ -+ handle_signal(SIGINT, SIG_DFL); -+ handle_signal(SIGTERM, SIG_DFL); - } - - #if defined (NSUPDATE) - diff --git a/dhcp-honor-expired.patch b/dhcp-honor-expired.patch deleted file mode 100644 index bd892975be1baa06e52b16f9293e978e2d4c9f53..0000000000000000000000000000000000000000 --- a/dhcp-honor-expired.patch +++ /dev/null @@ -1,49 +0,0 @@ -diff -up dhcp-4.3.0a1/client/dhc6.c.honor-expired dhcp-4.3.0a1/client/dhc6.c ---- dhcp-4.3.0a1/client/dhc6.c.honor-expired 2013-12-19 16:00:28.062183037 +0100 -+++ dhcp-4.3.0a1/client/dhc6.c 2013-12-19 16:00:28.076182842 +0100 -@@ -1351,6 +1351,32 @@ start_info_request6(struct client_state - go_daemon(); - } - -+/* Run through the addresses in lease and return true if there's any unexpired. -+ * Return false otherwise. -+ */ -+isc_boolean_t -+unexpired_address_in_lease(struct dhc6_lease *lease) -+{ -+ struct dhc6_ia *ia; -+ struct dhc6_addr *addr; -+ -+ for (ia = lease->bindings ; ia != NULL ; ia = ia->next) { -+ for (addr = ia->addrs ; addr != NULL ; addr = addr->next) { -+ if (addr->flags & DHC6_ADDR_EXPIRED) -+ continue; -+ -+ if (addr->starts + addr->max_life > cur_time) { -+ return ISC_TRUE; -+ } -+ } -+ } -+ -+ log_info("PRC: Previous lease is devoid of active addresses." -+ " Re-initializing."); -+ -+ return ISC_FALSE; -+} -+ - /* - * start_confirm6() kicks off an "init-reboot" version of the process, at - * startup to find out if old bindings are 'fair' and at runtime whenever -@@ -1363,8 +1389,10 @@ start_confirm6(struct client_state *clie - - /* If there is no active lease, there is nothing to check. */ - if ((client->active_lease == NULL) || -- !active_prefix(client) || -- client->active_lease->released) { -+ !active_prefix(client) || -+ client->active_lease->released || -+ !unexpired_address_in_lease(client->active_lease)) { -+ dhc6_lease_destroy(&client->active_lease, MDL); - start_init6(client); - return; - } diff --git a/dhcp-improved-xid.patch b/dhcp-improved-xid.patch deleted file mode 100644 index 69a6975ddefa286770f374697460a72cc071ef24..0000000000000000000000000000000000000000 --- a/dhcp-improved-xid.patch +++ /dev/null @@ -1,138 +0,0 @@ -diff -up dhcp-4.3.4/client/dhclient.c.improved-xid dhcp-4.3.4/client/dhclient.c ---- dhcp-4.3.4/client/dhclient.c.improved-xid 2016-04-29 12:54:55.997102182 +0200 -+++ dhcp-4.3.4/client/dhclient.c 2016-04-29 12:57:25.123139587 +0200 -@@ -1045,6 +1045,26 @@ main(int argc, char **argv) { - } - } - -+ /* We create a backup seed before rediscovering interfaces in order to -+ have a seed built using all of the available interfaces -+ It's interesting if required interfaces doesn't let us defined -+ a really unique seed due to a lack of valid HW addr later -+ (this is the case with DHCP over IB) -+ We only use the last device as using a sum could broke the -+ uniqueness of the seed among multiple nodes -+ */ -+ unsigned backup_seed = 0; -+ for (ip = interfaces; ip; ip = ip -> next) { -+ int junk; -+ if ( ip -> hw_address.hlen <= sizeof seed ) -+ continue; -+ memcpy (&junk, -+ &ip -> hw_address.hbuf [ip -> hw_address.hlen - -+ sizeof seed], sizeof seed); -+ backup_seed = junk; -+ } -+ -+ - /* At this point, all the interfaces that the script thinks - are relevant should be running, so now we once again call - discover_interfaces(), and this time ask it to actually set -@@ -1059,14 +1079,36 @@ main(int argc, char **argv) { - Not much entropy, but we're booting, so we're not likely to - find anything better. */ - seed = 0; -+ int seed_flag = 0; - for (ip = interfaces; ip; ip = ip->next) { - int junk; -+ if ( ip -> hw_address.hlen <= sizeof seed ) -+ continue; - memcpy(&junk, - &ip->hw_address.hbuf[ip->hw_address.hlen - - sizeof seed], sizeof seed); - seed += junk; -+ seed_flag = 1; - } -- srandom(seed + cur_time + (unsigned)getpid()); -+ if ( seed_flag == 0 ) { -+ if ( backup_seed != 0 ) { -+ seed = backup_seed; -+ log_info ("xid: rand init seed (0x%x) built using all" -+ " available interfaces",seed); -+ } -+ else { -+ seed = cur_time^((unsigned) gethostid()) ; -+ log_info ("xid: warning: no netdev with useable HWADDR found" -+ " for seed's uniqueness enforcement"); -+ log_info ("xid: rand init seed (0x%x) built using gethostid", -+ seed); -+ } -+ /* we only use seed and no current time as a broadcast reply */ -+ /* will certainly be used by the hwaddrless interface */ -+ srandom(seed + ((unsigned)(cur_tv.tv_usec * 1000000)) + (unsigned)getpid()); -+ } -+ else -+ srandom(seed + ((unsigned)(cur_tv.tv_usec * 1000000)) + (unsigned)getpid()); - - /* Setup specific Infiniband options */ - for (ip = interfaces; ip; ip = ip->next) { -@@ -1633,7 +1675,7 @@ void dhcpack (packet) - return; - } - -- log_info ("DHCPACK from %s", piaddr (packet -> client_addr)); -+ log_info ("DHCPACK from %s (xid=0x%x)", piaddr (packet -> client_addr), ntohl(client -> xid)); - - lease = packet_to_lease (packet, client); - if (!lease) { -@@ -2541,7 +2583,7 @@ void dhcpnak (packet) - return; - } - -- log_info ("DHCPNAK from %s", piaddr (packet -> client_addr)); -+ log_info ("DHCPNAK from %s (xid=0x%x)", piaddr (packet -> client_addr), ntohl(client -> xid)); - - if (!client -> active) { - #if defined (DEBUG) -@@ -2674,10 +2716,10 @@ void send_discover (cpp) - (long)(client -> interval)); - } else - #endif -- log_info ("DHCPDISCOVER on %s to %s port %d interval %ld", -+ log_info ("DHCPDISCOVER on %s to %s port %d interval %ld (xid=0x%x)", - client -> name ? client -> name : client -> interface -> name, - inet_ntoa (sockaddr_broadcast.sin_addr), -- ntohs (sockaddr_broadcast.sin_port), (long)(client -> interval)); -+ ntohs (sockaddr_broadcast.sin_port), (long)(client -> interval), ntohl(client -> xid)); - - /* Send out a packet. */ - #if defined(DHCPv6) && defined(DHCP4o6) -@@ -2962,10 +3004,10 @@ void send_request (cpp) - log_info ("DHCPREQUEST"); - } else - #endif -- log_info ("DHCPREQUEST on %s to %s port %d", -+ log_info ("DHCPREQUEST on %s to %s port %d (xid=0x%x)", - client -> name ? client -> name : client -> interface -> name, - inet_ntoa (destination.sin_addr), -- ntohs (destination.sin_port)); -+ ntohs (destination.sin_port), ntohl(client -> xid)); - - #if defined(DHCPv6) && defined(DHCP4o6) - if (dhcpv4_over_dhcpv6) { -@@ -3022,10 +3064,10 @@ void send_decline (cpp) - log_info ("DHCPDECLINE"); - } else - #endif -- log_info ("DHCPDECLINE on %s to %s port %d", -+ log_info ("DHCPDECLINE on %s to %s port %d (xid=0x%x)", - client->name ? client->name : client->interface->name, - inet_ntoa(sockaddr_broadcast.sin_addr), -- ntohs(sockaddr_broadcast.sin_port)); -+ ntohs(sockaddr_broadcast.sin_port), ntohl(client -> xid)); - - /* Send out a packet. */ - #if defined(DHCPv6) && defined(DHCP4o6) -@@ -3084,10 +3126,10 @@ void send_release (cpp) - log_info ("DHCPRELEASE"); - } else - #endif -- log_info ("DHCPRELEASE on %s to %s port %d", -+ log_info ("DHCPRELEASE on %s to %s port %d (xid=0x%x)", - client -> name ? client -> name : client -> interface -> name, - inet_ntoa (destination.sin_addr), -- ntohs (destination.sin_port)); -+ ntohs (destination.sin_port), ntohl(client -> xid)); - - #if defined(DHCPv6) && defined(DHCP4o6) - if (dhcpv4_over_dhcpv6) { diff --git a/dhcp-remove-bind.patch b/dhcp-remove-bind.patch deleted file mode 100644 index 7706c608a8444dc7531f717c925d8b1a0c1aff8a..0000000000000000000000000000000000000000 --- a/dhcp-remove-bind.patch +++ /dev/null @@ -1,351 +0,0 @@ -From 2698385647a6ebd58b5d25147333e494c3da2409 Mon Sep 17 00:00:00 2001 -From: Petr Mensik -Date: Fri, 9 Feb 2018 15:24:53 +0100 -Subject: [PATCH] Support for isc-config.sh script on --with-libbind parameter - -Move checks only to isc-config section - -Fix detection of bind flags from config - -Add support for with-libbind=config, Improve help message ---- - client/Makefile.am | 5 ++- - client/tests/Makefile.am | 8 ++--- - common/tests/Makefile.am | 14 +++----- - configure.ac | 84 ++++++++++++++++++++++++++++++++++++++++++------ - dhcpctl/Makefile.am | 8 ++--- - omapip/Makefile.am | 5 ++- - relay/Makefile.am | 5 ++- - server/Makefile.am | 6 ++-- - server/tests/Makefile.am | 9 +++--- - 9 files changed, 98 insertions(+), 46 deletions(-) - -diff --git a/client/Makefile.am b/client/Makefile.am -index 2cb83d8..b85f5d2 100644 ---- a/client/Makefile.am -+++ b/client/Makefile.am -@@ -4,7 +4,7 @@ - # production code. Sadly, we are not there yet. - SUBDIRS = . tests - --BINDLIBDIR = @BINDDIR@/lib -+BIND_LIBS = @BIND_LIBS@ - - AM_CPPFLAGS = -DCLIENT_PATH='"PATH=$(sbindir):/sbin:/bin:/usr/sbin:/usr/bin"' \ - -DLOCALSTATEDIR='"$(localstatedir)"' -@@ -15,7 +15,6 @@ dhclient_SOURCES = clparse.c dhclient.c dhc6.c \ - scripts/bsdos scripts/freebsd scripts/linux scripts/macos \ - scripts/netbsd scripts/nextstep scripts/openbsd \ - scripts/solaris scripts/openwrt --dhclient_LDADD = ../common/libdhcp.a ../omapip/libomapi.a $(BINDLIBDIR)/libirs.a \ -- $(BINDLIBDIR)/libdns.a $(BINDLIBDIR)/libisccfg.a $(BINDLIBDIR)/libisc.a -+dhclient_LDADD = ../common/libdhcp.a ../omapip/libomapi.a $(BIND_LIBS) - man_MANS = dhclient.8 dhclient-script.8 dhclient.conf.5 dhclient.leases.5 - EXTRA_DIST = $(man_MANS) -diff --git a/client/tests/Makefile.am b/client/tests/Makefile.am -index 5031d0c..bb1fda4 100644 ---- a/client/tests/Makefile.am -+++ b/client/tests/Makefile.am -@@ -1,9 +1,9 @@ - SUBDIRS = . - --BINDLIBDIR = @BINDDIR@/lib -+BIND_LIBS = @BIND_LIBS@ - - AM_CPPFLAGS = $(ATF_CFLAGS) -DUNIT_TEST -I$(top_srcdir)/includes --AM_CPPFLAGS += -I@BINDDIR@/include -I$(top_srcdir) -+AM_CPPFLAGS += @BIND_CPPFLAGS@ -I$(top_srcdir) - AM_CPPFLAGS += -DLOCALSTATEDIR='"."' - AM_CPPFLAGS += -DCLIENT_PATH='"."' - -@@ -18,9 +18,7 @@ info: - DHCPSRC = ../clparse.c ../dhc6.c ../dhclient.c - - DHCPLIBS = $(top_builddir)/common/libdhcp.a $(top_builddir)/omapip/libomapi.a \ -- $(top_builddir)/dhcpctl/libdhcpctl.a $(BINDLIBDIR)/libirs.a \ -- $(BINDLIBDIR)/libdns.a $(BINDLIBDIR)/libisccfg.a \ -- $(BINDLIBDIR)/libisc.a -+ $(top_builddir)/dhcpctl/libdhcpctl.a $(BIND_LIBS) - - ATF_TESTS = - if HAVE_ATF -diff --git a/common/tests/Makefile.am b/common/tests/Makefile.am -index f6a43e4..196aa44 100644 ---- a/common/tests/Makefile.am -+++ b/common/tests/Makefile.am -@@ -1,6 +1,6 @@ - SUBDIRS = . - --BINDLIBDIR = @BINDDIR@/lib -+BIND_LIBS = @BIND_LIBS@ - - AM_CPPFLAGS = $(ATF_CFLAGS) -I$(top_srcdir)/includes - -@@ -15,26 +15,22 @@ ATF_TESTS += alloc_unittest dns_unittest misc_unittest ns_name_unittest - alloc_unittest_SOURCES = test_alloc.c $(top_srcdir)/tests/t_api_dhcp.c - alloc_unittest_LDADD = $(ATF_LDFLAGS) - alloc_unittest_LDADD += ../libdhcp.a \ -- ../../omapip/libomapi.a $(BINDLIBDIR)/libirs.a \ -- $(BINDLIBDIR)/libdns.a $(BINDLIBDIR)/libisccfg.a $(BINDLIBDIR)/libisc.a -+ ../../omapip/libomapi.a $(BIND_LIBS) - - dns_unittest_SOURCES = dns_unittest.c $(top_srcdir)/tests/t_api_dhcp.c - dns_unittest_LDADD = $(ATF_LDFLAGS) - dns_unittest_LDADD += ../libdhcp.a \ -- ../../omapip/libomapi.a $(BINDLIBDIR)/libirs.a \ -- $(BINDLIBDIR)/libdns.a $(BINDLIBDIR)/libisccfg.a $(BINDLIBDIR)/libisc.a -+ ../../omapip/libomapi.a $(BIND_LIBS) - - misc_unittest_SOURCES = misc_unittest.c $(top_srcdir)/tests/t_api_dhcp.c - misc_unittest_LDADD = $(ATF_LDFLAGS) - misc_unittest_LDADD += ../libdhcp.a \ -- ../../omapip/libomapi.a $(BINDLIBDIR)/libirs.a \ -- $(BINDLIBDIR)/libdns.a $(BINDLIBDIR)/libisccfg.a $(BINDLIBDIR)/libisc.a -+ ../../omapip/libomapi.a $(BIND_LIBS) - - ns_name_unittest_SOURCES = ns_name_test.c $(top_srcdir)/tests/t_api_dhcp.c - ns_name_unittest_LDADD = $(ATF_LDFLAGS) - ns_name_unittest_LDADD += ../libdhcp.a \ -- ../../omapip/libomapi.a $(BINDLIBDIR)/libirs.a \ -- $(BINDLIBDIR)/libdns.a $(BINDLIBDIR)/libisccfg.a $(BINDLIBDIR)/libisc.a -+ ../../omapip/libomapi.a $(BIND_LIBS) - - check: $(ATF_TESTS) - @if test $(top_srcdir) != ${top_builddir}; then \ -diff --git a/configure.ac b/configure.ac -index cdfa352..ef55f8d 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -688,8 +688,12 @@ AC_CHECK_MEMBER(struct tpacket_auxdata.tp_vlan_tci, - - BINDDIR= - BINDSRCDIR= -+BIND_CONFIG= -+BIND_CPPFLAGS= -+BIND_LIBS= - AC_ARG_WITH(libbind, -- AS_HELP_STRING([--with-libbind=PATH],[bind includes and libraries are in PATH -+ AS_HELP_STRING([--with-libbind=PATH|config],[bind includes and libraries are in PATH. -+ Use config to obtain libraries from isc-config.sh. - (default is ./bind)]), - use_libbind="$withval", use_libbind="no") - case "$use_libbind" in -@@ -701,23 +705,85 @@ no) - BINDDIR="\${top_srcdir}/bind" - BINDSRCDIR="\${top_srcdir}/bind" - ;; -+config) -+ AC_PATH_PROG(BIND_CONFIG, [isc-config.sh bind9-config]) -+ ;; - *) -- BINDDIR="$use_libbind" -- if test ! -d "$srcdir/bind"; then -- # no bind directory, create it with a fake Makefile.in -- # (AC_CONFIG_FILES and top Makefile refer to it so -- # it must exits) -- mkdir $srcdir/bind -- cat > $srcdir/bind/Makefile.in << EOF -+ if test -f "$use_libbind" -a -x "$use_libbind"; then -+ # passed full path of isc-config.sh -+ BIND_CONFIG="$use_libbind" -+ else -+ BINDDIR="$use_libbind" -+ if test ! -d "$srcdir/bind"; then -+ # no bind directory, create it with a fake Makefile.in -+ # (AC_CONFIG_FILES and top Makefile refer to it so -+ # it must exits) -+ mkdir $srcdir/bind -+ cat > $srcdir/bind/Makefile.in << EOF - # placeholder - all check clean distclean distdir install uninstall: - - EOF -+ fi - fi - ;; - esac -+if test -z "$BIND_CONFIG"; then -+ BIND_CPPFLAGS="-I${BINDDIR}/include" -+ BIND_LIBDIR="${BINDDIR}/lib" -+ BIND_LIBS="$(BINDLIBDIR)/libirs.a $(BINDLIBDIR)/libdns.a $(BINDLIBDIR)/libisccfg.a $(BINDLIBDIR)/libisc.a" -+else -+ BIND_CPPFLAGS=`$BIND_CONFIG --cflags` -+ BIND_LIBS=`$BIND_CONFIG --libs irs dns isccfg isc` -+ -+ # bind is already built -+ AC_CHECKING([Checking bind libraries have no thread support]) -+ saved_libs="$LIBS" -+ saved_CPPFLAGS="$CPPFLAGS" -+ CPPFLAGS="${CPPFLAGS} ${BIND_CPPFLAGS}" -+ LIBS="${LIBS} ${BIND_LIBS}" -+AC_TRY_LINK([ -+#include -+#include -+],[ -+#ifdef BIND9 -+#error Export BIND library has to be used with BIND version up to 9.9 -+#endif -+isc_lib_register(); -+], [AC_MSG_RESULT(Bind export library found) -+ BIND_EXPORT=yes], [BIND_EXPORT=no] -+) -+ -+# Allow build with disabled threads for dhcp -+AC_TRY_LINK([ -+#include -+#include -+#include -+],[ -+#ifdef ISC_PLATFORM_USETHREADS -+#error Bind library must not be compiled with threads -+#endif -+isc_lib_register(); -+if (isc_bind9 != 0) {} -+], [AC_MSG_RESULT(Bind single thread library found) -+ BIND_SINGLETHREAD=yes], [BIND_SINGLETHREAD=no] -+) -+ -+ if test "x$BIND_EXPORT" != xyes -a "x$BIND_SINGLETHREADED" != xyes -+ then -+ AC_MSG_RESULT([BIND_CONFIG=${BIND_CONFIG}]) -+ AC_MSG_RESULT([BIND_CPPFLAGS=${BIND_CPPFLAGS}]) -+ AC_MSG_RESULT([BIND_LIBS=${BIND_LIBS}]) -+ AC_MSG_ERROR([Bind libraries are not useable for dhcp]) -+ fi -+ CPPFLAGS="$saved_CPPFLAGS" -+ LIBS="$saved_LIBS" -+fi -+ - AC_SUBST(BINDDIR) - AC_SUBST(BINDSRCDIR) -+AC_SUBST(BIND_CPPFLAGS) -+AC_SUBST(BIND_LIBS) - - # OpenLDAP support. - AC_ARG_WITH(ldap, -@@ -795,7 +861,7 @@ fi - CFLAGS="$CFLAGS $STD_CWARNINGS" - - # Try to add the bind and dhcp include directories --CFLAGS="$CFLAGS -I\$(top_srcdir)/includes -I$BINDDIR/include" -+CFLAGS="$CFLAGS -I\$(top_srcdir)/includes $BIND_CPPFLAGS" - - case "$host" in - *-darwin*) -diff --git a/dhcpctl/Makefile.am b/dhcpctl/Makefile.am -index ceb0de1..fa20a78 100644 ---- a/dhcpctl/Makefile.am -+++ b/dhcpctl/Makefile.am -@@ -1,4 +1,4 @@ --BINDLIBDIR = @BINDDIR@/lib -+BIND_LIBS = @BIND_LIBS@ - - bin_PROGRAMS = omshell - lib_LIBRARIES = libdhcpctl.a -@@ -8,12 +8,10 @@ EXTRA_DIST = $(man_MANS) - - omshell_SOURCES = omshell.c - omshell_LDADD = libdhcpctl.a ../common/libdhcp.a ../omapip/libomapi.a \ -- $(BINDLIBDIR)/libirs.a $(BINDLIBDIR)/libdns.a \ -- $(BINDLIBDIR)/libisccfg.a $(BINDLIBDIR)/libisc.a -+ $(BIND_LIBS) - - libdhcpctl_a_SOURCES = dhcpctl.c callback.c remote.c - - cltest_SOURCES = cltest.c - cltest_LDADD = libdhcpctl.a ../common/libdhcp.a ../omapip/libomapi.a \ -- $(BINDLIBDIR)/libirs.a $(BINDLIBDIR)/libdns.a \ -- $(BINDLIBDIR)/libisccfg.a $(BINDLIBDIR)/libisc.a -+ $(BIND_LIBS) -diff --git a/omapip/Makefile.am b/omapip/Makefile.am -index 446a594..b0d2680 100644 ---- a/omapip/Makefile.am -+++ b/omapip/Makefile.am -@@ -1,4 +1,4 @@ --BINDLIBDIR = @BINDDIR@/lib -+BIND_LIBS = @BIND_LIBS@ - - lib_LIBRARIES = libomapi.a - noinst_PROGRAMS = svtest -@@ -12,6 +12,5 @@ man_MANS = omapi.3 - EXTRA_DIST = $(man_MANS) - - svtest_SOURCES = test.c --svtest_LDADD = libomapi.a $(BINDLIBDIR)/libirs.a $(BINDLIBDIR)/libdns.a \ -- $(BINDLIBDIR)/libisccfg.a $(BINDLIBDIR)/libisc.a -+svtest_LDADD = libomapi.a $(BIND_LIBS) - -diff --git a/relay/Makefile.am b/relay/Makefile.am -index 3060eca..c9a1cba 100644 ---- a/relay/Makefile.am -+++ b/relay/Makefile.am -@@ -1,12 +1,11 @@ --BINDLIBDIR = @BINDDIR@/lib -+BIND_LIBS = @BIND_LIBS@ - - AM_CPPFLAGS = -DLOCALSTATEDIR='"@localstatedir@"' - - sbin_PROGRAMS = dhcrelay - dhcrelay_SOURCES = dhcrelay.c - dhcrelay_LDADD = ../common/libdhcp.a ../omapip/libomapi.a \ -- $(BINDLIBDIR)/libirs.a $(BINDLIBDIR)/libdns.a \ -- $(BINDLIBDIR)/libisccfg.a $(BINDLIBDIR)/libisc.a -+ $(BIND_LIBS) - man_MANS = dhcrelay.8 - EXTRA_DIST = $(man_MANS) - -diff --git a/server/Makefile.am b/server/Makefile.am -index 54feedf..30cf2b1 100644 ---- a/server/Makefile.am -+++ b/server/Makefile.am -@@ -4,7 +4,7 @@ - # production code. Sadly, we are not there yet. - SUBDIRS = . tests - --BINDLIBDIR = @BINDDIR@/lib -+BIND_LIBS = @BIND_LIBS@ - - AM_CPPFLAGS = -I.. -DLOCALSTATEDIR='"@localstatedir@"' - -@@ -16,9 +16,7 @@ dhcpd_SOURCES = dhcpd.c dhcp.c bootp.c confpars.c db.c class.c failover.c \ - - dhcpd_CFLAGS = $(LDAP_CFLAGS) - dhcpd_LDADD = ../common/libdhcp.a ../omapip/libomapi.a \ -- ../dhcpctl/libdhcpctl.a $(BINDLIBDIR)/libirs.a \ -- $(BINDLIBDIR)/libdns.a $(BINDLIBDIR)/libisccfg.a \ -- $(BINDLIBDIR)/libisc.a $(LDAP_LIBS) -+ ../dhcpctl/libdhcpctl.a $(BIND_LIBS) $(LDAP_LIBS) - - man_MANS = dhcpd.8 dhcpd.conf.5 dhcpd.leases.5 - EXTRA_DIST = $(man_MANS) -diff --git a/server/tests/Makefile.am b/server/tests/Makefile.am -index a87c5e7..771de06 100644 ---- a/server/tests/Makefile.am -+++ b/server/tests/Makefile.am -@@ -1,9 +1,10 @@ - SUBDIRS = . - --BINDLIBDIR = @BINDDIR@/lib -+BIND_LIBS = @BIND_LIBS@ -+ - - AM_CPPFLAGS = $(ATF_CFLAGS) -DUNIT_TEST -I$(top_srcdir)/includes --AM_CPPFLAGS += -I@BINDDIR@/include -I$(top_srcdir) -+AM_CPPFLAGS += $(BIND_CPPFLAGS) -I$(top_srcdir) - AM_CPPFLAGS += -DLOCALSTATEDIR='"."' - - EXTRA_DIST = Atffile -@@ -20,9 +21,7 @@ DHCPSRC = ../dhcp.c ../bootp.c ../confpars.c ../db.c ../class.c \ - ../ldap.c ../ldap_casa.c ../dhcpd.c ../leasechain.c - - DHCPLIBS = $(top_builddir)/common/libdhcp.a $(top_builddir)/omapip/libomapi.a \ -- $(top_builddir)/dhcpctl/libdhcpctl.a $(BINDLIBDIR)/libirs.a \ -- $(BINDLIBDIR)/libdns.a $(BINDLIBDIR)/libisccfg.a \ -- $(BINDLIBDIR)/libisc.a -+ $(top_builddir)/dhcpctl/libdhcpctl.a $(BIND_LIBS) - - ATF_TESTS = - if HAVE_ATF --- -2.14.3 - diff --git a/dhcp-sendDecline.patch b/dhcp-sendDecline.patch deleted file mode 100644 index ede929885a7b559d3346d3f38f89e081cc3aa749..0000000000000000000000000000000000000000 --- a/dhcp-sendDecline.patch +++ /dev/null @@ -1,231 +0,0 @@ -diff -up dhcp-4.3.4/client/dhc6.c.sendDecline dhcp-4.3.4/client/dhc6.c ---- dhcp-4.3.4/client/dhc6.c.sendDecline 2016-03-22 14:16:51.000000000 +0100 -+++ dhcp-4.3.4/client/dhc6.c 2016-05-02 14:51:57.916578401 +0200 -@@ -115,6 +115,8 @@ void do_select6(void *input); - void do_refresh6(void *input); - static void do_release6(void *input); - static void start_bound(struct client_state *client); -+static void start_decline6(struct client_state *client); -+static void do_decline6(void *input); - static void start_informed(struct client_state *client); - void informed_handler(struct packet *packet, struct client_state *client); - void bound_handler(struct packet *packet, struct client_state *client); -@@ -2314,6 +2316,7 @@ start_release6(struct client_state *clie - cancel_timeout(do_select6, client); - cancel_timeout(do_refresh6, client); - cancel_timeout(do_release6, client); -+ cancel_timeout(do_decline6, client); - client->state = S_STOPPED; - - /* -@@ -2968,6 +2971,7 @@ dhc6_check_reply(struct client_state *cl - break; - - case S_STOPPED: -+ case S_DECLINED: - action = dhc6_stop_action; - break; - -@@ -3084,6 +3088,7 @@ dhc6_check_reply(struct client_state *cl - break; - - case S_STOPPED: -+ case S_DECLINED: - /* Nothing critical to do at this stage. */ - break; - -@@ -4214,17 +4219,23 @@ reply_handler(struct packet *packet, str - cancel_timeout(do_select6, client); - cancel_timeout(do_refresh6, client); - cancel_timeout(do_release6, client); -+ cancel_timeout(do_decline6, client); - - /* If this is in response to a Release/Decline, clean up and return. */ -- if (client->state == S_STOPPED) { -- if (client->active_lease == NULL) -- return; -+ if ((client->state == S_STOPPED) || -+ (client->state == S_DECLINED)) { -+ -+ if (client->active_lease != NULL) { -+ dhc6_lease_destroy(&client->active_lease, MDL); -+ client->active_lease = NULL; -+ /* We should never wait for nothing!? */ -+ if (stopping_finished()) -+ exit(0); -+ } -+ -+ if (client->state == S_DECLINED) -+ start_init6(client); - -- dhc6_lease_destroy(&client->active_lease, MDL); -- client->active_lease = NULL; -- /* We should never wait for nothing!? */ -- if (stopping_finished()) -- exit(0); - return; - } - -@@ -4798,7 +4809,11 @@ start_bound(struct client_state *client) - dhc6_marshall_values("new_", client, lease, ia, addr); - script_write_requested6(client); - -- script_go(client); -+ // when script returns 3, DAD failed -+ if (script_go(client) == 3) { -+ start_decline6(client); -+ return; -+ } - } - - /* XXX: maybe we should loop on the old values instead? */ -@@ -4851,6 +4866,149 @@ start_bound(struct client_state *client) - dhc6_check_times(client); - } - -+/* -+ * Decline addresses. -+ */ -+void -+start_decline6(struct client_state *client) -+{ -+ /* Cancel any pending transmissions */ -+ cancel_timeout(do_confirm6, client); -+ cancel_timeout(do_select6, client); -+ cancel_timeout(do_refresh6, client); -+ cancel_timeout(do_release6, client); -+ cancel_timeout(do_decline6, client); -+ client->state = S_DECLINED; -+ -+ if (client->active_lease == NULL) -+ return; -+ -+ /* Set timers per RFC3315 section 18.1.7. */ -+ client->IRT = DEC_TIMEOUT * 100; -+ client->MRT = 0; -+ client->MRC = DEC_MAX_RC; -+ client->MRD = 0; -+ -+ dhc6_retrans_init(client); -+ client->v6_handler = reply_handler; -+ -+ client->refresh_type = DHCPV6_DECLINE; -+ do_decline6(client); -+} -+ -+/* -+ * do_decline6() creates a Decline packet and transmits it. -+ */ -+static void -+do_decline6(void *input) -+{ -+ struct client_state *client; -+ struct data_string ds; -+ struct timeval elapsed, tv; -+ int send_ret, added; -+ -+ client = input; -+ -+ if ((client->active_lease == NULL) || !active_prefix(client)) -+ return; -+ -+ if ((client->MRC != 0) && (client->txcount > client->MRC)) { -+ log_info("Max retransmission count exceeded."); -+ goto decline_done; -+ } -+ -+ /* -+ * Start_time starts at the first transmission. -+ */ -+ if (client->txcount == 0) { -+ client->start_time.tv_sec = cur_tv.tv_sec; -+ client->start_time.tv_usec = cur_tv.tv_usec; -+ } -+ -+ /* elapsed = cur - start */ -+ elapsed.tv_sec = cur_tv.tv_sec - client->start_time.tv_sec; -+ elapsed.tv_usec = cur_tv.tv_usec - client->start_time.tv_usec; -+ if (elapsed.tv_usec < 0) { -+ elapsed.tv_sec -= 1; -+ elapsed.tv_usec += 1000000; -+ } -+ -+ memset(&ds, 0, sizeof(ds)); -+ if (!buffer_allocate(&ds.buffer, 4, MDL)) { -+ log_error("Unable to allocate memory for Decline."); -+ goto decline_done; -+ } -+ -+ ds.data = ds.buffer->data; -+ ds.len = 4; -+ ds.buffer->data[0] = DHCPV6_DECLINE; -+ memcpy(ds.buffer->data + 1, client->dhcpv6_transaction_id, 3); -+ -+ /* Form an elapsed option. */ -+ /* Maximum value is 65535 1/100s coded as 0xffff. */ -+ if ((elapsed.tv_sec < 0) || (elapsed.tv_sec > 655) || -+ ((elapsed.tv_sec == 655) && (elapsed.tv_usec > 350000))) { -+ client->elapsed = 0xffff; -+ } else { -+ client->elapsed = elapsed.tv_sec * 100; -+ client->elapsed += elapsed.tv_usec / 10000; -+ } -+ -+ client->elapsed = htons(client->elapsed); -+ -+ log_debug("XMT: Forming Decline."); -+ make_client6_options(client, &client->sent_options, -+ client->active_lease, DHCPV6_DECLINE); -+ dhcpv6_universe.encapsulate(&ds, NULL, NULL, client, NULL, -+ client->sent_options, &global_scope, -+ &dhcpv6_universe); -+ -+ /* Append IA's (but don't release temporary addresses). */ -+ if (wanted_ia_na && -+ dhc6_add_ia_na(client, &ds, client->active_lease, -+ DHCPV6_DECLINE, 0, &added) != ISC_R_SUCCESS) { -+ data_string_forget(&ds, MDL); -+ goto decline_done; -+ } -+ if (wanted_ia_pd && -+ dhc6_add_ia_pd(client, &ds, client->active_lease, -+ DHCPV6_DECLINE, 0, &added) != ISC_R_SUCCESS) { -+ data_string_forget(&ds, MDL); -+ goto decline_done; -+ } -+ -+ /* Transmit and wait. */ -+ log_info("XMT: Decline on %s, interval %ld0ms.", -+ client->name ? client->name : client->interface->name, -+ (long int)client->RT); -+ -+ send_ret = send_packet6(client->interface, ds.data, ds.len, -+ &DHCPv6DestAddr); -+ if (send_ret != ds.len) { -+ log_error("dhc6: sendpacket6() sent %d of %d bytes", -+ send_ret, ds.len); -+ } -+ -+ data_string_forget(&ds, MDL); -+ -+ /* Wait RT */ -+ tv.tv_sec = cur_tv.tv_sec + client->RT / 100; -+ tv.tv_usec = cur_tv.tv_usec + (client->RT % 100) * 10000; -+ if (tv.tv_usec >= 1000000) { -+ tv.tv_sec += 1; -+ tv.tv_usec -= 1000000; -+ } -+ add_timeout(&tv, do_decline6, client, NULL, NULL); -+ dhc6_retrans_advance(client); -+ return; -+ -+decline_done: -+ dhc6_lease_destroy(&client->active_lease, MDL); -+ client->active_lease = NULL; -+ start_init6(client); -+ return; -+} -+ - /* While bound, ignore packets. In the future we'll want to answer - * Reconfigure-Request messages and the like. - */ diff --git a/dhcp-sharedlib.patch b/dhcp-sharedlib.patch deleted file mode 100644 index 4e4869ef901d54b2d98a1429626369536f8db2c4..0000000000000000000000000000000000000000 --- a/dhcp-sharedlib.patch +++ /dev/null @@ -1,149 +0,0 @@ -diff --git a/client/Makefile.am b/client/Makefile.am -index b85f5d2..b1ecf82 100644 ---- a/client/Makefile.am -+++ b/client/Makefile.am -@@ -15,6 +15,6 @@ dhclient_SOURCES = clparse.c dhclient.c dhc6.c \ - scripts/bsdos scripts/freebsd scripts/linux scripts/macos \ - scripts/netbsd scripts/nextstep scripts/openbsd \ - scripts/solaris scripts/openwrt --dhclient_LDADD = ../common/libdhcp.a ../omapip/libomapi.a $(BIND_LIBS) -+dhclient_LDADD = ../common/libdhcp.a ../omapip/libomapi.la $(BIND_LIBS) - man_MANS = dhclient.8 dhclient-script.8 dhclient.conf.5 dhclient.leases.5 - EXTRA_DIST = $(man_MANS) -diff --git a/common/tests/Makefile.am b/common/tests/Makefile.am -index 196aa44..1ccaa05 100644 ---- a/common/tests/Makefile.am -+++ b/common/tests/Makefile.am -@@ -15,22 +15,22 @@ ATF_TESTS += alloc_unittest dns_unittest misc_unittest ns_name_unittest - alloc_unittest_SOURCES = test_alloc.c $(top_srcdir)/tests/t_api_dhcp.c - alloc_unittest_LDADD = $(ATF_LDFLAGS) - alloc_unittest_LDADD += ../libdhcp.a \ -- ../../omapip/libomapi.a $(BIND_LIBS) -+ ../../omapip/libomapi.la $(BIND_LIBS) - - dns_unittest_SOURCES = dns_unittest.c $(top_srcdir)/tests/t_api_dhcp.c - dns_unittest_LDADD = $(ATF_LDFLAGS) - dns_unittest_LDADD += ../libdhcp.a \ -- ../../omapip/libomapi.a $(BIND_LIBS) -+ ../../omapip/libomapi.la $(BIND_LIBS) - - misc_unittest_SOURCES = misc_unittest.c $(top_srcdir)/tests/t_api_dhcp.c - misc_unittest_LDADD = $(ATF_LDFLAGS) - misc_unittest_LDADD += ../libdhcp.a \ -- ../../omapip/libomapi.a $(BIND_LIBS) -+ ../../omapip/libomapi.la $(BIND_LIBS) - - ns_name_unittest_SOURCES = ns_name_test.c $(top_srcdir)/tests/t_api_dhcp.c - ns_name_unittest_LDADD = $(ATF_LDFLAGS) - ns_name_unittest_LDADD += ../libdhcp.a \ -- ../../omapip/libomapi.a $(BIND_LIBS) -+ ../../omapip/libomapi.la $(BIND_LIBS) - - check: $(ATF_TESTS) - @if test $(top_srcdir) != ${top_builddir}; then \ -diff --git a/configure.ac b/configure.ac -index f594cfa..adc98a8 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -47,7 +47,8 @@ AM_CONDITIONAL(CROSS_COMPILING, test "$cross_compiling" = "yes") - # Use this to define _GNU_SOURCE to pull in the IPv6 Advanced Socket API. - AC_USE_SYSTEM_EXTENSIONS - --AC_PROG_RANLIB -+# Use libtool to simplify building of shared libraries -+AC_PROG_LIBTOOL - - AC_PATH_PROG(AR, ar) - AC_SUBST(AR) -diff --git a/dhcpctl/Makefile.am b/dhcpctl/Makefile.am -index fa20a78..dd016e4 100644 ---- a/dhcpctl/Makefile.am -+++ b/dhcpctl/Makefile.am -@@ -1,17 +1,17 @@ - BIND_LIBS = @BIND_LIBS@ - - bin_PROGRAMS = omshell --lib_LIBRARIES = libdhcpctl.a -+lib_LTLIBRARIES = libdhcpctl.la - noinst_PROGRAMS = cltest - man_MANS = omshell.1 dhcpctl.3 - EXTRA_DIST = $(man_MANS) - - omshell_SOURCES = omshell.c --omshell_LDADD = libdhcpctl.a ../common/libdhcp.a ../omapip/libomapi.a \ -+omshell_LDADD = libdhcpctl.la ../common/libdhcp.a ../omapip/libomapi.la \ - $(BIND_LIBS) - --libdhcpctl_a_SOURCES = dhcpctl.c callback.c remote.c -+libdhcpctl_la_SOURCES = dhcpctl.c callback.c remote.c - - cltest_SOURCES = cltest.c --cltest_LDADD = libdhcpctl.a ../common/libdhcp.a ../omapip/libomapi.a \ -+cltest_LDADD = libdhcpctl.la ../common/libdhcp.a ../omapip/libomapi.la \ - $(BIND_LIBS) -diff --git a/omapip/Makefile.am b/omapip/Makefile.am -index b0d2680..265bcef 100644 ---- a/omapip/Makefile.am -+++ b/omapip/Makefile.am -@@ -1,9 +1,9 @@ - BIND_LIBS = @BIND_LIBS@ - --lib_LIBRARIES = libomapi.a -+lib_LTLIBRARIES = libomapi.la - noinst_PROGRAMS = svtest - --libomapi_a_SOURCES = protocol.c buffer.c alloc.c result.c connection.c \ -+libomapi_la_SOURCES = protocol.c buffer.c alloc.c result.c connection.c \ - errwarn.c listener.c dispatch.c generic.c support.c \ - handle.c message.c convert.c hash.c auth.c inet_addr.c \ - array.c trace.c toisc.c iscprint.c isclib.c -@@ -12,5 +12,5 @@ man_MANS = omapi.3 - EXTRA_DIST = $(man_MANS) - - svtest_SOURCES = test.c --svtest_LDADD = libomapi.a $(BIND_LIBS) -+svtest_LDADD = libomapi.la $(BIND_LIBS) - -diff --git a/relay/Makefile.am b/relay/Makefile.am -index c9a1cba..316a524 100644 ---- a/relay/Makefile.am -+++ b/relay/Makefile.am -@@ -4,7 +4,7 @@ AM_CPPFLAGS = -DLOCALSTATEDIR='"@localstatedir@"' - - sbin_PROGRAMS = dhcrelay - dhcrelay_SOURCES = dhcrelay.c --dhcrelay_LDADD = ../common/libdhcp.a ../omapip/libomapi.a \ -+dhcrelay_LDADD = ../common/libdhcp.a ../omapip/libomapi.la \ - $(BIND_LIBS) - man_MANS = dhcrelay.8 - EXTRA_DIST = $(man_MANS) -diff --git a/server/Makefile.am b/server/Makefile.am -index 30cf2b1..f56f310 100644 ---- a/server/Makefile.am -+++ b/server/Makefile.am -@@ -15,8 +15,8 @@ dhcpd_SOURCES = dhcpd.c dhcp.c bootp.c confpars.c db.c class.c failover.c \ - dhcpv6.c mdb6.c ldap.c ldap_casa.c leasechain.c ldap_krb_helper.c - - dhcpd_CFLAGS = $(LDAP_CFLAGS) --dhcpd_LDADD = ../common/libdhcp.a ../omapip/libomapi.a \ -- ../dhcpctl/libdhcpctl.a $(BIND_LIBS) $(LDAP_LIBS) -+dhcpd_LDADD = ../common/libdhcp.a ../omapip/libomapi.la \ -+ ../dhcpctl/libdhcpctl.la $(BIND_LIBS) $(LDAP_LIBS) - - man_MANS = dhcpd.8 dhcpd.conf.5 dhcpd.leases.5 - EXTRA_DIST = $(man_MANS) -diff --git a/server/tests/Makefile.am b/server/tests/Makefile.am -index 771de06..8d8a2c1 100644 ---- a/server/tests/Makefile.am -+++ b/server/tests/Makefile.am -@@ -20,8 +20,8 @@ DHCPSRC = ../dhcp.c ../bootp.c ../confpars.c ../db.c ../class.c \ - ../ddns.c ../dhcpleasequery.c ../dhcpv6.c ../mdb6.c \ - ../ldap.c ../ldap_casa.c ../dhcpd.c ../leasechain.c - --DHCPLIBS = $(top_builddir)/common/libdhcp.a $(top_builddir)/omapip/libomapi.a \ -- $(top_builddir)/dhcpctl/libdhcpctl.a $(BIND_LIBS) -+DHCPLIBS = $(top_builddir)/common/libdhcp.a $(top_builddir)/omapip/libomapi.la \ -+ $(top_builddir)/dhcpctl/libdhcpctl.la $(BIND_LIBS) - - ATF_TESTS = - if HAVE_ATF diff --git a/dhcp-stateless-DUID-LLT.patch b/dhcp-stateless-DUID-LLT.patch deleted file mode 100644 index 72b7b0f7784f2fd31cd44fe5d8f3bd070c421fd0..0000000000000000000000000000000000000000 --- a/dhcp-stateless-DUID-LLT.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff -up dhcp-4.3.4/client/dhclient.c.stateless-DUID-LLT dhcp-4.3.4/client/dhclient.c ---- dhcp-4.3.4/client/dhclient.c.stateless-DUID-LLT 2016-04-29 13:13:50.467360008 +0200 -+++ dhcp-4.3.4/client/dhclient.c 2016-04-29 13:14:53.389375428 +0200 -@@ -1317,6 +1317,9 @@ void run_stateless(int exit_mode, u_int1 - data_string_forget(&default_duid, MDL); - - form_duid(&default_duid, MDL); -+ if (form_duid(&default_duid, MDL) == ISC_R_SUCCESS && -+ duid_type == DUID_LLT) -+ write_duid(&default_duid); - } - - #ifdef DHCP4o6 diff --git a/dhcp.spec b/dhcp.spec index 2fd44f8404cd0a1f5ba156c82f7b434ab1c785c9..6325e0c2c65c3da43edfa794ec64eb827566097e 100644 --- a/dhcp.spec +++ b/dhcp.spec @@ -2,75 +2,56 @@ %global dhcpconfdir %{_sysconfdir}/dhcp Name: dhcp -Version: 4.3.6 -Release: 37 +Version: 4.4.2 +Release: 1 Summary: Dynamic host configuration protocol software #Please don't change the epoch on this package Epoch: 12 License: ISC URL: https://www.isc.org/dhcp/ Source0: http://ftp.isc.org/isc/dhcp/%{version}/dhcp-%{version}.tar.gz -Source1: dhclient-script -Source2: README.dhclient.d -Source3: 11-dhclient -Source4: 12-dhcpd -Source5: 56dhclient -Source6: dhcpd.service -Source7: dhcpd6.service -Source8: dhcrelay.service - -Patch0: dhcp-remove-bind.patch - -Patch1: dhcp-sharedlib.patch - -Patch2: dhcp-dhclient-options.patch -Patch3: dhcp-release-by-ifup.patch -Patch4: dhcp-dhclient-decline-backoff.patch -Patch5: dhcp-unicast-bootp.patch -Patch6: dhcp-default-requested-options.patch - -Patch8: dhcp-paths.patch -Patch9: dhcp-CLOEXEC.patch -Patch10: dhcp-garbage-chars.patch -Patch11: dhcp-add_timeout_when_NULL.patch -Patch12: dhcp-64_bit_lease_parse.patch -Patch13: dhcp-capability.patch - -Patch14: dhcp-sendDecline.patch -Patch15: dhcp-rfc3442-classless-static-routes.patch -Patch16: dhcp-honor-expired.patch -Patch17: dhcp-PPP.patch - -Patch18: dhcp-lpf-ib.patch -Patch19: dhcp-IPoIB-log-id.patch -Patch20: dhcp-improved-xid.patch - -Patch21: dhcp-client-request-release-bind-iface.patch -Patch22: dhcp-no-subnet-error2info.patch -Patch23: dhcp-sd_notify.patch - -Patch24: dhcp-option97-pxe-client-id.patch -Patch25: dhcp-stateless-DUID-LLT.patch -Patch26: dhcp-dhclient-preinit6s.patch -Patch27: dhcp-handle_ctx_signals.patch -Patch28: dhcp-4.3.6-omapi-leak.patch -Patch29: dhcp-4.3.6-isc-util.patch -Patch30: dhcp-4.3.6-options_overflow.patch -Patch31: dhcp-4.3.6-reference_count_overflow.patch -Patch32: dhcp-iface_hwaddr_discovery.patch - -Patch6000: Correct-BIND9-dns-API-call-constant.patch -Patch6001: Corrected-dhclient-command-line-parsing-of-dad-wait-.patch -Patch6002: CVE-2019-6470.patch -Patch6003: bugfix-dhcp-4.2.5-check-dhclient-pid.patch -Patch6004: bugfix-reduce-getifaddr-calls.patch - -Patch9000: dhcp-fix-dhclient-default-len-64-to-128.patch -Patch9001: bugfix-dhcpd-2038-problem.patch -Patch9002: adds-address-prefix-len-to-dhclient-cli.patch -Patch9003: dhcpd-coredump-infiniband.patch -Patch9004: bugfix-dhclient-check-if-pid-was-held.patch - +Source1: dhclient-script +Source2: README.dhclient.d +Source3: 11-dhclient +Source5: 56dhclient +Source6: dhcpd.service +Source7: dhcpd6.service +Source8: dhcrelay.service + +Patch1: 0001-change-bug-url.patch +Patch2: 0002-additional-dhclient-options.patch +Patch3: 0003-Handle-releasing-interfaces-requested-by-sbin-ifup.patch +Patch4: 0004-Support-unicast-BOOTP-for-IBM-pSeries-systems-and-ma.patch +Patch5: 0005-Change-default-requested-options.patch +Patch6: 0006-Various-man-page-only-fixes.patch +Patch7: 0007-Change-paths-to-conform-to-our-standards.patch +Patch8: 0008-Make-sure-all-open-file-descriptors-are-closed-on-ex.patch +Patch9: 0009-Fix-garbage-in-format-string-error.patch +Patch10: 0010-Handle-null-timeout.patch +Patch11: 0011-Drop-unnecessary-capabilities.patch +Patch12: 0012-RFC-3442-Classless-Static-Route-Option-for-DHCPv4-51.patch +Patch13: 0013-DHCPv6-over-PPP-support-626514.patch +Patch14: 0014-IPoIB-support-660681.patch +Patch15: 0015-Add-GUID-DUID-to-dhcpd-logs-1064416.patch +Patch16: 0016-Turn-on-creating-sending-of-DUID.patch +Patch17: 0017-Send-unicast-request-release-via-correct-interface.patch +Patch18: 0018-No-subnet-declaration-for-iface-should-be-info-not-e.patch +Patch19: 0019-dhclient-write-DUID_LLT-even-in-stateless-mode-11563.patch +Patch20: 0020-Discover-all-hwaddress-for-xid-uniqueness.patch +Patch21: 0021-Load-leases-DB-in-non-replay-mode-only.patch +Patch22: 0022-dhclient-make-sure-link-local-address-is-ready-in-st.patch +Patch23: 0023-option-97-pxe-client-id.patch +Patch24: 0024-Detect-system-time-changes.patch +Patch25: 0025-bind-Detect-system-time-changes.patch +Patch26: 0026-Add-dhclient-5-B-option-description.patch +Patch27: 0027-Add-missed-sd-notify-patch-to-manage-dhcpd-with-syst.patch + +Patch28: bugfix-dhcp-4.2.5-check-dhclient-pid.patch +Patch29: bugfix-reduce-getifaddr-calls.patch + +Patch30: bugfix-dhcpd-2038-problem.patch +Patch31: dhcpd-coredump-infiniband.patch +Patch32: bugfix-dhclient-check-if-pid-was-held.patch BuildRequires: gcc autoconf automake libtool openldap-devel krb5-devel libcap-ng-devel bind-export-devel BuildRequires: systemd systemd-devel @@ -103,12 +84,16 @@ libdhcpctl and libomapi static libraries are also included in this package. %package_help %prep -%autosetup -n %{name}-%{version} -p1 -rm bind/bind.tar.gz +%setup -n %{name}-%{version} +pushd bind +tar -xvf bind.tar.gz +ln -s bind-9* bind +popd +%autopatch -p1 +#rm bind/bind.tar.gz sed -i -e 's|/var/db/|%{_localstatedir}/lib/dhcpd/|g' contrib/dhcp-lease-list.pl - %build autoreconf --verbose --force --install @@ -122,10 +107,10 @@ CFLAGS="%{optflags} -fno-strict-aliasing" \ --with-cli-pid-file=%{_localstatedir}/run/dhclient.pid \ --with-cli6-pid-file=%{_localstatedir}/run/dhclient6.pid \ --with-relay-pid-file=%{_localstatedir}/run/dhcrelay.pid \ - --with-libbind=/usr/bin/isc-export-config.sh \ --with-ldap --with-ldapcrypto --with-ldap-gssapi --disable-static --enable-log-pid --enable-paranoia --enable-early-chroot \ --enable-binary-leases --with-systemd -%make_build + +make %install %make_install @@ -138,7 +123,6 @@ mkdir -p $RPM_BUILD_ROOT%{dhcpconfdir}/dhclient.d mkdir -p $RPM_BUILD_ROOT%{nmconfdir}/dispatcher.d install -p -m 0755 %{SOURCE3} $RPM_BUILD_ROOT%{nmconfdir}/dispatcher.d -install -p -m 0755 %{SOURCE4} $RPM_BUILD_ROOT%{nmconfdir}/dispatcher.d install -D -p -m 0755 %{SOURCE5} $RPM_BUILD_ROOT%{_libdir}/pm-utils/sleep.d/56dhclient @@ -258,11 +242,11 @@ exit 0 %dir %{_sysconfdir}/openldap/schema %config(noreplace) %{_sysconfdir}/openldap/schema/dhcp.schema %attr(0750,root,root) %dir %{dhcpconfdir} +%dir %{_localstatedir}/lib/dhclient %dir %{dhcpconfdir}/dhclient.d %dir %{_sysconfdir}/NetworkManager %dir %{_sysconfdir}/NetworkManager/dispatcher.d %{_sysconfdir}/NetworkManager/dispatcher.d/11-dhclient -%{_sysconfdir}/NetworkManager/dispatcher.d/12-dhcpd %attr(0644,root,root) %{_unitdir}/dhcpd.service %attr(0644,root,root) %{_unitdir}/dhcpd6.service %attr(0644,root,root) %{_unitdir}/dhcrelay.service @@ -276,10 +260,6 @@ exit 0 %{_sbindir}/dhclient-script %{_sbindir}/dhcrelay %{_bindir}/omshell -%{_libdir}/libdhcpctl.so.* -%{_libdir}/libomapi.so.* -%{_libdir}/libdhcpctl.so -%{_libdir}/libomapi.so %attr(0755,root,root) %{_libdir}/pm-utils/sleep.d/56dhclient %files devel @@ -287,7 +267,8 @@ exit 0 %doc doc/IANA-arp-parameters doc/api+protocol %{_includedir}/dhcpctl %{_includedir}/omapip -%{_includedir}/isc-dhcp +%{_libdir}/libdhcp*.a +%{_libdir}/libomapi.a %files help @@ -308,17 +289,23 @@ exit 0 %{_mandir}/man3/omapi.3.gz %changelog +* Wed Jul 22 2020 gaihuiying - 4.4.2-1 +- Type:requirement +- ID:NA +- SUG:restart +- DESC: update to 4.4.2 + * Tue Mar 3 2020 zhanglu - 4.3.6-37 - Type:bugfix - ID:NA - SUG:restart - DESC: recheck if last pid was held by other process -* Fri Feb 21 2020 zhanglu - 4.3.6-36 -- Type:enhancement +* Thu Feb 27 2020 zhanglu - 4.3.6-36 +- Type:bugfix - ID:NA -- SUG:NA -- DESC: add make check +- SUG:restart +- DESC: check if last pid when held by other process * Wed Jan 22 2020 zhanglu - 4.3.6-35 - Type:bugfix