sync with OpenBSD -current

This commit is contained in:
purplerain 2024-09-15 18:29:36 +00:00
parent 9f8f4295e0
commit 51a5102224
Signed by: purplerain
GPG key ID: F42C07F07E2E35B7
38 changed files with 2285 additions and 1213 deletions

View file

@ -1,4 +1,4 @@
/* $OpenBSD: gencode.c,v 1.66 2024/04/08 02:51:14 jsg Exp $ */ /* $OpenBSD: gencode.c,v 1.67 2024/09/15 07:14:58 jsg Exp $ */
/* /*
* Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998 * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998
@ -175,7 +175,6 @@ static void *
newchunk(size_t n) newchunk(size_t n)
{ {
struct membag *m; struct membag *m;
int k, size;
void *p; void *p;
m = &membag[cur_membag]; m = &membag[cur_membag];

View file

@ -1,4 +1,4 @@
# $OpenBSD: tlsfuzzer.py,v 1.54 2024/09/13 05:58:17 tb Exp $ # $OpenBSD: tlsfuzzer.py,v 1.55 2024/09/14 07:11:34 tb Exp $
# #
# Copyright (c) 2020 Theo Buehler <tb@openbsd.org> # Copyright (c) 2020 Theo Buehler <tb@openbsd.org>
# #
@ -654,7 +654,7 @@ failing_groups = [
] ]
class TestRunner: class TestRunner:
""" Runs the given tests groups against a server and displays stats. """ """ Runs the given tests against a server and displays stats. """
def __init__( def __init__(
self, timing=False, verbose=False, host="localhost", port=4433, self, timing=False, verbose=False, host="localhost", port=4433,

View file

@ -1,4 +1,4 @@
/* $OpenBSD: traverse.c,v 1.42 2024/02/03 18:51:57 beck Exp $ */ /* $OpenBSD: traverse.c,v 1.43 2024/09/15 07:14:58 jsg Exp $ */
/* $NetBSD: traverse.c,v 1.17 1997/06/05 11:13:27 lukem Exp $ */ /* $NetBSD: traverse.c,v 1.17 1997/06/05 11:13:27 lukem Exp $ */
/*- /*-
@ -150,7 +150,6 @@ fs_mapinodes(ino_t maxino, int64_t *tapesize, int *anydirskipped)
int i, cg, inosused; int i, cg, inosused;
struct cg *cgp; struct cg *cgp;
ino_t ino; ino_t ino;
char *cp;
if ((cgp = malloc(sblock->fs_cgsize)) == NULL) if ((cgp = malloc(sblock->fs_cgsize)) == NULL)
quit("fs_mapinodes: cannot allocate memory.\n"); quit("fs_mapinodes: cannot allocate memory.\n");

View file

@ -1,4 +1,4 @@
/* $OpenBSD: pass1.c,v 1.49 2024/02/03 18:51:57 beck Exp $ */ /* $OpenBSD: pass1.c,v 1.50 2024/09/15 07:14:58 jsg Exp $ */
/* $NetBSD: pass1.c,v 1.16 1996/09/27 22:45:15 christos Exp $ */ /* $NetBSD: pass1.c,v 1.16 1996/09/27 22:45:15 christos Exp $ */
/* /*
@ -71,7 +71,6 @@ pass1(void)
u_int c; u_int c;
struct inodesc idesc; struct inodesc idesc;
daddr_t i, cgd; daddr_t i, cgd;
u_int8_t *cp;
/* /*
* Set file system reserved blocks in used block map. * Set file system reserved blocks in used block map.

View file

@ -1,4 +1,4 @@
/* $OpenBSD: pass5.c,v 1.51 2024/02/03 18:51:57 beck Exp $ */ /* $OpenBSD: pass5.c,v 1.52 2024/09/15 07:14:58 jsg Exp $ */
/* $NetBSD: pass5.c,v 1.16 1996/09/27 22:45:18 christos Exp $ */ /* $NetBSD: pass5.c,v 1.16 1996/09/27 22:45:18 christos Exp $ */
/* /*
@ -67,7 +67,7 @@ pass5(void)
struct fs *fs = &sblock; struct fs *fs = &sblock;
daddr_t dbase, dmax; daddr_t dbase, dmax;
daddr_t d; daddr_t d;
long i, k, rewritecg = 0; long i, rewritecg = 0;
ino_t j; ino_t j;
struct csum *cs; struct csum *cs;
struct csum_total cstotal; struct csum_total cstotal;

View file

@ -1,4 +1,4 @@
/* $OpenBSD: config.c,v 1.98 2024/07/13 12:22:46 yasuoka Exp $ */ /* $OpenBSD: config.c,v 1.99 2024/09/15 11:08:50 yasuoka Exp $ */
/* /*
* Copyright (c) 2019 Tobias Heider <tobias.heider@stusta.de> * Copyright (c) 2019 Tobias Heider <tobias.heider@stusta.de>
@ -178,6 +178,7 @@ config_free_sa(struct iked *env, struct iked_sa *sa)
ibuf_free(sa->sa_eap.id_buf); ibuf_free(sa->sa_eap.id_buf);
free(sa->sa_eapid); free(sa->sa_eapid);
ibuf_free(sa->sa_eapmsk); ibuf_free(sa->sa_eapmsk);
ibuf_free(sa->sa_eapclass);
free(sa->sa_cp_addr); free(sa->sa_cp_addr);
free(sa->sa_cp_addr6); free(sa->sa_cp_addr6);

View file

@ -1,4 +1,4 @@
/* $OpenBSD: iked.h,v 1.231 2024/07/13 12:22:46 yasuoka Exp $ */ /* $OpenBSD: iked.h,v 1.232 2024/09/15 11:08:50 yasuoka Exp $ */
/* /*
* Copyright (c) 2019 Tobias Heider <tobias.heider@stusta.de> * Copyright (c) 2019 Tobias Heider <tobias.heider@stusta.de>
@ -491,6 +491,7 @@ struct iked_sa {
char *sa_eapid; /* EAP identity */ char *sa_eapid; /* EAP identity */
struct iked_id sa_eap; /* EAP challenge */ struct iked_id sa_eap; /* EAP challenge */
struct ibuf *sa_eapmsk; /* EAK session key */ struct ibuf *sa_eapmsk; /* EAK session key */
struct ibuf *sa_eapclass; /* EAP/RADIUS class */
struct iked_proposals sa_proposals; /* SA proposals */ struct iked_proposals sa_proposals; /* SA proposals */
struct iked_childsas sa_childsas; /* IPsec Child SAs */ struct iked_childsas sa_childsas; /* IPsec Child SAs */

View file

@ -1,4 +1,4 @@
/* $OpenBSD: ikev2.c,v 1.387 2024/07/13 12:22:46 yasuoka Exp $ */ /* $OpenBSD: ikev2.c,v 1.388 2024/09/15 11:08:50 yasuoka Exp $ */
/* /*
* Copyright (c) 2019 Tobias Heider <tobias.heider@stusta.de> * Copyright (c) 2019 Tobias Heider <tobias.heider@stusta.de>
@ -4774,6 +4774,8 @@ ikev2_ikesa_enable(struct iked *env, struct iked_sa *sa, struct iked_sa *nsa)
/* sa_eapid needs to be set on both for radius accounting */ /* sa_eapid needs to be set on both for radius accounting */
if (sa->sa_eapid) if (sa->sa_eapid)
nsa->sa_eapid = strdup(sa->sa_eapid); nsa->sa_eapid = strdup(sa->sa_eapid);
if (sa->sa_eapclass)
nsa->sa_eapclass = ibuf_dup(sa->sa_eapclass);
log_info("%srekeyed as new IKESA %s (enc %s%s%s group %s prf %s)", log_info("%srekeyed as new IKESA %s (enc %s%s%s group %s prf %s)",
SPI_SA(sa, NULL), print_spi(nsa->sa_hdr.sh_ispi, 8), SPI_SA(sa, NULL), print_spi(nsa->sa_hdr.sh_ispi, 8),

View file

@ -1,4 +1,4 @@
/* $OpenBSD: radius.c,v 1.12 2024/09/11 00:41:51 yasuoka Exp $ */ /* $OpenBSD: radius.c,v 1.13 2024/09/15 11:08:50 yasuoka Exp $ */
/* /*
* Copyright (c) 2024 Internet Initiative Japan Inc. * Copyright (c) 2024 Internet Initiative Japan Inc.
@ -270,6 +270,16 @@ iked_radius_on_event(int fd, short ev, void *ctx)
req->rr_sa->sa_eapid = req->rr_user; req->rr_sa->sa_eapid = req->rr_user;
req->rr_user = NULL; req->rr_user = NULL;
if (radius_get_raw_attr_ptr(pkt, RADIUS_TYPE_CLASS, &attrval,
&attrlen) == 0) {
ibuf_free(req->rr_sa->sa_eapclass);
if ((req->rr_sa->sa_eapclass = ibuf_new(attrval,
attrlen)) == NULL) {
log_info("%s: ibuf_new() failed: %s", __func__,
strerror(errno));
}
}
sa_state(env, req->rr_sa, IKEV2_STATE_AUTH_SUCCESS); sa_state(env, req->rr_sa, IKEV2_STATE_AUTH_SUCCESS);
/* Map RADIUS attributes to cp */ /* Map RADIUS attributes to cp */
@ -748,6 +758,10 @@ iked_radius_acct_request(struct iked *env, struct iked_sa *sa, uint8_t stype)
switch (stype) { switch (stype) {
case RADIUS_ACCT_STATUS_TYPE_START: case RADIUS_ACCT_STATUS_TYPE_START:
if (req->rr_sa && req->rr_sa->sa_eapclass != NULL)
radius_put_raw_attr(pkt, RADIUS_TYPE_CLASS,
ibuf_data(req->rr_sa->sa_eapclass),
ibuf_size(req->rr_sa->sa_eapclass));
break; break;
case RADIUS_ACCT_STATUS_TYPE_INTERIM_UPDATE: case RADIUS_ACCT_STATUS_TYPE_INTERIM_UPDATE:
case RADIUS_ACCT_STATUS_TYPE_STOP: case RADIUS_ACCT_STATUS_TYPE_STOP:

View file

@ -1,4 +1,4 @@
/* $OpenBSD: quotacheck.c,v 1.42 2024/02/03 18:51:57 beck Exp $ */ /* $OpenBSD: quotacheck.c,v 1.43 2024/09/15 07:14:58 jsg Exp $ */
/* $NetBSD: quotacheck.c,v 1.12 1996/03/30 22:34:25 mark Exp $ */ /* $NetBSD: quotacheck.c,v 1.12 1996/03/30 22:34:25 mark Exp $ */
/* /*
@ -269,7 +269,6 @@ chkquota(const char *vfstype, const char *fsname, const char *mntpt,
int cg, i, mode, errs = 0, status; int cg, i, mode, errs = 0, status;
ino_t ino, inosused; ino_t ino, inosused;
pid_t pid; pid_t pid;
char *cp;
switch (pid = fork()) { switch (pid = fork()) {
case -1: /* error */ case -1: /* error */

View file

@ -1,4 +1,4 @@
# $OpenBSD: files,v 1.738 2024/09/09 03:50:14 jsg Exp $ # $OpenBSD: files,v 1.740 2024/09/14 11:06:48 jsg Exp $
# $NetBSD: files,v 1.87 1996/05/19 17:17:50 jonathan Exp $ # $NetBSD: files,v 1.87 1996/05/19 17:17:50 jonathan Exp $
# @(#)files.newconf 7.5 (Berkeley) 5/10/93 # @(#)files.newconf 7.5 (Berkeley) 5/10/93
@ -471,7 +471,7 @@ file dev/usb/xhci.c xhci needs-flag
# AMD Cryptographic Co-processor # AMD Cryptographic Co-processor
device ccp {} device ccp {}
file dev/ic/ccp.c ccp needs-flag file dev/ic/ccp.c ccp
# AMD Platform Security Processor # AMD Platform Security Processor
device psp device psp
@ -864,7 +864,7 @@ file net/if_vether.c vether
file net/if_rport.c rport file net/if_rport.c rport
file net/if_pair.c pair file net/if_pair.c pair
file net/if_pppx.c pppx needs-count file net/if_pppx.c pppx needs-count
file net/if_vxlan.c vxlan needs-count file net/if_vxlan.c vxlan
file net/if_wg.c wg file net/if_wg.c wg
file net/wg_noise.c wg file net/wg_noise.c wg
file net/wg_cookie.c wg file net/wg_cookie.c wg

View file

@ -1,4 +1,4 @@
# $OpenBSD: files.pv,v 1.17 2023/04/20 19:28:31 jcs Exp $ # $OpenBSD: files.pv,v 1.18 2024/09/14 09:21:13 jsg Exp $
# #
# Config file and device description for paravirtual devices. # Config file and device description for paravirtual devices.
# Included by ports that need it. # Included by ports that need it.
@ -11,7 +11,7 @@ file dev/pv/pvbus.c pvbus needs-flag
# KVM clock # KVM clock
device pvclock device pvclock
attach pvclock at pvbus attach pvclock at pvbus
file dev/pv/pvclock.c pvclock needs-flag file dev/pv/pvclock.c pvclock
# VMware Tools # VMware Tools
device vmt device vmt

View file

@ -1,7 +1,7 @@
/* /*
* History * History
* *
* $OpenBSD: calendar.history,v 1.82 2020/04/19 21:08:39 jmc Exp $ * $OpenBSD: calendar.history,v 1.83 2024/09/14 20:15:24 schwarze Exp $
*/ */
#ifndef _calendar_history_ #ifndef _calendar_history_
@ -433,7 +433,6 @@
11/07 Lewis and Clark Expedition in sight of the Pacific Ocean, 1805 11/07 Lewis and Clark Expedition in sight of the Pacific Ocean, 1805
11/08 Invasion of Sweden by Danish forces results in the 11/08 Invasion of Sweden by Danish forces results in the
Stockholm Bloodbath, 1520 Stockholm Bloodbath, 1520
11/09 Giant panda discovered (?!), China, 1927
11/09 Jack the Ripper kills fifth and final victim, Jane Kelly, 1888 11/09 Jack the Ripper kills fifth and final victim, Jane Kelly, 1888
11/10 Henry Stanley asks David Livingstone, "Dr. Livingstone, I presume?", 11/10 Henry Stanley asks David Livingstone, "Dr. Livingstone, I presume?",
1871 1871

View file

@ -1,4 +1,4 @@
/* $OpenBSD: rpcinfo.c,v 1.19 2024/08/16 16:00:30 florian Exp $ */ /* $OpenBSD: rpcinfo.c,v 1.20 2024/09/15 07:14:58 jsg Exp $ */
/* /*
* Copyright (c) 2010, Oracle America, Inc. * Copyright (c) 2010, Oracle America, Inc.
@ -489,7 +489,6 @@ void
pmapdump(int argc, char **argv) pmapdump(int argc, char **argv)
{ {
struct sockaddr_in server_addr; struct sockaddr_in server_addr;
struct hostent *hp;
struct pmaplist *head = NULL; struct pmaplist *head = NULL;
int socket = RPC_ANYSOCK; int socket = RPC_ANYSOCK;
struct timeval minutetimeout; struct timeval minutetimeout;

View file

@ -1,4 +1,4 @@
/* $OpenBSD: auth.c,v 1.161 2024/05/17 00:30:23 djm Exp $ */ /* $OpenBSD: auth.c,v 1.162 2024/09/15 01:18:26 djm Exp $ */
/* /*
* Copyright (c) 2000 Markus Friedl. All rights reserved. * Copyright (c) 2000 Markus Friedl. All rights reserved.
* *
@ -421,6 +421,7 @@ getpwnamallow(struct ssh *ssh, const char *user)
ci = server_get_connection_info(ssh, 1, options.use_dns); ci = server_get_connection_info(ssh, 1, options.use_dns);
ci->user = user; ci->user = user;
ci->user_invalid = getpwnam(user) == NULL;
parse_server_match_config(&options, &includes, ci); parse_server_match_config(&options, &includes, ci);
log_change_level(options.log_level); log_change_level(options.log_level);
log_verbose_reset(); log_verbose_reset();

View file

@ -1,4 +1,4 @@
/* $OpenBSD: kexsntrup761x25519.c,v 1.2 2021/12/05 12:28:27 jsg Exp $ */ /* $OpenBSD: kexsntrup761x25519.c,v 1.3 2024/09/15 02:20:51 djm Exp $ */
/* /*
* Copyright (c) 2019 Markus Friedl. All rights reserved. * Copyright (c) 2019 Markus Friedl. All rights reserved.
* *
@ -35,6 +35,10 @@
#include "digest.h" #include "digest.h"
#include "ssherr.h" #include "ssherr.h"
volatile crypto_int16 crypto_int16_optblocker = 0;
volatile crypto_int32 crypto_int32_optblocker = 0;
volatile crypto_int64 crypto_int64_optblocker = 0;
int int
kex_kem_sntrup761x25519_keypair(struct kex *kex) kex_kem_sntrup761x25519_keypair(struct kex *kex)
{ {

View file

@ -1,4 +1,4 @@
/* $OpenBSD: monitor.c,v 1.242 2024/09/09 02:39:57 djm Exp $ */ /* $OpenBSD: monitor.c,v 1.244 2024/09/15 01:09:40 djm Exp $ */
/* /*
* Copyright 2002 Niels Provos <provos@citi.umich.edu> * Copyright 2002 Niels Provos <provos@citi.umich.edu>
* Copyright 2002 Markus Friedl <markus@openbsd.org> * Copyright 2002 Markus Friedl <markus@openbsd.org>
@ -81,6 +81,7 @@
#include "match.h" #include "match.h"
#include "ssherr.h" #include "ssherr.h"
#include "sk-api.h" #include "sk-api.h"
#include "srclimit.h"
#ifdef GSSAPI #ifdef GSSAPI
static Gssctxt *gsscontext = NULL; static Gssctxt *gsscontext = NULL;
@ -723,6 +724,15 @@ mm_answer_pwnamallow(struct ssh *ssh, int sock, struct sshbuf *m)
ssh_packet_set_log_preamble(ssh, "%suser %s", ssh_packet_set_log_preamble(ssh, "%suser %s",
authctxt->valid ? "authenticating" : "invalid ", authctxt->user); authctxt->valid ? "authenticating" : "invalid ", authctxt->user);
if (options.refuse_connection) {
logit("administratively prohibited connection for "
"%s%s from %.128s port %d",
authctxt->valid ? "" : "invalid user ",
authctxt->user, ssh_remote_ipaddr(ssh),
ssh_remote_port(ssh));
cleanup_exit(EXIT_CONFIG_REFUSED);
}
/* Send active options to unpriv */ /* Send active options to unpriv */
mm_encode_server_options(m); mm_encode_server_options(m);
@ -1243,7 +1253,7 @@ mm_answer_keyverify(struct ssh *ssh, int sock, struct sshbuf *m)
} }
auth2_record_key(authctxt, ret == 0, key); auth2_record_key(authctxt, ret == 0, key);
if (key_blobtype == MM_USERKEY) if (key_blobtype == MM_USERKEY && ret == 0)
auth_activate_options(ssh, key_opts); auth_activate_options(ssh, key_opts);
monitor_reset_key_state(); monitor_reset_key_state();

View file

@ -1,4 +1,4 @@
/* $OpenBSD: readconf.c,v 1.389 2024/09/03 05:29:55 djm Exp $ */ /* $OpenBSD: readconf.c,v 1.390 2024/09/15 00:57:36 djm Exp $ */
/* /*
* Author: Tatu Ylonen <ylo@cs.hut.fi> * Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@ -683,11 +683,11 @@ expand_match_exec_or_include_path(const char *path, Options *options,
* Parse and execute a Match directive. * Parse and execute a Match directive.
*/ */
static int static int
match_cfg_line(Options *options, char **condition, struct passwd *pw, match_cfg_line(Options *options, const char *full_line, int *acp, char ***avp,
const char *host_arg, const char *original_host, int final_pass, struct passwd *pw, const char *host_arg, const char *original_host,
int *want_final_pass, const char *filename, int linenum) int final_pass, int *want_final_pass, const char *filename, int linenum)
{ {
char *arg, *oattrib, *attrib, *cmd, *cp = *condition, *host, *criteria; char *arg, *oattrib, *attrib, *cmd, *host, *criteria;
const char *ruser; const char *ruser;
int r, this_result, result = 1, attributes = 0, negate; int r, this_result, result = 1, attributes = 0, negate;
@ -707,11 +707,11 @@ match_cfg_line(Options *options, char **condition, struct passwd *pw,
} }
debug2("checking match for '%s' host %s originally %s", debug2("checking match for '%s' host %s originally %s",
cp, host, original_host); full_line, host, original_host);
while ((oattrib = attrib = strdelim(&cp)) && *attrib != '\0') { while ((oattrib = attrib = argv_next(acp, avp)) != NULL) {
/* Terminate on comment */ /* Terminate on comment */
if (*attrib == '#') { if (*attrib == '#') {
cp = NULL; /* mark all arguments consumed */ argv_consume(acp);
break; break;
} }
arg = criteria = NULL; arg = criteria = NULL;
@ -720,7 +720,8 @@ match_cfg_line(Options *options, char **condition, struct passwd *pw,
attrib++; attrib++;
/* Criterion "all" has no argument and must appear alone */ /* Criterion "all" has no argument and must appear alone */
if (strcasecmp(attrib, "all") == 0) { if (strcasecmp(attrib, "all") == 0) {
if (attributes > 1 || ((arg = strdelim(&cp)) != NULL && if (attributes > 1 ||
((arg = argv_next(acp, avp)) != NULL &&
*arg != '\0' && *arg != '#')) { *arg != '\0' && *arg != '#')) {
error("%.200s line %d: '%s' cannot be combined " error("%.200s line %d: '%s' cannot be combined "
"with other Match attributes", "with other Match attributes",
@ -729,7 +730,7 @@ match_cfg_line(Options *options, char **condition, struct passwd *pw,
goto out; goto out;
} }
if (arg != NULL && *arg == '#') if (arg != NULL && *arg == '#')
cp = NULL; /* mark all arguments consumed */ argv_consume(acp); /* consume remaining args */
if (result) if (result)
result = negate ? 0 : 1; result = negate ? 0 : 1;
goto out; goto out;
@ -754,7 +755,7 @@ match_cfg_line(Options *options, char **condition, struct passwd *pw,
continue; continue;
} }
/* All other criteria require an argument */ /* All other criteria require an argument */
if ((arg = strdelim(&cp)) == NULL || if ((arg = argv_next(acp, avp)) == NULL ||
*arg == '\0' || *arg == '#') { *arg == '\0' || *arg == '#') {
error("Missing Match criteria for %s", attrib); error("Missing Match criteria for %s", attrib);
result = -1; result = -1;
@ -841,7 +842,6 @@ match_cfg_line(Options *options, char **condition, struct passwd *pw,
out: out:
if (result != -1) if (result != -1)
debug2("match %sfound", result ? "" : "not "); debug2("match %sfound", result ? "" : "not ");
*condition = cp;
free(host); free(host);
return result; return result;
} }
@ -1784,8 +1784,8 @@ parse_pubkey_algos:
"option"); "option");
goto out; goto out;
} }
value = match_cfg_line(options, &str, pw, host, original_host, value = match_cfg_line(options, str, &ac, &av, pw, host,
flags & SSHCONF_FINAL, want_final_pass, original_host, flags & SSHCONF_FINAL, want_final_pass,
filename, linenum); filename, linenum);
if (value < 0) { if (value < 0) {
error("%.200s line %d: Bad Match condition", filename, error("%.200s line %d: Bad Match condition", filename,
@ -1793,13 +1793,6 @@ parse_pubkey_algos:
goto out; goto out;
} }
*activep = (flags & SSHCONF_NEVERMATCH) ? 0 : value; *activep = (flags & SSHCONF_NEVERMATCH) ? 0 : value;
/*
* If match_cfg_line() didn't consume all its arguments then
* arrange for the extra arguments check below to fail.
*/
if (str == NULL || *str == '\0')
argv_consume(&ac);
break; break;
case oEscapeChar: case oEscapeChar:

View file

@ -1,4 +1,4 @@
/* $OpenBSD: servconf.c,v 1.413 2024/08/17 08:23:04 djm Exp $ */ /* $OpenBSD: servconf.c,v 1.418 2024/09/15 03:09:44 djm Exp $ */
/* /*
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
* All rights reserved * All rights reserved
@ -155,6 +155,7 @@ initialize_server_options(ServerOptions *options)
options->per_source_penalty.penalty_authfail = -1; options->per_source_penalty.penalty_authfail = -1;
options->per_source_penalty.penalty_noauth = -1; options->per_source_penalty.penalty_noauth = -1;
options->per_source_penalty.penalty_grace = -1; options->per_source_penalty.penalty_grace = -1;
options->per_source_penalty.penalty_refuseconnection = -1;
options->per_source_penalty.penalty_max = -1; options->per_source_penalty.penalty_max = -1;
options->per_source_penalty.penalty_min = -1; options->per_source_penalty.penalty_min = -1;
options->max_authtries = -1; options->max_authtries = -1;
@ -190,6 +191,7 @@ initialize_server_options(ServerOptions *options)
options->num_channel_timeouts = 0; options->num_channel_timeouts = 0;
options->unused_connection_timeout = -1; options->unused_connection_timeout = -1;
options->sshd_session_path = NULL; options->sshd_session_path = NULL;
options->refuse_connection = -1;
} }
/* Returns 1 if a string option is unset or set to "none" or 0 otherwise. */ /* Returns 1 if a string option is unset or set to "none" or 0 otherwise. */
@ -407,6 +409,8 @@ fill_default_server_options(ServerOptions *options)
options->per_source_penalty.penalty_authfail = 5; options->per_source_penalty.penalty_authfail = 5;
if (options->per_source_penalty.penalty_noauth == -1) if (options->per_source_penalty.penalty_noauth == -1)
options->per_source_penalty.penalty_noauth = 1; options->per_source_penalty.penalty_noauth = 1;
if (options->per_source_penalty.penalty_refuseconnection == -1)
options->per_source_penalty.penalty_refuseconnection = 10;
if (options->per_source_penalty.penalty_min == -1) if (options->per_source_penalty.penalty_min == -1)
options->per_source_penalty.penalty_min = 15; options->per_source_penalty.penalty_min = 15;
if (options->per_source_penalty.penalty_max == -1) if (options->per_source_penalty.penalty_max == -1)
@ -457,6 +461,8 @@ fill_default_server_options(ServerOptions *options)
options->unused_connection_timeout = 0; options->unused_connection_timeout = 0;
if (options->sshd_session_path == NULL) if (options->sshd_session_path == NULL)
options->sshd_session_path = xstrdup(_PATH_SSHD_SESSION); options->sshd_session_path = xstrdup(_PATH_SSHD_SESSION);
if (options->refuse_connection == -1)
options->refuse_connection = 0;
assemble_algorithms(options); assemble_algorithms(options);
@ -536,7 +542,7 @@ typedef enum {
sAllowStreamLocalForwarding, sFingerprintHash, sDisableForwarding, sAllowStreamLocalForwarding, sFingerprintHash, sDisableForwarding,
sExposeAuthInfo, sRDomain, sPubkeyAuthOptions, sSecurityKeyProvider, sExposeAuthInfo, sRDomain, sPubkeyAuthOptions, sSecurityKeyProvider,
sRequiredRSASize, sChannelTimeout, sUnusedConnectionTimeout, sRequiredRSASize, sChannelTimeout, sUnusedConnectionTimeout,
sSshdSessionPath, sSshdSessionPath, sRefuseConnection,
sDeprecated, sIgnore, sUnsupported sDeprecated, sIgnore, sUnsupported
} ServerOpCodes; } ServerOpCodes;
@ -686,6 +692,7 @@ static struct {
{ "channeltimeout", sChannelTimeout, SSHCFG_ALL }, { "channeltimeout", sChannelTimeout, SSHCFG_ALL },
{ "unusedconnectiontimeout", sUnusedConnectionTimeout, SSHCFG_ALL }, { "unusedconnectiontimeout", sUnusedConnectionTimeout, SSHCFG_ALL },
{ "sshdsessionpath", sSshdSessionPath, SSHCFG_GLOBAL }, { "sshdsessionpath", sSshdSessionPath, SSHCFG_GLOBAL },
{ "refuseconnection", sRefuseConnection, SSHCFG_ALL },
{ NULL, sBadOption, 0 } { NULL, sBadOption, 0 }
}; };
@ -962,43 +969,57 @@ match_test_missing_fatal(const char *criteria, const char *attrib)
* not match. * not match.
*/ */
static int static int
match_cfg_line(char **condition, int line, struct connection_info *ci) match_cfg_line(const char *full_line, int *acp, char ***avp,
int line, struct connection_info *ci)
{ {
int result = 1, attributes = 0, port; int result = 1, attributes = 0, port;
char *arg, *attrib, *cp = *condition; char *arg, *attrib;
if (ci == NULL) if (ci == NULL)
debug3("checking syntax for 'Match %s'", cp); debug3("checking syntax for 'Match %s'", full_line);
else else {
debug3("checking match for '%s' user %s host %s addr %s " debug3("checking match for '%s' user %s%s host %s addr %s "
"laddr %s lport %d", cp, ci->user ? ci->user : "(null)", "laddr %s lport %d", full_line,
ci->user ? ci->user : "(null)",
ci->user_invalid ? " (invalid)" : "",
ci->host ? ci->host : "(null)", ci->host ? ci->host : "(null)",
ci->address ? ci->address : "(null)", ci->address ? ci->address : "(null)",
ci->laddress ? ci->laddress : "(null)", ci->lport); ci->laddress ? ci->laddress : "(null)", ci->lport);
}
while ((attrib = strdelim(&cp)) && *attrib != '\0') { while ((attrib = argv_next(acp, avp)) != NULL) {
/* Terminate on comment */ /* Terminate on comment */
if (*attrib == '#') { if (*attrib == '#') {
cp = NULL; /* mark all arguments consumed */ argv_consume(acp); /* mark all arguments consumed */
break; break;
} }
arg = NULL; arg = NULL;
attributes++; attributes++;
/* Criterion "all" has no argument and must appear alone */ /* Criterion "all" has no argument and must appear alone */
if (strcasecmp(attrib, "all") == 0) { if (strcasecmp(attrib, "all") == 0) {
if (attributes > 1 || ((arg = strdelim(&cp)) != NULL && if (attributes > 1 ||
((arg = argv_next(acp, avp)) != NULL &&
*arg != '\0' && *arg != '#')) { *arg != '\0' && *arg != '#')) {
error("'all' cannot be combined with other " error("'all' cannot be combined with other "
"Match attributes"); "Match attributes");
return -1; return -1;
} }
if (arg != NULL && *arg == '#') if (arg != NULL && *arg == '#')
cp = NULL; /* mark all arguments consumed */ argv_consume(acp); /* consume remaining args */
*condition = cp;
return 1; return 1;
} }
/* Criterion "invalid-user" also has no argument */
if (strcasecmp(attrib, "invalid-user") == 0) {
if (ci == NULL)
continue;
if (ci->user_invalid == 0)
result = 0;
else
debug("matched invalid-user at line %d", line);
continue;
}
/* All other criteria require an argument */ /* All other criteria require an argument */
if ((arg = strdelim(&cp)) == NULL || if ((arg = argv_next(acp, avp)) == NULL ||
*arg == '\0' || *arg == '#') { *arg == '\0' || *arg == '#') {
error("Missing Match criteria for %s", attrib); error("Missing Match criteria for %s", attrib);
return -1; return -1;
@ -1129,7 +1150,6 @@ match_cfg_line(char **condition, int line, struct connection_info *ci)
} }
if (ci != NULL) if (ci != NULL)
debug3("match %sfound", result ? "" : "not "); debug3("match %sfound", result ? "" : "not ");
*condition = cp;
return result; return result;
} }
@ -1972,6 +1992,9 @@ process_server_config_line_depth(ServerOptions *options, char *line,
} else if (strncmp(arg, "grace-exceeded:", 15) == 0) { } else if (strncmp(arg, "grace-exceeded:", 15) == 0) {
p = arg + 15; p = arg + 15;
intptr = &options->per_source_penalty.penalty_grace; intptr = &options->per_source_penalty.penalty_grace;
} else if (strncmp(arg, "refuseconnection:", 17) == 0) {
p = arg + 17;
intptr = &options->per_source_penalty.penalty_refuseconnection;
} else if (strncmp(arg, "max:", 4) == 0) { } else if (strncmp(arg, "max:", 4) == 0) {
p = arg + 4; p = arg + 4;
intptr = &options->per_source_penalty.penalty_max; intptr = &options->per_source_penalty.penalty_max;
@ -2250,7 +2273,7 @@ process_server_config_line_depth(ServerOptions *options, char *line,
if (cmdline) if (cmdline)
fatal("Match directive not supported as a command-line " fatal("Match directive not supported as a command-line "
"option"); "option");
value = match_cfg_line(&str, linenum, value = match_cfg_line(str, &ac, &av, linenum,
(*inc_flags & SSHCFG_NEVERMATCH ? NULL : connectinfo)); (*inc_flags & SSHCFG_NEVERMATCH ? NULL : connectinfo));
if (value < 0) if (value < 0)
fatal("%s line %d: Bad Match condition", filename, fatal("%s line %d: Bad Match condition", filename,
@ -2261,12 +2284,6 @@ process_server_config_line_depth(ServerOptions *options, char *line,
* match block. * match block.
*/ */
*inc_flags &= ~SSHCFG_MATCH_ONLY; *inc_flags &= ~SSHCFG_MATCH_ONLY;
/*
* If match_cfg_line() didn't consume all its arguments then
* arrange for the extra arguments check below to fail.
*/
if (str == NULL || *str == '\0')
argv_consume(&ac);
break; break;
case sPermitListen: case sPermitListen:
@ -2579,6 +2596,11 @@ process_server_config_line_depth(ServerOptions *options, char *line,
charptr = &options->sshd_session_path; charptr = &options->sshd_session_path;
goto parse_filename; goto parse_filename;
case sRefuseConnection:
intptr = &options->refuse_connection;
multistate_ptr = multistate_flag;
goto parse_multistate;
case sDeprecated: case sDeprecated:
case sIgnore: case sIgnore:
case sUnsupported: case sUnsupported:
@ -2693,6 +2715,8 @@ int parse_server_match_testspec(struct connection_info *ci, char *spec)
" specification %s\n", p+6, p); " specification %s\n", p+6, p);
return -1; return -1;
} }
} else if (strcmp(p, "invalid-user") == 0) {
ci->user_invalid = 1;
} else { } else {
fprintf(stderr, "Invalid test mode specification %s\n", fprintf(stderr, "Invalid test mode specification %s\n",
p); p);
@ -2794,6 +2818,7 @@ copy_set_server_options(ServerOptions *dst, ServerOptions *src, int preauth)
M_CP_INTOPT(log_level); M_CP_INTOPT(log_level);
M_CP_INTOPT(required_rsa_size); M_CP_INTOPT(required_rsa_size);
M_CP_INTOPT(unused_connection_timeout); M_CP_INTOPT(unused_connection_timeout);
M_CP_INTOPT(refuse_connection);
/* /*
* The bind_mask is a mode_t that may be unsigned, so we can't use * The bind_mask is a mode_t that may be unsigned, so we can't use
@ -3116,6 +3141,7 @@ dump_config(ServerOptions *o)
dump_cfg_fmtint(sStreamLocalBindUnlink, o->fwd_opts.streamlocal_bind_unlink); dump_cfg_fmtint(sStreamLocalBindUnlink, o->fwd_opts.streamlocal_bind_unlink);
dump_cfg_fmtint(sFingerprintHash, o->fingerprint_hash); dump_cfg_fmtint(sFingerprintHash, o->fingerprint_hash);
dump_cfg_fmtint(sExposeAuthInfo, o->expose_userauth_info); dump_cfg_fmtint(sExposeAuthInfo, o->expose_userauth_info);
dump_cfg_fmtint(sRefuseConnection, o->refuse_connection);
/* string arguments */ /* string arguments */
dump_cfg_string(sPidFile, o->pid_file); dump_cfg_string(sPidFile, o->pid_file);
@ -3236,12 +3262,14 @@ dump_config(ServerOptions *o)
if (o->per_source_penalty.enabled) { if (o->per_source_penalty.enabled) {
printf("persourcepenalties crash:%d authfail:%d noauth:%d " printf("persourcepenalties crash:%d authfail:%d noauth:%d "
"grace-exceeded:%d max:%d min:%d max-sources4:%d " "grace-exceeded:%d refuseconnection:%d max:%d min:%d "
"max-sources6:%d overflow:%s overflow6:%s\n", "max-sources4:%d max-sources6:%d "
"overflow:%s overflow6:%s\n",
o->per_source_penalty.penalty_crash, o->per_source_penalty.penalty_crash,
o->per_source_penalty.penalty_authfail, o->per_source_penalty.penalty_authfail,
o->per_source_penalty.penalty_noauth, o->per_source_penalty.penalty_noauth,
o->per_source_penalty.penalty_grace, o->per_source_penalty.penalty_grace,
o->per_source_penalty.penalty_refuseconnection,
o->per_source_penalty.penalty_max, o->per_source_penalty.penalty_max,
o->per_source_penalty.penalty_min, o->per_source_penalty.penalty_min,
o->per_source_penalty.max_sources4, o->per_source_penalty.max_sources4,

View file

@ -1,4 +1,4 @@
/* $OpenBSD: servconf.h,v 1.165 2024/06/12 22:36:00 djm Exp $ */ /* $OpenBSD: servconf.h,v 1.168 2024/09/15 01:18:26 djm Exp $ */
/* /*
* Author: Tatu Ylonen <ylo@cs.hut.fi> * Author: Tatu Ylonen <ylo@cs.hut.fi>
@ -77,6 +77,7 @@ struct per_source_penalty {
int penalty_grace; int penalty_grace;
int penalty_authfail; int penalty_authfail;
int penalty_noauth; int penalty_noauth;
int penalty_refuseconnection;
int penalty_max; int penalty_max;
int penalty_min; int penalty_min;
}; };
@ -245,11 +246,14 @@ typedef struct {
int unused_connection_timeout; int unused_connection_timeout;
char *sshd_session_path; char *sshd_session_path;
int refuse_connection;
} ServerOptions; } ServerOptions;
/* Information about the incoming connection as used by Match */ /* Information about the incoming connection as used by Match */
struct connection_info { struct connection_info {
const char *user; const char *user;
int user_invalid;
const char *host; /* possibly resolved hostname */ const char *host; /* possibly resolved hostname */
const char *address; /* remote address */ const char *address; /* remote address */
const char *laddress; /* local address */ const char *laddress; /* local address */

File diff suppressed because it is too large Load diff

View file

@ -1,25 +1,18 @@
#!/bin/sh #!/bin/sh
# $OpenBSD: sntrup761.sh,v 1.7 2023/01/11 02:13:52 djm Exp $ # $OpenBSD: sntrup761.sh,v 1.8 2024/09/15 02:20:51 djm Exp $
# Placed in the Public Domain. # Placed in the Public Domain.
# #
AUTHOR="supercop-20201130/crypto_kem/sntrup761/ref/implementors" AUTHOR="supercop-20240808/crypto_kem/sntrup761/ref/implementors"
FILES=" FILES=" supercop-20240808/cryptoint/crypto_int16.h
supercop-20201130/crypto_sort/int32/portable4/int32_minmax.inc supercop-20240808/cryptoint/crypto_int32.h
supercop-20201130/crypto_sort/int32/portable4/sort.c supercop-20240808/cryptoint/crypto_int64.h
supercop-20201130/crypto_sort/uint32/useint32/sort.c supercop-20240808/crypto_sort/int32/portable4/sort.c
supercop-20201130/crypto_kem/sntrup761/ref/uint32.c supercop-20240808/crypto_sort/uint32/useint32/sort.c
supercop-20201130/crypto_kem/sntrup761/ref/int32.c supercop-20240808/crypto_kem/sntrup761/compact/kem.c
supercop-20201130/crypto_kem/sntrup761/ref/paramsmenu.h
supercop-20201130/crypto_kem/sntrup761/ref/params.h
supercop-20201130/crypto_kem/sntrup761/ref/Decode.h
supercop-20201130/crypto_kem/sntrup761/ref/Decode.c
supercop-20201130/crypto_kem/sntrup761/ref/Encode.h
supercop-20201130/crypto_kem/sntrup761/ref/Encode.c
supercop-20201130/crypto_kem/sntrup761/ref/kem.c
" "
### ###
set -e set -euo pipefail
cd $1 cd $1
echo -n '/* $' echo -n '/* $'
echo 'OpenBSD: $ */' echo 'OpenBSD: $ */'
@ -32,12 +25,19 @@ echo
echo '#include <string.h>' echo '#include <string.h>'
echo '#include "crypto_api.h"' echo '#include "crypto_api.h"'
echo echo
echo '#define crypto_declassify(x, y) do {} while (0)'
echo
# Map the types used in this code to the ones in crypto_api.h. We use #define # Map the types used in this code to the ones in crypto_api.h. We use #define
# instead of typedef since some systems have existing intXX types and do not # instead of typedef since some systems have existing intXX types and do not
# permit multiple typedefs even if they do not conflict. # permit multiple typedefs even if they do not conflict.
for t in int8 uint8 int16 uint16 int32 uint32 int64 uint64; do for t in int8 uint8 int16 uint16 int32 uint32 int64 uint64; do
echo "#define $t crypto_${t}" echo "#define $t crypto_${t}"
done done
for x in 16 32 64 ; do
echo "extern volatile crypto_int$x crypto_int${x}_optblocker;"
done
echo echo
for i in $FILES; do for i in $FILES; do
echo "/* from $i */" echo "/* from $i */"
@ -57,14 +57,27 @@ for i in $FILES; do
-e 's/[ ]*$//' \ -e 's/[ ]*$//' \
$i | \ $i | \
case "$i" in case "$i" in
# Use int64_t for intermediate values in int32_MINMAX to prevent signed */cryptoint/crypto_int16.h)
# 32-bit integer overflow when called by crypto_sort_uint32. sed -e "s/static void crypto_int16_store/void crypto_int16_store/" \
*/int32_minmax.inc) -e "s/^[#]define crypto_int16_optblocker.*//" \
sed -e "s/int32 ab = b ^ a/int64_t ab = (int64_t)b ^ (int64_t)a/" \ -e "s/static void crypto_int16_minmax/void crypto_int16_minmax/"
-e "s/int32 c = b - a/int64_t c = (int64_t)b - (int64_t)a/" ;;
*/cryptoint/crypto_int32.h)
sed -e "s/static void crypto_int32_store/void crypto_int32_store/" \
-e "s/^[#]define crypto_int32_optblocker.*//" \
-e "s/static void crypto_int32_minmax/void crypto_int32_minmax/"
;;
*/cryptoint/crypto_int64.h)
sed -e "s/static void crypto_int64_store/void crypto_int64_store/" \
-e "s/^[#]define crypto_int64_optblocker.*//" \
-e "s/static void crypto_int64_minmax/void crypto_int64_minmax/"
;; ;;
*/int32/portable4/sort.c) */int32/portable4/sort.c)
sed -e "s/void crypto_sort/void crypto_sort_int32/g" sed -e "s/void crypto_sort[(]/void crypto_sort_int32(/g"
;;
*/int32/portable5/sort.c)
sed -e "s/crypto_sort_smallindices/crypto_sort_int32_smallindices/"\
-e "s/void crypto_sort[(]/void crypto_sort_int32(/g"
;; ;;
*/uint32/useint32/sort.c) */uint32/useint32/sort.c)
sed -e "s/void crypto_sort/void crypto_sort_uint32/g" sed -e "s/void crypto_sort/void crypto_sort_uint32/g"

View file

@ -379,6 +379,10 @@ srclimit_penalise(struct xaddr *addr, int penalty_type)
penalty_secs = penalty_cfg.penalty_noauth; penalty_secs = penalty_cfg.penalty_noauth;
reason = "penalty: connections without attempting authentication"; reason = "penalty: connections without attempting authentication";
break; break;
case SRCLIMIT_PENALTY_REFUSECONNECTION:
penalty_secs = penalty_cfg.penalty_refuseconnection;
reason = "penalty: connection prohibited by RefuseConnection";
break;
case SRCLIMIT_PENALTY_GRACE_EXCEEDED: case SRCLIMIT_PENALTY_GRACE_EXCEEDED:
penalty_secs = penalty_cfg.penalty_crash; penalty_secs = penalty_cfg.penalty_crash;
reason = "penalty: exceeded LoginGraceTime"; reason = "penalty: exceeded LoginGraceTime";

View file

@ -22,16 +22,18 @@ void srclimit_init(int, int, int, int,
int srclimit_check_allow(int, int); int srclimit_check_allow(int, int);
void srclimit_done(int); void srclimit_done(int);
#define SRCLIMIT_PENALTY_NONE 0 #define SRCLIMIT_PENALTY_NONE 0
#define SRCLIMIT_PENALTY_CRASH 1 #define SRCLIMIT_PENALTY_CRASH 1
#define SRCLIMIT_PENALTY_AUTHFAIL 2 #define SRCLIMIT_PENALTY_AUTHFAIL 2
#define SRCLIMIT_PENALTY_GRACE_EXCEEDED 3 #define SRCLIMIT_PENALTY_GRACE_EXCEEDED 3
#define SRCLIMIT_PENALTY_NOAUTH 4 #define SRCLIMIT_PENALTY_NOAUTH 4
#define SRCLIMIT_PENALTY_REFUSECONNECTION 5
/* meaningful exit values, used by sshd listener for penalties */ /* meaningful exit values, used by sshd listener for penalties */
#define EXIT_LOGIN_GRACE 3 /* login grace period exceeded */ #define EXIT_LOGIN_GRACE 3 /* login grace period exceeded */
#define EXIT_CHILD_CRASH 4 /* preauth child crashed */ #define EXIT_CHILD_CRASH 4 /* preauth child crashed */
#define EXIT_AUTH_ATTEMPTED 5 /* at least one auth attempt made */ #define EXIT_AUTH_ATTEMPTED 5 /* at least one auth attempt made */
#define EXIT_CONFIG_REFUSED 6 /* sshd_config RefuseConnection */
void srclimit_penalise(struct xaddr *, int); void srclimit_penalise(struct xaddr *, int);
int srclimit_penalty_check_allow(int, const char **); int srclimit_penalty_check_allow(int, const char **);

View file

@ -1,4 +1,4 @@
/* $OpenBSD: ssh-keygen.c,v 1.474 2024/09/04 05:33:34 djm Exp $ */ /* $OpenBSD: ssh-keygen.c,v 1.475 2024/09/15 00:47:01 djm Exp $ */
/* /*
* Author: Tatu Ylonen <ylo@cs.hut.fi> * Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1994 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland * Copyright (c) 1994 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@ -300,7 +300,7 @@ ask_filename(struct passwd *pw, const char *prompt)
static struct sshkey * static struct sshkey *
load_identity(const char *filename, char **commentp) load_identity(const char *filename, char **commentp)
{ {
char *pass; char *prompt, *pass;
struct sshkey *prv; struct sshkey *prv;
int r; int r;
@ -312,8 +312,11 @@ load_identity(const char *filename, char **commentp)
fatal_r(r, "Load key \"%s\"", filename); fatal_r(r, "Load key \"%s\"", filename);
if (identity_passphrase) if (identity_passphrase)
pass = xstrdup(identity_passphrase); pass = xstrdup(identity_passphrase);
else else {
pass = read_passphrase("Enter passphrase: ", RP_ALLOW_STDIN); xasprintf(&prompt, "Enter passphrase for \"%s\": ", filename);
pass = read_passphrase(prompt, RP_ALLOW_STDIN);
free(prompt);
}
r = sshkey_load_private(filename, pass, &prv, commentp); r = sshkey_load_private(filename, pass, &prv, commentp);
freezero(pass, strlen(pass)); freezero(pass, strlen(pass));
if (r != 0) if (r != 0)
@ -3110,17 +3113,22 @@ read_check_passphrase(const char *prompt1, const char *prompt2,
} }
static char * static char *
private_key_passphrase(void) private_key_passphrase(const char *path)
{ {
char *prompt, *ret;
if (identity_passphrase) if (identity_passphrase)
return xstrdup(identity_passphrase); return xstrdup(identity_passphrase);
if (identity_new_passphrase) if (identity_new_passphrase)
return xstrdup(identity_new_passphrase); return xstrdup(identity_new_passphrase);
return read_check_passphrase( xasprintf(&prompt, "Enter passphrase for \"%s\" "
"Enter passphrase (empty for no passphrase): ", "(empty for no passphrase): ", path);
ret = read_check_passphrase(prompt,
"Enter same passphrase again: ", "Enter same passphrase again: ",
"Passphrases do not match. Try again."); "Passphrases do not match. Try again.");
free(prompt);
return ret;
} }
static char * static char *
@ -3216,7 +3224,7 @@ do_download_sk(const char *skprovider, const char *device)
/* Save the key with the application string as the comment */ /* Save the key with the application string as the comment */
if (pass == NULL) if (pass == NULL)
pass = private_key_passphrase(); pass = private_key_passphrase(path);
if ((r = sshkey_save_private(key, path, pass, if ((r = sshkey_save_private(key, path, pass,
key->sk_application, private_key_format, key->sk_application, private_key_format,
openssh_format_cipher, rounds)) != 0) { openssh_format_cipher, rounds)) != 0) {
@ -3912,7 +3920,7 @@ main(int argc, char **argv)
exit(1); exit(1);
/* Determine the passphrase for the private key */ /* Determine the passphrase for the private key */
passphrase = private_key_passphrase(); passphrase = private_key_passphrase(identity_file);
if (identity_comment) { if (identity_comment) {
strlcpy(comment, identity_comment, sizeof(comment)); strlcpy(comment, identity_comment, sizeof(comment));
} else { } else {

View file

@ -33,8 +33,8 @@
.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
.\" .\"
.\" $OpenBSD: sshd.8,v 1.326 2024/06/17 08:30:29 djm Exp $ .\" $OpenBSD: sshd.8,v 1.327 2024/09/15 01:19:56 djm Exp $
.Dd $Mdocdate: June 17 2024 $ .Dd $Mdocdate: September 15 2024 $
.Dt SSHD 8 .Dt SSHD 8
.Os .Os
.Sh NAME .Sh NAME
@ -115,6 +115,10 @@ and
.Dq rdomain .Dq rdomain
and correspond to source address, user, resolved source host name, and correspond to source address, user, resolved source host name,
local address, local port number and routing domain respectively. local address, local port number and routing domain respectively.
Additionally the
.Dq invalid-user
flag (which does not take a value argument) may be specified to simulate
a connection from an unrecognised username.
.It Fl c Ar host_certificate_file .It Fl c Ar host_certificate_file
Specifies a path to a certificate file to identify Specifies a path to a certificate file to identify
.Nm .Nm

View file

@ -1,4 +1,4 @@
/* $OpenBSD: sshd.c,v 1.611 2024/09/12 00:36:27 djm Exp $ */ /* $OpenBSD: sshd.c,v 1.612 2024/09/15 01:11:26 djm Exp $ */
/* /*
* Copyright (c) 2000, 2001, 2002 Markus Friedl. All rights reserved. * Copyright (c) 2000, 2001, 2002 Markus Friedl. All rights reserved.
* Copyright (c) 2002 Niels Provos. All rights reserved. * Copyright (c) 2002 Niels Provos. All rights reserved.
@ -360,6 +360,13 @@ child_reap(struct early_child *child)
(long)child->pid, child->id, (long)child->pid, child->id,
child->early ? " (early)" : ""); child->early ? " (early)" : "");
break; break;
case EXIT_CONFIG_REFUSED:
penalty_type = SRCLIMIT_PENALTY_REFUSECONNECTION;
debug_f("preauth child %ld for %s prohibited by"
"RefuseConnection %s",
(long)child->pid, child->id,
child->early ? " (early)" : "");
break;
default: default:
penalty_type = SRCLIMIT_PENALTY_NOAUTH; penalty_type = SRCLIMIT_PENALTY_NOAUTH;
debug_f("preauth child %ld for %s exited " debug_f("preauth child %ld for %s exited "

View file

@ -33,8 +33,8 @@
.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
.\" .\"
.\" $OpenBSD: sshd_config.5,v 1.370 2024/09/09 14:41:21 naddy Exp $ .\" $OpenBSD: sshd_config.5,v 1.374 2024/09/15 08:27:38 jmc Exp $
.Dd $Mdocdate: September 9 2024 $ .Dd $Mdocdate: September 15 2024 $
.Dt SSHD_CONFIG 5 .Dt SSHD_CONFIG 5
.Os .Os
.Sh NAME .Sh NAME
@ -1238,9 +1238,11 @@ applied.
.Pp .Pp
The arguments to The arguments to
.Cm Match .Cm Match
are one or more criteria-pattern pairs or the single token are one or more criteria-pattern pairs or one of the single token criteria:
.Cm All .Cm All ,
which matches all criteria. which matches all criteria, or
.Cm Invalid-User ,
which matches when the requested user-name does not match any known account.
The available criteria are The available criteria are
.Cm User , .Cm User ,
.Cm Group , .Cm Group ,
@ -1324,6 +1326,7 @@ Available keywords are
.Cm PubkeyAcceptedAlgorithms , .Cm PubkeyAcceptedAlgorithms ,
.Cm PubkeyAuthentication , .Cm PubkeyAuthentication ,
.Cm PubkeyAuthOptions , .Cm PubkeyAuthOptions ,
.Cm RefuseConnection ,
.Cm RekeyLimit , .Cm RekeyLimit ,
.Cm RevokedKeys , .Cm RevokedKeys ,
.Cm RDomain , .Cm RDomain ,
@ -1597,6 +1600,11 @@ Specifies how long to refuse clients that cause a crash of
.It Cm authfail:duration .It Cm authfail:duration
Specifies how long to refuse clients that disconnect after making one or more Specifies how long to refuse clients that disconnect after making one or more
unsuccessful authentication attempts (default: 5s). unsuccessful authentication attempts (default: 5s).
.It Cm refuseconnection:duration
Specifies how long to refuse clients that were administratively prohibited
connection via the
.Cm RefuseConnection
option (default: 10s).
.It Cm noauth:duration .It Cm noauth:duration
Specifies how long to refuse clients that disconnect without attempting Specifies how long to refuse clients that disconnect without attempting
authentication (default: 1s). authentication (default: 1s).
@ -1754,6 +1762,18 @@ options have any effect for other, non-FIDO, public key types.
Specifies whether public key authentication is allowed. Specifies whether public key authentication is allowed.
The default is The default is
.Cm yes . .Cm yes .
.It Cm RefuseConnection
Indicates that
.Xr sshd 8
should unconditionally terminate the connection.
Additionally, a
.Cm refuseconnection
penalty may be recorded against the source of the connection if
.Cm PerSourcePenalties
are enabled.
This option is only really useful in a
.Cm Match
block.
.It Cm RekeyLimit .It Cm RekeyLimit
Specifies the maximum amount of data that may be transmitted or received Specifies the maximum amount of data that may be transmitted or received
before the session key is renegotiated, optionally followed by a maximum before the session key is renegotiated, optionally followed by a maximum

View file

@ -1,4 +1,4 @@
/* $OpenBSD: w.c,v 1.69 2024/08/19 07:28:22 florian Exp $ */ /* $OpenBSD: w.c,v 1.70 2024/09/15 07:14:58 jsg Exp $ */
/*- /*-
* Copyright (c) 1980, 1991, 1993, 1994 * Copyright (c) 1980, 1991, 1993, 1994
@ -107,7 +107,6 @@ main(int argc, char *argv[])
struct kinfo_proc *kp; struct kinfo_proc *kp;
struct stat *stp; struct stat *stp;
FILE *ut; FILE *ut;
struct in_addr addr;
int ch, i, nentries, nusers, wcmd; int ch, i, nentries, nusers, wcmd;
char *memf, *nlistf, *p, *x; char *memf, *nlistf, *p, *x;
char buf[HOST_NAME_MAX+1], errbuf[_POSIX2_LINE_MAX]; char buf[HOST_NAME_MAX+1], errbuf[_POSIX2_LINE_MAX];

View file

@ -1,4 +1,4 @@
/* $OpenBSD: parser.c,v 1.5 2024/09/02 04:45:22 yasuoka Exp $ */ /* $OpenBSD: parser.c,v 1.6 2024/09/15 05:26:05 yasuoka Exp $ */
/* /*
* Copyright (c) 2010 Reyk Floeter <reyk@vantronix.net> * Copyright (c) 2010 Reyk Floeter <reyk@vantronix.net>
@ -158,6 +158,7 @@ static const struct token t_ipcp[] = {
{ KEYWORD, "dump", IPCP_DUMP, t_ipcp_flags }, { KEYWORD, "dump", IPCP_DUMP, t_ipcp_flags },
{ KEYWORD, "monitor", IPCP_MONITOR, t_ipcp_flags }, { KEYWORD, "monitor", IPCP_MONITOR, t_ipcp_flags },
{ KEYWORD, "disconnect", IPCP_DISCONNECT,t_ipcp_session_seq }, { KEYWORD, "disconnect", IPCP_DISCONNECT,t_ipcp_session_seq },
{ KEYWORD, "delete", IPCP_DELETE, t_ipcp_session_seq },
{ ENDTOKEN, "", NONE, NULL } { ENDTOKEN, "", NONE, NULL }
}; };

View file

@ -1,4 +1,4 @@
/* $OpenBSD: parser.h,v 1.4 2024/07/24 08:27:20 yasuoka Exp $ */ /* $OpenBSD: parser.h,v 1.5 2024/09/15 05:26:05 yasuoka Exp $ */
/* This file is derived from OpenBSD:src/usr.sbin/ikectl/parser.h 1.9 */ /* This file is derived from OpenBSD:src/usr.sbin/ikectl/parser.h 1.9 */
/* /*
@ -29,6 +29,7 @@ enum actions {
IPCP_SHOW, IPCP_SHOW,
IPCP_DUMP, IPCP_DUMP,
IPCP_MONITOR, IPCP_MONITOR,
IPCP_DELETE,
IPCP_DISCONNECT IPCP_DISCONNECT
}; };

View file

@ -1,4 +1,4 @@
.\" $OpenBSD: radiusctl.8,v 1.9 2024/07/24 08:27:20 yasuoka Exp $ .\" $OpenBSD: radiusctl.8,v 1.10 2024/09/15 05:26:05 yasuoka Exp $
.\" .\"
.\" Copyright (c) YASUOKA Masahiko <yasuoka@yasuoka.net> .\" Copyright (c) YASUOKA Masahiko <yasuoka@yasuoka.net>
.\" .\"
@ -15,7 +15,7 @@
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\" .\"
.\" .\"
.Dd $Mdocdate: July 24 2024 $ .Dd $Mdocdate: September 15 2024 $
.Dt RADIUSCTL 8 .Dt RADIUSCTL 8
.Os .Os
.Sh NAME .Sh NAME
@ -114,6 +114,10 @@ shows the sessions in JSON format.
.It Cm ipcp disconnect Ar sequence .It Cm ipcp disconnect Ar sequence
Request to disconnect the session specified by the Request to disconnect the session specified by the
.Ar sequence . .Ar sequence .
.It Cm ipcp delete Ar sequence
Request to delete the session specified by the
.Ar sequence
without requesting disconnection.
.El .El
.Sh EXAMPLES .Sh EXAMPLES
.Bd -literal -offset indent .Bd -literal -offset indent

View file

@ -1,4 +1,4 @@
/* $OpenBSD: radiusctl.c,v 1.12 2024/07/24 08:27:20 yasuoka Exp $ */ /* $OpenBSD: radiusctl.c,v 1.13 2024/09/15 05:26:05 yasuoka Exp $ */
/* /*
* Copyright (c) 2015 YASUOKA Masahiko <yasuoka@yasuoka.net> * Copyright (c) 2015 YASUOKA Masahiko <yasuoka@yasuoka.net>
* *
@ -170,6 +170,7 @@ main(int argc, char *argv[])
IMSG_RADIUSD_MODULE_IPCP_MONITOR : IMSG_RADIUSD_MODULE_IPCP_MONITOR :
IMSG_RADIUSD_MODULE_IPCP_DUMP, 0, 0, -1, iov, niov); IMSG_RADIUSD_MODULE_IPCP_DUMP, 0, 0, -1, iov, niov);
break; break;
case IPCP_DELETE:
case IPCP_DISCONNECT: case IPCP_DISCONNECT:
memset(module_name, 0, sizeof(module_name)); memset(module_name, 0, sizeof(module_name));
strlcpy(module_name, "ipcp", strlcpy(module_name, "ipcp",
@ -178,8 +179,10 @@ main(int argc, char *argv[])
iov[niov++].iov_len = RADIUSD_MODULE_NAME_LEN; iov[niov++].iov_len = RADIUSD_MODULE_NAME_LEN;
iov[niov].iov_base = &res->session_seq; iov[niov].iov_base = &res->session_seq;
iov[niov++].iov_len = sizeof(res->session_seq); iov[niov++].iov_len = sizeof(res->session_seq);
imsg_composev(&ibuf, IMSG_RADIUSD_MODULE_IPCP_DISCONNECT, 0, 0, imsg_composev(&ibuf,
-1, iov, niov); (res->action == IPCP_DELETE)
? IMSG_RADIUSD_MODULE_IPCP_DELETE
: IMSG_RADIUSD_MODULE_IPCP_DISCONNECT, 0, 0, -1, iov, niov);
break; break;
} }
while (ibuf.w.queued) { while (ibuf.w.queued) {
@ -199,6 +202,7 @@ main(int argc, char *argv[])
case IPCP_SHOW: case IPCP_SHOW:
case IPCP_DUMP: case IPCP_DUMP:
case IPCP_MONITOR: case IPCP_MONITOR:
case IPCP_DELETE:
case IPCP_DISCONNECT: case IPCP_DISCONNECT:
done = ipcp_handle_imsg(res, &imsg, cnt++); done = ipcp_handle_imsg(res, &imsg, cnt++);
break; break;

View file

@ -1,4 +1,4 @@
/* $OpenBSD: eap2mschap_local.h,v 1.2 2024/07/16 06:18:20 miod Exp $ */ /* $OpenBSD: eap2mschap_local.h,v 1.3 2024/09/15 05:49:05 jsg Exp $ */
/* /*
* Copyright (c) 2024 Internet Initiative Japan Inc. * Copyright (c) 2024 Internet Initiative Japan Inc.
@ -70,7 +70,7 @@ struct eap_mschap_challenge {
uint8_t chall[16]; uint8_t chall[16];
char chap_name[0]; char chap_name[0];
} __packed; } __packed;
#if defined(__STDC_VERSION__) && __STDC_VERSION >= 201112L #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
static_assert(sizeof(struct eap_mschap_challenge) == 26, ""); static_assert(sizeof(struct eap_mschap_challenge) == 26, "");
static_assert(offsetof(struct eap_mschap_challenge, chap) == 5, ""); static_assert(offsetof(struct eap_mschap_challenge, chap) == 5, "");
static_assert(offsetof(struct eap_mschap_challenge, chall) == 10, ""); static_assert(offsetof(struct eap_mschap_challenge, chall) == 10, "");
@ -87,7 +87,7 @@ struct eap_mschap_response {
uint8_t flags; uint8_t flags;
uint8_t chap_name[0]; uint8_t chap_name[0];
} __packed; } __packed;
#if defined(__STDC_VERSION__) && __STDC_VERSION >= 201112L #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
static_assert(sizeof(struct eap_mschap_response) == 59, ""); static_assert(sizeof(struct eap_mschap_response) == 59, "");
static_assert(offsetof(struct eap_mschap_response, chap) == 5, ""); static_assert(offsetof(struct eap_mschap_response, chap) == 5, "");
static_assert(offsetof(struct eap_mschap_response, peerchall) == 10, ""); static_assert(offsetof(struct eap_mschap_response, peerchall) == 10, "");

View file

@ -1,4 +1,4 @@
/* $OpenBSD: radiusd_eap2mschap.c,v 1.3 2024/08/16 09:52:16 yasuoka Exp $ */ /* $OpenBSD: radiusd_eap2mschap.c,v 1.4 2024/09/15 05:31:23 yasuoka Exp $ */
/* /*
* Copyright (c) 2024 Internet Initiative Japan Inc. * Copyright (c) 2024 Internet Initiative Japan Inc.
@ -427,19 +427,18 @@ eap_recv(struct eap2mschap *self, u_int q_id, RADIUS_PACKET *pkt)
goto fail; goto fail;
case EAP_TYPE_MSCHAPV2: case EAP_TYPE_MSCHAPV2:
if (msgsiz < offsetof(struct eap, value[1])) { if (msgsiz < offsetof(struct eap, value[1])) {
log_warnx( log_warnx("q=%u EAP state=%s Received message has "
"q=%u EAP state=%s Received message has wrong in " "wrong in size for EAP-MS-CHAPV2: received length "
"size for EAP-MS-CHAPV2: received length %zu " "%zu eap.length=%u", q_id,
"eap.length=%u", q_id, hex_string(state, statesiz, hex_string(state, statesiz, buf2, sizeof(buf2)),
buf2, sizeof(buf2)), msgsiz, ntohs(eap->length)); msgsiz, ntohs(eap->length));
goto fail; goto fail;
} }
req = eap_recv_mschap(self, req, pkt, (struct eap_chap *)eap); req = eap_recv_mschap(self, req, pkt, (struct eap_chap *)eap);
break; break;
default: default:
log_warnx( log_warnx("q=%u EAP state=%s EAP unknown type=%u receieved.",
"q=%u EAP state=%s EAP unknown type=%u receieved.",
q_id, hex_string(state, statesiz, buf2, sizeof(buf2)), q_id, hex_string(state, statesiz, buf2, sizeof(buf2)),
eap->value[0]); eap->value[0]);
goto fail; goto fail;
@ -476,9 +475,8 @@ eap_recv_mschap(struct eap2mschap *self, struct access_req *req,
htons(resp->chap.length) < htons(resp->chap.length) <
sizeof(struct eap_mschap_response) - sizeof(struct eap_mschap_response) -
offsetof(struct eap_mschap_response, chap)) { offsetof(struct eap_mschap_response, chap)) {
log_warnx( log_warnx("q=%u EAP state=%s Received EAP message has "
"q=%u EAP state=%s Received EAP message has wrong " "wrong in size: received length %zu eap.length=%u "
"in size: received length %zu eap.length=%u "
"chap.length=%u valuesize=%u", req->q_id, "chap.length=%u valuesize=%u", req->q_id,
hex_string(req->state, sizeof(req->state), buf, hex_string(req->state, sizeof(req->state), buf,
sizeof(buf)), eapsiz, ntohs(resp->eap.length), sizeof(buf)), eapsiz, ntohs(resp->eap.length),

View file

@ -1,4 +1,4 @@
/* $OpenBSD: radiusd_ipcp.c,v 1.14 2024/08/27 06:06:14 florian Exp $ */ /* $OpenBSD: radiusd_ipcp.c,v 1.17 2024/09/15 05:31:23 yasuoka Exp $ */
/* /*
* Copyright (c) 2024 Internet Initiative Japan Inc. * Copyright (c) 2024 Internet Initiative Japan Inc.
@ -122,8 +122,10 @@ struct module_ipcp_dae {
struct sockaddr_in6 sin6; struct sockaddr_in6 sin6;
} nas_addr; } nas_addr;
struct event ev_sock; struct event ev_sock;
struct event ev_reqs;
TAILQ_ENTRY(module_ipcp_dae) next; TAILQ_ENTRY(module_ipcp_dae) next;
TAILQ_HEAD(, assigned_ipv4) reqs; TAILQ_HEAD(, assigned_ipv4) reqs;
int ninflight;
}; };
struct module_ipcp { struct module_ipcp {
@ -178,6 +180,8 @@ struct assigned_ipv4
struct in_addr); struct in_addr);
static struct assigned_ipv4 static struct assigned_ipv4
*ipcp_ipv4_find(struct module_ipcp *, struct in_addr); *ipcp_ipv4_find(struct module_ipcp *, struct in_addr);
static void ipcp_ipv4_delete(struct module_ipcp *,
struct assigned_ipv4 *, const char *);
static void ipcp_ipv4_release(struct module_ipcp *, static void ipcp_ipv4_release(struct module_ipcp *,
struct assigned_ipv4 *); struct assigned_ipv4 *);
static int assigned_ipv4_compar(struct assigned_ipv4 *, static int assigned_ipv4_compar(struct assigned_ipv4 *,
@ -198,6 +202,7 @@ static void ipcp_dae_send_disconnect_request(struct assigned_ipv4 *);
static void ipcp_dae_request_on_timeout(int, short, void *); static void ipcp_dae_request_on_timeout(int, short, void *);
static void ipcp_dae_on_event(int, short, void *); static void ipcp_dae_on_event(int, short, void *);
static void ipcp_dae_reset_request(struct assigned_ipv4 *); static void ipcp_dae_reset_request(struct assigned_ipv4 *);
static void ipcp_dae_send_pending_requests(int, short, void *);
static struct ipcp_address static struct ipcp_address
*parse_address_range(const char *); *parse_address_range(const char *);
static const char static const char
@ -303,18 +308,20 @@ ipcp_start(void *ctx)
TAILQ_FOREACH(dae, &self->daes, next) { TAILQ_FOREACH(dae, &self->daes, next) {
if ((sock = socket(dae->nas_addr.sin4.sin_family, if ((sock = socket(dae->nas_addr.sin4.sin_family,
SOCK_DGRAM, IPPROTO_UDP)) == -1) { SOCK_DGRAM, IPPROTO_UDP)) == -1) {
log_warn("could not start dae: %s", strerror(errno)); log_warn("%s: could not start dae: socket()", __func__);
return; return;
} }
if (connect(sock, (struct sockaddr *)&dae->nas_addr, if (connect(sock, (struct sockaddr *)&dae->nas_addr,
dae->nas_addr.sin4.sin_len) == -1) { dae->nas_addr.sin4.sin_len) == -1) {
log_warn("could not start dae: %s", strerror(errno)); log_warn("%s: could not start dae: connect()",
__func__);
return; return;
} }
dae->sock = sock; dae->sock = sock;
event_set(&dae->ev_sock, sock, EV_READ | EV_PERSIST, event_set(&dae->ev_sock, sock, EV_READ | EV_PERSIST,
ipcp_dae_on_event, dae); ipcp_dae_on_event, dae);
event_add(&dae->ev_sock, NULL); event_add(&dae->ev_sock, NULL);
evtimer_set(&dae->ev_reqs, ipcp_dae_send_pending_requests, dae);
} }
module_send_message(self->base, IMSG_OK, NULL); module_send_message(self->base, IMSG_OK, NULL);
@ -334,6 +341,8 @@ ipcp_stop(void *ctx)
close(dae->sock); close(dae->sock);
dae->sock = -1; dae->sock = -1;
} }
if (evtimer_pending(&dae->ev_reqs, NULL))
event_del(&dae->ev_reqs);
} }
if (evtimer_pending(&self->ev_timer, NULL)) if (evtimer_pending(&self->ev_timer, NULL))
evtimer_del(&self->ev_timer); evtimer_del(&self->ev_timer);
@ -624,10 +633,14 @@ ipcp_dispatch_control(void *ctx, struct imsg *imsg)
freezero(dump ,dumpsiz); freezero(dump ,dumpsiz);
break; break;
case IMSG_RADIUSD_MODULE_IPCP_DISCONNECT: case IMSG_RADIUSD_MODULE_IPCP_DISCONNECT:
case IMSG_RADIUSD_MODULE_IPCP_DELETE:
if (datalen < sizeof(unsigned)) { if (datalen < sizeof(unsigned)) {
log_warn("%s: received " log_warn("%s: received "
"IMSG_RADIUSD_MODULE_IPCP_DISCONNECT message size " "%s message size is wrong", __func__,
"is wrong", __func__); (imsg->hdr.type ==
IMSG_RADIUSD_MODULE_IPCP_DISCONNECT)
? "IMSG_RADIUSD_MODULE_IPCP_DISCONNECT"
: "IMSG_RADIUSD_MODULE_IPCP_DELETE");
goto fail; goto fail;
} }
seq = *(unsigned *)imsg->data; seq = *(unsigned *)imsg->data;
@ -640,12 +653,19 @@ ipcp_dispatch_control(void *ctx, struct imsg *imsg)
} }
if (assign == NULL) { if (assign == NULL) {
cause = "session not found"; cause = "session not found";
log_warnx("Disconnect seq=%u requested, but the " log_warnx("%s seq=%u requested, but the "
"session is not found", seq); "session is not found",
(imsg->hdr.type ==
IMSG_RADIUSD_MODULE_IPCP_DISCONNECT)? "Disconnect"
: "Delete", seq);
module_imsg_compose(self->base, IMSG_NG, module_imsg_compose(self->base, IMSG_NG,
imsg->hdr.peerid, 0, -1, cause, strlen(cause) + 1); imsg->hdr.peerid, 0, -1, cause, strlen(cause) + 1);
} } else if (imsg->hdr.type == IMSG_RADIUSD_MODULE_IPCP_DELETE) {
else { log_info("Delete seq=%u by request", assign->seq);
ipcp_ipv4_delete(self, assign, "By control");
module_imsg_compose(self->base, IMSG_OK,
imsg->hdr.peerid, 0, -1, NULL, 0);
} else {
if (assign->dae == NULL) if (assign->dae == NULL)
log_warnx("Disconnect seq=%u requested, but " log_warnx("Disconnect seq=%u requested, but "
"DAE is not configured", assign->seq); "DAE is not configured", assign->seq);
@ -1059,10 +1079,12 @@ ipcp_accounting_request(void *ctx, u_int q_id, const u_char *pkt,
!IN6_ARE_ADDR_EQUAL(&assign->nas_ipv6, &nas_ipv6) || !IN6_ARE_ADDR_EQUAL(&assign->nas_ipv6, &nas_ipv6) ||
strcmp(assign->nas_id, nas_id) != 0) strcmp(assign->nas_id, nas_id) != 0)
continue; continue;
log_info("Delete record for %s", inet_ntop(AF_INET, log_info("q=%u Delete record for %s", q_id,
&assign->ipv4, buf, sizeof(buf))); inet_ntop(AF_INET, &assign->ipv4, buf,
ipcp_del_db(self, assign); sizeof(buf)));
ipcp_ipv4_release(self, assign); ipcp_ipv4_delete(self, assign,
(type == RADIUS_ACCT_STATUS_TYPE_ACCT_ON)
? "Receive Acct-On" : "Receive Acct-Off");
} }
return; return;
} }
@ -1144,9 +1166,9 @@ ipcp_accounting_request(void *ctx, u_int q_id, const u_char *pkt,
if (ipcp_notice_startstop(self, assign, 1, NULL) != 0) if (ipcp_notice_startstop(self, assign, 1, NULL) != 0)
goto fail; goto fail;
log_info("Start seq=%u user=%s duration=%dsec session=%s " log_info("q=%u Start seq=%u user=%s duration=%dsec "
"tunnel=%s from=%s auth=%s ip=%s", assign->seq, "session=%s tunnel=%s from=%s auth=%s ip=%s", q_id,
assign->user->name, delay, assign->session_id, assign->seq, assign->user->name, delay, assign->session_id,
assign->tun_type, print_addr((struct sockaddr *) assign->tun_type, print_addr((struct sockaddr *)
&assign->tun_client, buf1, sizeof(buf1)), &assign->tun_client, buf1, sizeof(buf1)),
assign->auth_method, inet_ntop(AF_INET, &addr4, buf, assign->auth_method, inet_ntop(AF_INET, &addr4, buf,
@ -1180,10 +1202,10 @@ ipcp_accounting_request(void *ctx, u_int q_id, const u_char *pkt,
strlcpy(stat.cause, radius_terminate_cause_string(uval), strlcpy(stat.cause, radius_terminate_cause_string(uval),
sizeof(stat.cause)); sizeof(stat.cause));
log_info("Stop seq=%u user=%s duration=%lldsec session=%s " log_info("q=%u Stop seq=%u user=%s duration=%lldsec "
"tunnel=%s from=%s auth=%s ip=%s datain=%"PRIu64"bytes,%" "session=%s tunnel=%s from=%s auth=%s ip=%s "
PRIu32"packets dataout=%"PRIu64"bytes,%"PRIu32"packets " "datain=%"PRIu64"bytes,%" PRIu32"packets dataout=%"PRIu64
"cause=\"%s\"", "bytes,%"PRIu32"packets cause=\"%s\"", q_id,
assign->seq, assign->user->name, dur.tv_sec, assign->seq, assign->user->name, dur.tv_sec,
assign->session_id, assign->tun_type, print_addr( assign->session_id, assign->tun_type, print_addr(
(struct sockaddr *)&assign->tun_client, buf1, sizeof(buf1)), (struct sockaddr *)&assign->tun_client, buf1, sizeof(buf1)),
@ -1254,6 +1276,20 @@ ipcp_ipv4_find(struct module_ipcp *self, struct in_addr ina)
return (ret); return (ret);
} }
void
ipcp_ipv4_delete(struct module_ipcp *self, struct assigned_ipv4 *assign,
const char *cause)
{
static struct radiusd_ipcp_statistics stat = { 0 };
memset(stat.cause, 0, sizeof(stat.cause));
strlcpy(stat.cause, cause, sizeof(stat.cause));
ipcp_del_db(self, assign);
ipcp_notice_startstop(self, assign, 0, &stat);
ipcp_ipv4_release(self, assign);
}
void void
ipcp_ipv4_release(struct module_ipcp *self, struct assigned_ipv4 *assign) ipcp_ipv4_release(struct module_ipcp *self, struct assigned_ipv4 *assign)
{ {
@ -1567,22 +1603,27 @@ ipcp_dae_send_disconnect_request(struct assigned_ipv4 *assign)
radius_set_accounting_request_authenticator(reqpkt, radius_set_accounting_request_authenticator(reqpkt,
assign->dae->secret); assign->dae->secret);
assign->dae_reqpkt = reqpkt; assign->dae_reqpkt = reqpkt;
TAILQ_INSERT_TAIL(&assign->dae->reqs, assign, dae_next);
} }
if (assign->dae_ntry == 0) { if (assign->dae_ntry == 0) {
if (assign->dae->ninflight >= RADIUSD_IPCP_DAE_MAX_INFLIGHT)
return;
log_info("Sending Disconnect-Request seq=%u to %s", log_info("Sending Disconnect-Request seq=%u to %s",
assign->seq, print_addr((struct sockaddr *) assign->seq, print_addr((struct sockaddr *)
&assign->dae->nas_addr, buf, sizeof(buf))); &assign->dae->nas_addr, buf, sizeof(buf)));
TAILQ_INSERT_TAIL(&assign->dae->reqs, assign, dae_next);
} }
if (radius_send(assign->dae->sock, assign->dae_reqpkt, 0) < 0) if (radius_send(assign->dae->sock, assign->dae_reqpkt, 0) < 0)
log_warn("%s: sendto: %m", __func__); log_warn("%s: sendto: %m", __func__);
tv.tv_sec = dae_request_timeouts[assign->dae_ntry++]; tv.tv_sec = dae_request_timeouts[assign->dae_ntry];
tv.tv_usec = 0; tv.tv_usec = 0;
evtimer_set(&assign->dae_evtimer, ipcp_dae_request_on_timeout, assign); evtimer_set(&assign->dae_evtimer, ipcp_dae_request_on_timeout, assign);
evtimer_add(&assign->dae_evtimer, &tv); evtimer_add(&assign->dae_evtimer, &tv);
if (assign->dae_ntry == 0)
assign->dae->ninflight++;
assign->dae_ntry++;
} }
void void
@ -1625,7 +1666,7 @@ ipcp_dae_on_event(int fd, short ev, void *ctx)
if ((radres = radius_recv(dae->sock, 0)) == NULL) { if ((radres = radius_recv(dae->sock, 0)) == NULL) {
if (errno == EAGAIN) if (errno == EAGAIN)
return; return;
log_warn("Failed to receive from %s", print_addr( log_warn("%s: Failed to receive from %s", __func__, print_addr(
(struct sockaddr *)&dae->nas_addr, buf, sizeof(buf))); (struct sockaddr *)&dae->nas_addr, buf, sizeof(buf)));
return; return;
} }
@ -1634,16 +1675,16 @@ ipcp_dae_on_event(int fd, short ev, void *ctx)
break; break;
} }
if (assign == NULL) { if (assign == NULL) {
log_warnx("Received RADIUS packet from %s has unknown id=%d", log_warnx("%s: Received RADIUS packet from %s has unknown "
print_addr((struct sockaddr *)&dae->nas_addr, buf, "id=%d", __func__, print_addr((struct sockaddr *)
sizeof(buf)), radius_get_id(radres)); &dae->nas_addr, buf, sizeof(buf)), radius_get_id(radres));
goto out; goto out;
} }
radius_set_request_packet(radres, assign->dae_reqpkt); radius_set_request_packet(radres, assign->dae_reqpkt);
if ((radius_check_response_authenticator(radres, dae->secret)) != 0) { if ((radius_check_response_authenticator(radres, dae->secret)) != 0) {
log_warnx("Received RADIUS packet for seq=%u from %s has a bad " log_warnx("%s: Received RADIUS packet for seq=%u from %s has "
"authenticator", assign->seq, print_addr( "a bad authenticator", __func__, assign->seq, print_addr(
(struct sockaddr *)&dae->nas_addr, buf, (struct sockaddr *)&dae->nas_addr, buf,
sizeof(buf))); sizeof(buf)));
goto out; goto out;
@ -1667,13 +1708,13 @@ ipcp_dae_on_event(int fd, short ev, void *ctx)
&dae->nas_addr, buf, sizeof(buf)), cause); &dae->nas_addr, buf, sizeof(buf)), cause);
break; break;
case RADIUS_CODE_DISCONNECT_NAK: case RADIUS_CODE_DISCONNECT_NAK:
log_warnx("Received Disconnect-NAK for seq=%u from %s%s", log_info("Received Disconnect-NAK for seq=%u from %s%s",
assign->seq, print_addr((struct sockaddr *) assign->seq, print_addr((struct sockaddr *)
&dae->nas_addr, buf, sizeof(buf)), cause); &dae->nas_addr, buf, sizeof(buf)), cause);
break; break;
default: default:
log_warn("Received unknown code=%d for id=%u from %s", log_warn("%s: Received unknown code=%d for id=%u from %s",
code, assign->seq, print_addr((struct sockaddr *) __func__, code, assign->seq, print_addr((struct sockaddr *)
&dae->nas_addr, buf, sizeof(buf))); &dae->nas_addr, buf, sizeof(buf)));
break; break;
} }
@ -1700,10 +1741,16 @@ void
ipcp_dae_reset_request(struct assigned_ipv4 *assign) ipcp_dae_reset_request(struct assigned_ipv4 *assign)
{ {
struct radiusctl_client *client, *clientt; struct radiusctl_client *client, *clientt;
const struct timeval zero = { 0, 0 };
if (assign->dae != NULL) { if (assign->dae != NULL) {
if (assign->dae_ntry > 0) if (assign->dae_reqpkt != NULL)
TAILQ_REMOVE(&assign->dae->reqs, assign, dae_next); TAILQ_REMOVE(&assign->dae->reqs, assign, dae_next);
if (assign->dae_ntry > 0) {
assign->dae->ninflight--;
if (!evtimer_pending(&assign->dae->ev_reqs, NULL))
evtimer_add(&assign->dae->ev_reqs, &zero);
}
} }
if (assign->dae_reqpkt != NULL) if (assign->dae_reqpkt != NULL)
radius_delete_packet(assign->dae_reqpkt); radius_delete_packet(assign->dae_reqpkt);
@ -1717,6 +1764,23 @@ ipcp_dae_reset_request(struct assigned_ipv4 *assign)
assign->dae_ntry = 0; assign->dae_ntry = 0;
} }
void
ipcp_dae_send_pending_requests(int fd, short ev, void *ctx)
{
struct module_ipcp_dae *dae = ctx;
struct module_ipcp *self = dae->ipcp;
struct assigned_ipv4 *assign, *assignt;
ipcp_update_time(self);
TAILQ_FOREACH_SAFE(assign, &dae->reqs, dae_next, assignt) {
if (dae->ninflight >= RADIUSD_IPCP_DAE_MAX_INFLIGHT)
break;
if (assign->dae_ntry == 0) /* pending */
ipcp_dae_send_disconnect_request(assign);
}
}
/*********************************************************************** /***********************************************************************
* Miscellaneous functions * Miscellaneous functions
***********************************************************************/ ***********************************************************************/

View file

@ -1,4 +1,4 @@
/* $OpenBSD: radiusd_ipcp.h,v 1.1 2024/07/09 17:26:14 yasuoka Exp $ */ /* $OpenBSD: radiusd_ipcp.h,v 1.3 2024/09/15 05:29:11 yasuoka Exp $ */
/* /*
* Copyright (c) 2024 Internet Initiative Japan Inc. * Copyright (c) 2024 Internet Initiative Japan Inc.
@ -24,12 +24,15 @@
#include "radiusd.h" #include "radiusd.h"
#define RADIUSD_IPCP_DAE_MAX_INFLIGHT 64
enum imsg_module_ipcp_type { enum imsg_module_ipcp_type {
IMSG_RADIUSD_MODULE_IPCP_DUMP = IMSG_RADIUSD_MODULE_MIN, IMSG_RADIUSD_MODULE_IPCP_DUMP = IMSG_RADIUSD_MODULE_MIN,
IMSG_RADIUSD_MODULE_IPCP_MONITOR, IMSG_RADIUSD_MODULE_IPCP_MONITOR,
IMSG_RADIUSD_MODULE_IPCP_DUMP_AND_MONITOR, IMSG_RADIUSD_MODULE_IPCP_DUMP_AND_MONITOR,
IMSG_RADIUSD_MODULE_IPCP_START, IMSG_RADIUSD_MODULE_IPCP_START,
IMSG_RADIUSD_MODULE_IPCP_STOP, IMSG_RADIUSD_MODULE_IPCP_STOP,
IMSG_RADIUSD_MODULE_IPCP_DELETE,
IMSG_RADIUSD_MODULE_IPCP_DISCONNECT IMSG_RADIUSD_MODULE_IPCP_DISCONNECT
}; };

View file

@ -1,4 +1,4 @@
/* $OpenBSD: radiusd_module.c,v 1.19 2024/07/14 15:27:57 yasuoka Exp $ */ /* $OpenBSD: radiusd_module.c,v 1.20 2024/09/15 05:14:32 yasuoka Exp $ */
/* /*
* Copyright (c) 2015 YASUOKA Masahiko <yasuoka@yasuoka.net> * Copyright (c) 2015 YASUOKA Masahiko <yasuoka@yasuoka.net>
@ -643,9 +643,13 @@ module_on_event(int fd, short evmask, void *ctx)
if (ret > 0) if (ret > 0)
continue; continue;
base->writeready = false; base->writeready = false;
if (ret == 0 && errno == EAGAIN) if (ret == -1 && errno == EAGAIN)
break; break;
syslog(LOG_ERR, "%s: msgbuf_write: %m", __func__); if (ret == 0)
syslog(LOG_ERR, "%s: connection is closed", __func__);
else
syslog(LOG_ERR, "%s: msgbuf_write: %d %m", __func__,
ret);
module_stop(base); module_stop(base);
return; return;
} }