commit e560b1c
Michael Forney
·
2026-03-04 23:54:45 +0000 UTC
parent eb8f6bd
openbsd: Update to 7.8
10 files changed,
+121,
-73
1@@ -1,4 +1,4 @@
2-From 05fd24cc7b3f1b73a58d41d70ef725925007165c Mon Sep 17 00:00:00 2001
3+From 941679ac1af45e3359fa28172cd9339727c08a17 Mon Sep 17 00:00:00 2001
4 From: Michael Forney <mforney@mforney.org>
5 Date: Mon, 2 Dec 2019 21:11:04 -0800
6 Subject: [PATCH] nc: Portability fixes from libressl-portable
7@@ -8,7 +8,7 @@ Subject: [PATCH] nc: Portability fixes from libressl-portable
8 1 file changed, 48 insertions(+), 7 deletions(-)
9
10 diff --git a/usr.bin/nc/netcat.c b/usr.bin/nc/netcat.c
11-index 8c60fd18826..b5129c2204d 100644
12+index e3c9c939e24..9d182198089 100644
13 --- a/usr.bin/nc/netcat.c
14 +++ b/usr.bin/nc/netcat.c
15 @@ -93,9 +93,13 @@ int zflag; /* Port Scan Flag */
16@@ -25,7 +25,7 @@ index 8c60fd18826..b5129c2204d 100644
17
18 int usetls; /* use TLS */
19 const char *Cflag; /* Public cert file */
20-@@ -268,12 +272,14 @@ main(int argc, char *argv[])
21+@@ -271,12 +275,14 @@ main(int argc, char *argv[])
22 case 'u':
23 uflag = 1;
24 break;
25@@ -40,7 +40,7 @@ index 8c60fd18826..b5129c2204d 100644
26 case 'v':
27 vflag = 1;
28 break;
29-@@ -320,9 +326,11 @@ main(int argc, char *argv[])
30+@@ -323,9 +329,11 @@ main(int argc, char *argv[])
31 case 'o':
32 oflag = optarg;
33 break;
34@@ -52,7 +52,7 @@ index 8c60fd18826..b5129c2204d 100644
35 case 'T':
36 errstr = NULL;
37 errno = 0;
38-@@ -346,9 +354,11 @@ main(int argc, char *argv[])
39+@@ -349,9 +357,11 @@ main(int argc, char *argv[])
40 argc -= optind;
41 argv += optind;
42
43@@ -64,7 +64,7 @@ index 8c60fd18826..b5129c2204d 100644
44
45 /* Cruft to make sure options are clean, and used properly. */
46 if (argc == 1 && family == AF_UNIX) {
47-@@ -923,7 +933,10 @@ remote_connect(const char *host, const char *port, struct addrinfo hints,
48+@@ -928,7 +938,10 @@ remote_connect(const char *host, const char *port, struct addrinfo hints,
49 char *ipaddr)
50 {
51 struct addrinfo *res, *res0;
52@@ -76,7 +76,7 @@ index 8c60fd18826..b5129c2204d 100644
53
54 if ((error = getaddrinfo(host, port, &hints, &res0)))
55 errx(1, "getaddrinfo for host \"%s\" port %s: %s", host,
56-@@ -938,8 +951,10 @@ remote_connect(const char *host, const char *port, struct addrinfo hints,
57+@@ -943,8 +956,10 @@ remote_connect(const char *host, const char *port, struct addrinfo hints,
58 if (sflag || pflag) {
59 struct addrinfo ahints, *ares;
60
61@@ -87,7 +87,7 @@ index 8c60fd18826..b5129c2204d 100644
62 memset(&ahints, 0, sizeof(struct addrinfo));
63 ahints.ai_family = res->ai_family;
64 ahints.ai_socktype = uflag ? SOCK_DGRAM : SOCK_STREAM;
65-@@ -1031,8 +1046,11 @@ int
66+@@ -1036,8 +1051,11 @@ int
67 local_listen(const char *host, const char *port, struct addrinfo hints)
68 {
69 struct addrinfo *res, *res0;
70@@ -100,7 +100,7 @@ index 8c60fd18826..b5129c2204d 100644
71
72 /* Allow nodename to be null. */
73 hints.ai_flags |= AI_PASSIVE;
74-@@ -1052,9 +1070,11 @@ local_listen(const char *host, const char *port, struct addrinfo hints)
75+@@ -1057,9 +1075,11 @@ local_listen(const char *host, const char *port, struct addrinfo hints)
76 res->ai_protocol)) == -1)
77 continue;
78
79@@ -112,7 +112,7 @@ index 8c60fd18826..b5129c2204d 100644
80
81 set_common_sockopts(s, res->ai_family);
82
83-@@ -1559,11 +1579,13 @@ set_common_sockopts(int s, int af)
84+@@ -1564,11 +1584,13 @@ set_common_sockopts(int s, int af)
85 {
86 int x = 1;
87
88@@ -126,7 +126,7 @@ index 8c60fd18826..b5129c2204d 100644
89 if (Dflag) {
90 if (setsockopt(s, SOL_SOCKET, SO_DEBUG,
91 &x, sizeof(x)) == -1)
92-@@ -1574,9 +1596,16 @@ set_common_sockopts(int s, int af)
93+@@ -1579,9 +1601,16 @@ set_common_sockopts(int s, int af)
94 IP_TOS, &Tflag, sizeof(Tflag)) == -1)
95 err(1, "set IP ToS");
96
97@@ -143,7 +143,7 @@ index 8c60fd18826..b5129c2204d 100644
98 }
99 if (Iflag) {
100 if (setsockopt(s, SOL_SOCKET, SO_RCVBUF,
101-@@ -1600,13 +1629,17 @@ set_common_sockopts(int s, int af)
102+@@ -1605,13 +1634,17 @@ set_common_sockopts(int s, int af)
103 }
104
105 if (minttl != -1) {
106@@ -162,7 +162,7 @@ index 8c60fd18826..b5129c2204d 100644
107 }
108 }
109
110-@@ -1831,14 +1864,22 @@ help(void)
111+@@ -1841,14 +1874,22 @@ help(void)
112 \t-P proxyuser\tUsername for proxy authentication\n\
113 \t-p port\t Specify local port for remote connects\n\
114 \t-R CAfile CA bundle\n\
1@@ -1,4 +1,4 @@
2-From e62d415fb66744cac915dc1873e09774a705d536 Mon Sep 17 00:00:00 2001
3+From 7770f53d7d46a5dee46478caa4d0bda8d7cf9b9c Mon Sep 17 00:00:00 2001
4 From: Michael Forney <mforney@mforney.org>
5 Date: Thu, 4 Jun 2020 21:36:11 -0700
6 Subject: [PATCH] pax: Fix some incorrect format specifiers
1@@ -1,4 +1,4 @@
2-From dc49fca08adc0fd8cd9565f2aeca6dc2c8d1fbd2 Mon Sep 17 00:00:00 2001
3+From fadd8482d8e37f8ff1a61a8d8060e83cec744222 Mon Sep 17 00:00:00 2001
4 From: Michael Forney <mforney@mforney.org>
5 Date: Thu, 4 Jun 2020 21:44:26 -0700
6 Subject: [PATCH] pax: Use memcpy to set TMAGIC and TVERSION to avoid warning
7@@ -8,10 +8,10 @@ Subject: [PATCH] pax: Use memcpy to set TMAGIC and TVERSION to avoid warning
8 1 file changed, 4 insertions(+), 4 deletions(-)
9
10 diff --git a/bin/pax/tar.c b/bin/pax/tar.c
11-index a0cbb31b547..095eef85af0 100644
12+index 1c5065ce655..ac6f3c60d94 100644
13 --- a/bin/pax/tar.c
14 +++ b/bin/pax/tar.c
15-@@ -1055,8 +1055,8 @@ wr_xheader(ARCHD *arcn, struct xheader *xhdr)
16+@@ -1056,8 +1056,8 @@ wr_xheader(char *fname, HD_USTAR *fhd, struct xheader *xhdr)
17 memset(hdblk, 0, sizeof(hdblk));
18 hd = (HD_USTAR *)hdblk;
19 hd->typeflag = XHDRTYPE;
20@@ -20,9 +20,9 @@ index a0cbb31b547..095eef85af0 100644
21 + memcpy(hd->magic, TMAGIC, TMAGLEN);
22 + memcpy(hd->version, TVERSION, TVERSLEN);
23 if (ul_oct(size, hd->size, sizeof(hd->size), 3))
24- return -1;
25+ goto out;
26
27-@@ -1263,8 +1263,8 @@ wr_ustar_or_pax(ARCHD *arcn, int ustar)
28+@@ -1276,8 +1276,8 @@ wr_ustar_or_pax(ARCHD *arcn, int ustar)
29 break;
30 }
31
1@@ -1,4 +1,4 @@
2-From 67ffb8812ee7ac5fe23a5149ff643d1f392fb1f5 Mon Sep 17 00:00:00 2001
3+From d287356e4da2f2bc232df9bc13821738ffbe5299 Mon Sep 17 00:00:00 2001
4 From: Michael Forney <mforney@mforney.org>
5 Date: Fri, 23 Apr 2021 20:10:05 -0700
6 Subject: [PATCH] acme-client: Fix signed-ness of base64buf_url input
7@@ -96,7 +96,7 @@ index 2b6377f0d81..0d84ad4b458 100644
8 size_t i, sz;
9 char *buf;
10 diff --git a/usr.sbin/acme-client/extern.h b/usr.sbin/acme-client/extern.h
11-index 915f80e3992..5b0950b0693 100644
12+index 46a1387f5bc..37820e6cfb6 100644
13 --- a/usr.sbin/acme-client/extern.h
14 +++ b/usr.sbin/acme-client/extern.h
15 @@ -244,7 +244,7 @@ int checkexit_ext(int *, pid_t, enum comp);
16@@ -132,10 +132,10 @@ index a3b6666c279..f0df9f292d4 100644
17 goto out;
18 } else if ((der64 = base64buf_url(der, len)) == NULL) {
19 diff --git a/usr.sbin/acme-client/revokeproc.c b/usr.sbin/acme-client/revokeproc.c
20-index 0f1bf32678b..58e81233f1a 100644
21+index 65170078226..493a9ea9752 100644
22 --- a/usr.sbin/acme-client/revokeproc.c
23 +++ b/usr.sbin/acme-client/revokeproc.c
24-@@ -63,7 +63,9 @@ revokeproc(int fd, const char *certfile, int force,
25+@@ -77,7 +77,9 @@ revokeproc(int fd, const char *certfile, int force,
26 int revocate, const char *const *alts, size_t altsz)
27 {
28 GENERAL_NAMES *sans = NULL;
29@@ -146,7 +146,7 @@ index 0f1bf32678b..58e81233f1a 100644
30 int rc = 0, cc, i, len;
31 size_t *found = NULL;
32 FILE *f = NULL;
33-@@ -240,7 +242,7 @@ revokeproc(int fd, const char *certfile, int force,
34+@@ -260,7 +262,7 @@ revokeproc(int fd, const char *certfile, int force,
35 } else if ((der = dercp = malloc(len)) == NULL) {
36 warn("malloc");
37 goto out;
1@@ -1,4 +1,4 @@
2-From 1ab0f94943e02c49d88a358351914f9032a5bca3 Mon Sep 17 00:00:00 2001
3+From 6abdd6eef47b5ff9a34536acbec947d2c9a3cebc Mon Sep 17 00:00:00 2001
4 From: Michael Forney <mforney@mforney.org>
5 Date: Fri, 23 Apr 2021 23:14:16 -0700
6 Subject: [PATCH] acme-client: Port to BearSSL
7@@ -9,8 +9,8 @@ Subject: [PATCH] acme-client: Port to BearSSL
8 usr.sbin/acme-client/key.c | 329 ++++++++++++++++++++++++------
9 usr.sbin/acme-client/key.h | 22 +-
10 usr.sbin/acme-client/keyproc.c | 198 ++++++------------
11- usr.sbin/acme-client/revokeproc.c | 237 ++++++++++-----------
12- 6 files changed, 564 insertions(+), 525 deletions(-)
13+ usr.sbin/acme-client/revokeproc.c | 260 +++++++++++------------
14+ 6 files changed, 566 insertions(+), 546 deletions(-)
15
16 diff --git a/usr.sbin/acme-client/acctproc.c b/usr.sbin/acme-client/acctproc.c
17 index 9e97a8bb760..8d66dac49d9 100644
18@@ -1213,10 +1213,10 @@ index f0df9f292d4..fc7de74b616 100644
19 return rc;
20 }
21 diff --git a/usr.sbin/acme-client/revokeproc.c b/usr.sbin/acme-client/revokeproc.c
22-index 58e81233f1a..378de35f662 100644
23+index 493a9ea9752..82e31792f3b 100644
24 --- a/usr.sbin/acme-client/revokeproc.c
25 +++ b/usr.sbin/acme-client/revokeproc.c
26-@@ -22,58 +22,54 @@
27+@@ -22,73 +22,53 @@
28 #include <stdio.h>
29 #include <stdlib.h>
30 #include <string.h>
31@@ -1232,29 +1232,46 @@ index 58e81233f1a..378de35f662 100644
32
33 #include "extern.h"
34
35- #define RENEW_ALLOW (30 * 24 * 60 * 60)
36-
37 -/*
38-- * Convert the X509's expiration time into a time_t value.
39+- * Convert the X509's notAfter time into a time_t value.
40+- */
41+-static time_t
42+-X509notafter(X509 *x)
43+-{
44+- ASN1_TIME *atim;
45+- struct tm t;
46+-
47+- if ((atim = X509_getm_notAfter(x)) == NULL)
48+- return -1;
49+-
50+- memset(&t, 0, sizeof(t));
51+-
52+- if (!ASN1_TIME_to_tm(atim, &t))
53+- return -1;
54+-
55+- return timegm(&t);
56+-}
57+-
58+-/*
59+- * Convert the X509's notBefore time into a time_t value.
60 - */
61 -static time_t
62--X509expires(X509 *x)
63+-X509notbefore(X509 *x)
64 +static void
65 +append_cert(void *ctx, const void *buf, size_t len)
66 {
67 - ASN1_TIME *atim;
68 - struct tm t;
69 -
70-- if ((atim = X509_getm_notAfter(x)) == NULL) {
71-- warnx("missing notAfter");
72+- if ((atim = X509_getm_notBefore(x)) == NULL)
73 - return -1;
74-- }
75 -
76 - memset(&t, 0, sizeof(t));
77 -
78-- if (!ASN1_TIME_to_tm(atim, &t)) {
79-- warnx("invalid ASN1_TIME");
80+- if (!ASN1_TIME_to_tm(atim, &t))
81 - return -1;
82+-
83+- return timegm(&t);
84 + br_x509_certificate *cert = ctx;
85 + size_t newlen;
86 + unsigned char *newdata;
87@@ -1269,9 +1286,7 @@ index 58e81233f1a..378de35f662 100644
88 + } else {
89 + warn("realloc");
90 + cert->data_len = -1;
91- }
92--
93-- return timegm(&t);
94++ }
95 }
96
97 int
98@@ -1298,12 +1313,13 @@ index 58e81233f1a..378de35f662 100644
99 + uint32_t days, secs;
100 long lval;
101 enum revokeop op, rop;
102- time_t t;
103+ time_t notafter, notbefore, cert_validity;
104+ time_t remaining_validity, renew_allow;
105 - size_t j;
106
107 /*
108 * First try to open the certificate before we drop privileges
109-@@ -88,8 +84,6 @@ revokeproc(int fd, const char *certfile, int force,
110+@@ -103,8 +83,6 @@ revokeproc(int fd, const char *certfile, int force,
111
112 /* File-system and sandbox jailing. */
113
114@@ -1312,7 +1328,7 @@ index 58e81233f1a..378de35f662 100644
115 if (pledge("stdio", NULL) == -1) {
116 warn("pledge");
117 goto out;
118-@@ -113,39 +107,86 @@ revokeproc(int fd, const char *certfile, int force,
119+@@ -128,44 +106,88 @@ revokeproc(int fd, const char *certfile, int force,
120 goto out;
121 }
122
123@@ -1365,25 +1381,22 @@ index 58e81233f1a..378de35f662 100644
124
125 /* Read out the expiration date. */
126
127-- if ((t = X509expires(x)) == -1) {
128-- warnx("X509expires");
129+- if ((notafter = X509notafter(x)) == -1) {
130+- warnx("X509notafter");
131 + br_x509_decoder_init(&xd, NULL, NULL);
132 + br_x509_decoder_push(&xd, cert.data, cert.data_len);
133 + if ((err = br_x509_decoder_last_error(&xd)) != 0) {
134 + warnx("%s: X.509 decoding error %d", certfile, err);
135 goto out;
136 }
137-+ br_x509_decoder_get_notafter(&xd, &days, &secs);
138-+ t = 86400ll * (days - 719528) + 86400;
139-
140-- /* Extract list of SAN entries from the certificate. */
141 -
142-- sans = X509_get_ext_d2i(x, NID_subject_alt_name, NULL, NULL);
143-- if (sans == NULL) {
144-- warnx("%s: does not have a SAN entry", certfile);
145-- if (revocate)
146-- goto out;
147-- force = 2;
148+- if ((notbefore = X509notbefore(x)) == -1) {
149+- warnx("X509notbefore");
150++ br_x509_decoder_get_notafter(&xd, &days, &secs);
151++ notafter = 86400ll * (days - 719528) + 86400;
152++ br_x509_decoder_get_notbefore(&xd, &days, &secs);
153++ notbefore = 86400ll * (days - 719528) + 86400;
154++
155 + for (i = 0, altmax = 0; i < altsz; ++i) {
156 + altlen = strlen(alts[i]) + 1;
157 + if (altlen > altmax)
158@@ -1393,8 +1406,17 @@ index 58e81233f1a..378de35f662 100644
159 + if ((elts = calloc(eltsz, sizeof(elts[0]))) == NULL ||
160 + (sans = calloc(eltsz, altmax)) == NULL) {
161 + warn("calloc");
162-+ goto out;
163-+ }
164+ goto out;
165+ }
166+-
167+- /* Extract list of SAN entries from the certificate. */
168+-
169+- sans = X509_get_ext_d2i(x, NID_subject_alt_name, NULL, NULL);
170+- if (sans == NULL) {
171+- warnx("%s: does not have a SAN entry", certfile);
172+- if (revocate)
173+- goto out;
174+- force = 2;
175 + for (i = 0; i < eltsz; ++i) {
176 + elts[i].oid = dnsname;
177 + elts[i].buf = sans + i * altmax;
178@@ -1421,7 +1443,7 @@ index 58e81233f1a..378de35f662 100644
179 goto out;
180 }
181
182-@@ -154,63 +195,37 @@ revokeproc(int fd, const char *certfile, int force,
183+@@ -174,63 +196,37 @@ revokeproc(int fd, const char *certfile, int force,
184 * configuration file and that all domains are represented only once.
185 */
186
187@@ -1504,7 +1526,7 @@ index 58e81233f1a..378de35f662 100644
188 goto out;
189 }
190 force = 2;
191-@@ -236,16 +251,7 @@ revokeproc(int fd, const char *certfile, int force,
192+@@ -256,16 +252,7 @@ revokeproc(int fd, const char *certfile, int force,
193 if (cc <= 0)
194 goto out;
195
196@@ -1522,7 +1544,7 @@ index 58e81233f1a..378de35f662 100644
197 warnx("base64buf_url");
198 goto out;
199 } else if (writestr(fd, COMM_CSR, der64) >= 0)
200-@@ -298,12 +304,9 @@ out:
201+@@ -339,12 +326,9 @@ out:
202 close(fd);
203 if (f != NULL)
204 fclose(f);
1@@ -1,4 +1,4 @@
2-From 5e993fe93c590d60b05948e22b51dfc34c3eac4b Mon Sep 17 00:00:00 2001
3+From 0b4249dea4ec148875be7a7fedc8ec0873043c71 Mon Sep 17 00:00:00 2001
4 From: Michael Forney <mforney@mforney.org>
5 Date: Thu, 20 May 2021 13:44:35 -0700
6 Subject: [PATCH] nc: Add option to disable certificate time checking
7@@ -9,7 +9,7 @@ Subject: [PATCH] nc: Add option to disable certificate time checking
8 2 files changed, 8 insertions(+), 2 deletions(-)
9
10 diff --git a/usr.bin/nc/nc.1 b/usr.bin/nc/nc.1
11-index 76b6dc018ea..9e13b84acf7 100644
12+index 2ffdcd1ea60..ecff109e395 100644
13 --- a/usr.bin/nc/nc.1
14 +++ b/usr.bin/nc/nc.1
15 @@ -249,6 +249,8 @@ may be one of:
16@@ -22,7 +22,7 @@ index 76b6dc018ea..9e13b84acf7 100644
17 which requires a client certificate on incoming connections; or
18 .Cm muststaple ,
19 diff --git a/usr.bin/nc/netcat.c b/usr.bin/nc/netcat.c
20-index b5129c2204d..d1ed530eb2c 100644
21+index 9d182198089..74d18595309 100644
22 --- a/usr.bin/nc/netcat.c
23 +++ b/usr.bin/nc/netcat.c
24 @@ -70,8 +70,9 @@
25@@ -37,7 +37,7 @@ index b5129c2204d..d1ed530eb2c 100644
26
27 /* Command Line Options */
28 int dflag; /* detached, no stdin */
29-@@ -546,6 +547,8 @@ main(int argc, char *argv[])
30+@@ -551,6 +552,8 @@ main(int argc, char *argv[])
31 errx(1, "clientcert is only valid with -l");
32 if (TLSopt & TLS_NONAME)
33 tls_config_insecure_noverifyname(tls_cfg);
34@@ -46,14 +46,14 @@ index b5129c2204d..d1ed530eb2c 100644
35 if (TLSopt & TLS_NOVERIFY) {
36 if (tls_expecthash != NULL)
37 errx(1, "-H and -T noverify may not be used "
38-@@ -1707,6 +1710,7 @@ process_tls_opt(char *s, int *flags)
39+@@ -1712,6 +1715,7 @@ process_tls_opt(char *s, int *flags)
40+ { "clientcert", TLS_CCERT, NULL },
41 { "muststaple", TLS_MUSTSTAPLE, NULL },
42- { "noverify", TLS_NOVERIFY, NULL },
43 { "noname", TLS_NONAME, NULL },
44 + { "notime", TLS_NOTIME, NULL },
45+ { "noverify", TLS_NOVERIFY, NULL },
46 { "protocols", -1, &tls_protocols },
47 { NULL, -1, NULL },
48- };
49 --
50 2.49.0
51
1@@ -0,0 +1,26 @@
2+From 87c6da40a600a00d331d1d7f8968fd4ee933377a Mon Sep 17 00:00:00 2001
3+From: Michael Forney <mforney@mforney.org>
4+Date: Wed, 4 Mar 2026 15:27:54 -0800
5+Subject: [PATCH] acme-client: Fix enum/int mismatch in declaration of
6+ json_parse_response
7+
8+---
9+ usr.sbin/acme-client/extern.h | 2 +-
10+ 1 file changed, 1 insertion(+), 1 deletion(-)
11+
12+diff --git a/usr.sbin/acme-client/extern.h b/usr.sbin/acme-client/extern.h
13+index 37820e6cfb6..3c780ebf777 100644
14+--- a/usr.sbin/acme-client/extern.h
15++++ b/usr.sbin/acme-client/extern.h
16+@@ -252,7 +252,7 @@ char *base64buf_url(const unsigned char *, size_t);
17+ */
18+ struct jsmnn *json_parse(const char *, size_t);
19+ void json_free(struct jsmnn *);
20+-int json_parse_response(struct jsmnn *);
21++enum chngstatus json_parse_response(struct jsmnn *);
22+ void json_free_challenge(struct chng *);
23+ int json_parse_challenge(struct jsmnn *, struct chng *);
24+ void json_free_order(struct order *);
25+--
26+2.49.0
27+
+2,
-2
1@@ -1,2 +1,2 @@
2-6239a7a906bec7c386a06e6fda5893d854a4a00b6702eb47cbed0353a6a0c4fb src.tar.gz
3-65b58e8432c8f678840fa58402daee8acf196770b748068e165664bd2d6cd85c sys.tar.gz
4+1f20cc61f3b5bc9be69be131f9c897635ca6c3b4eba3a69e938a68e74139f48a src.tar.gz
5+e24904caaee40e8774816b20f30983626f4a5434e04b4768a9ef451dc4bc39eb sys.tar.gz
+2,
-2
1@@ -1,5 +1,5 @@
2 remote-name
3-url = "https://cdn.openbsd.org/pub/OpenBSD/7.7/src.tar.gz"
4+url = "https://cdn.openbsd.org/pub/OpenBSD/7.8/src.tar.gz"
5
6 remote-name
7-url = "https://cdn.openbsd.org/pub/OpenBSD/7.7/sys.tar.gz"
8+url = "https://cdn.openbsd.org/pub/OpenBSD/7.8/sys.tar.gz"
+1,
-1
1@@ -1 +1 @@
2-7.7 r0
3+7.8 r0