From nobody Mon Jul 10 16:00:59 2023 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4R07yh3dLBzZZww; Mon, 10 Jul 2023 16:01:00 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4R07yh1GCHz4lHG; Mon, 10 Jul 2023 16:01:00 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1689004860; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=/mDZBOiOlo4JVU32WyUuxOu6kRZt/h5Xwaa/LZrwDMc=; b=qsr4fTctKboFnYZVazDy3dJ3IWgAQ4Joktsl5pTyRn6LJwDralQCRtR8feaFRTysBqAtpq r4PqRuEhcfFq+HZSp15y/vBc9ol2QsjVwNg7bfx3Zzh0U2eKyPnCpOBKfxUoP4Cw5OiY95 6EeTpGHGXPIxKyEMp96Nq7N6rX1GOT/HRC5bevqZGbu5l/OJb3UVqmM+7zFxC/FVv6gnzJ s1PwytuwZ1zpcVQlqDcjHU9af5tShKz7bSnzVcIWazrSeoLLIJ4xVe7UvJCN6RwH7SbwJt U0rDDtCBprEfI7McddKM1f2mycdujtoqIzZLSURRbFrBBEdyiFVnYTKcwd4Slg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1689004860; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=/mDZBOiOlo4JVU32WyUuxOu6kRZt/h5Xwaa/LZrwDMc=; b=vBU/MXuiIna5GwZgSCFC5ZP7ATWid96Q8nE79FXdvh7LWRdBd7gWG0h9tVdIsfrY4/uoUY NP9qo8sfdrcNMY+UY7XcwMADMaYl3Bm2zGCQoaTkDM0wNq4fAFGU0KO6AXhsnJAjBg7LtN dwqMOlXnbvWKuggugNs0kIOuSPy06+Vok76PMWnaxE2fYkt40JZ67JUje7TloiONgYmiDI 1dZpl59+d0LaeF4kJsrXg0scyfYuPCgaGYuhCabIG/MYs5LQdfo0zLChvR9HeQHHGkiB93 1KI5/lVPzhnvWqQ2AfTj4GW0VsmNx2+cDKqLLDz+REhGnMSRMPbJ+XaMq196TA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1689004860; a=rsa-sha256; cv=none; b=VGmhWQ0zrLL7JCrt11CWI2B9e8r6yk0HpjfLT9FxNkOREhr2Oea6S5PfPavXJljgSKkZgn aUQYUVPLgHWdmmv1Cjp0qk9Zz4Ld65EOBMJ+AXEgcx+oSd1ilpKhSyHS8RAT35Fdrl7BTU TNy+/o5mB+aEMEEY2pwvc7GlcxBKXosqQW3IEQDXPuJ8F5tA3iJ35lGfi+mGfHNf46k8aS 3tcjaA2QUJUwcr7RVIzVvw1xwrMoC50vRiGr2Ox/GdPYHTZGzN8dambg9Jy19oIByI0Xrm EPNPLyh8E052bF1zBsAldYd3srByO/EdaJt9CuE7yq0NhzG+Ndm5DExXv7INUg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4R07yh0MwtzqKp; Mon, 10 Jul 2023 16:01:00 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 36AG0xin015336; Mon, 10 Jul 2023 16:00:59 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 36AG0xNe015335; Mon, 10 Jul 2023 16:00:59 GMT (envelope-from git) Date: Mon, 10 Jul 2023 16:00:59 GMT Message-Id: <202307101600.36AG0xNe015335@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Eric van Gyzen Subject: git: c210cac00f25 - main - dhclient: fix time parsing for leases expiring after 2038 List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: vangyzen X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: c210cac00f2584f031b56b4cdd2e801dbb9e1348 Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by vangyzen: URL: https://cgit.FreeBSD.org/src/commit/?id=c210cac00f2584f031b56b4cdd2e801dbb9e1348 commit c210cac00f2584f031b56b4cdd2e801dbb9e1348 Author: Alex Bahm AuthorDate: 2023-07-10 15:56:05 +0000 Commit: Eric van Gyzen CommitDate: 2023-07-10 16:00:34 +0000 dhclient: fix time parsing for leases expiring after 2038 Convert lease parsing to timegm to calculate timestamp. For reference, when writing the lease, we use gmtime to convert the timestamp to struct tm. Reviewed By: markj, vangyzen MFC after: 2 weeks Sponsored by: Dell EMC Isilon Differential Revision: https://reviews.freebsd.org/D40760 --- sbin/dhclient/parse.c | 28 ++----------------- sbin/dhclient/tests/Makefile | 3 +- sbin/dhclient/tests/fake.c | 15 ++++++++++ sbin/dhclient/tests/option-domain-search.c | 45 ++++++++++++++++++++++++++++++ 4 files changed, 64 insertions(+), 27 deletions(-) diff --git a/sbin/dhclient/parse.c b/sbin/dhclient/parse.c index 4018f70f3a5d..70e2013d0813 100644 --- a/sbin/dhclient/parse.c +++ b/sbin/dhclient/parse.c @@ -444,9 +444,7 @@ convert_num(unsigned char *buf, char *str, unsigned base, int size) time_t parse_date(FILE *cfile) { - static int months[11] = { 31, 59, 90, 120, 151, 181, - 212, 243, 273, 304, 334 }; - int guess, token; + int token; struct tm tm; char *val; @@ -570,27 +568,5 @@ parse_date(FILE *cfile) return (0); } - /* Guess the time value... */ - guess = ((((((365 * (tm.tm_year - 70) + /* Days in years since '70 */ - (tm.tm_year - 69) / 4 + /* Leap days since '70 */ - (tm.tm_mon /* Days in months this year */ - ? months[tm.tm_mon - 1] - : 0) + - (tm.tm_mon > 1 && /* Leap day this year */ - !((tm.tm_year - 72) & 3)) + - tm.tm_mday - 1) * 24) + /* Day of month */ - tm.tm_hour) * 60) + - tm.tm_min) * 60) + tm.tm_sec; - - /* - * This guess could be wrong because of leap seconds or other - * weirdness we don't know about that the system does. For - * now, we're just going to accept the guess, but at some point - * it might be nice to do a successive approximation here to get - * an exact value. Even if the error is small, if the server - * is restarted frequently (and thus the lease database is - * reread), the error could accumulate into something - * significant. - */ - return (guess); + return (timegm(&tm)); } diff --git a/sbin/dhclient/tests/Makefile b/sbin/dhclient/tests/Makefile index ce4c7acb822e..790d3dbcccce 100644 --- a/sbin/dhclient/tests/Makefile +++ b/sbin/dhclient/tests/Makefile @@ -6,7 +6,8 @@ ATF_TESTS_SH= pcp PLAIN_TESTS_C= option-domain-search_test SRCS.option-domain-search_test= alloc.c convert.c hash.c options.c \ - tables.c fake.c option-domain-search.c + tables.c parse.c conflex.c tree.c fake.c \ + option-domain-search.c CFLAGS.option-domain-search_test+= -I${.CURDIR:H} LIBADD.option-domain-search_test= util diff --git a/sbin/dhclient/tests/fake.c b/sbin/dhclient/tests/fake.c index 6a170953beb0..17b721527f04 100644 --- a/sbin/dhclient/tests/fake.c +++ b/sbin/dhclient/tests/fake.c @@ -7,6 +7,7 @@ #include "dhcpd.h" extern jmp_buf env; +int warnings_occurred; void error(const char *fmt, ...) @@ -52,6 +53,20 @@ note(const char *fmt, ...) return ret; } +int +parse_warn(const char *fmt, ...) +{ + int ret; + va_list ap; + + va_start(ap, fmt); + ret = vfprintf(stderr, fmt, ap); + va_end(ap); + fprintf(stderr, "\n"); + + return ret; +} + void bootp(struct packet *packet) { diff --git a/sbin/dhclient/tests/option-domain-search.c b/sbin/dhclient/tests/option-domain-search.c index b79f9a560137..a3517c9c1dc1 100644 --- a/sbin/dhclient/tests/option-domain-search.c +++ b/sbin/dhclient/tests/option-domain-search.c @@ -303,6 +303,49 @@ multiple_domains_valid() free(option->data); } +static +void +parse_date_helper(const char *string, time_t timestamp) +{ + int ret = 0; + FILE *file = NULL; + time_t ts; + + file = fopen("/tmp/dhclient.test", "w"); + if (!file) + abort(); + + ret = fwrite(string, strlen(string), 1, file); + if (ret <= 0) + abort(); + + fclose(file); + + file = fopen("/tmp/dhclient.test", "r"); + if (!file) + abort(); + + new_parse("test"); + ts = parse_date(file); + if (ts != timestamp) + abort(); + + fclose(file); +} + +void +parse_date_valid(void) +{ + int ret; + + ret = setjmp(env); + if (ret != 0) + abort(); + + parse_date_helper(" 2 2024/7/2 20:25:50;\n", 1719951950); + parse_date_helper(" 1 2091/7/2 20:25:50;\n", 3834246350); +} + int main(int argc, char *argv[]) { @@ -324,5 +367,7 @@ main(int argc, char *argv[]) multiple_domains_valid(); + parse_date_valid(); + return (0); }