sync code with last improvements from OpenBSD
This commit is contained in:
parent
0c904fa153
commit
cac1167ac2
64 changed files with 491 additions and 319 deletions
|
@ -1,4 +1,4 @@
|
|||
/* $OpenBSD: servconf.c,v 1.397 2023/08/29 02:50:10 djm Exp $ */
|
||||
/* $OpenBSD: servconf.c,v 1.401 2023/09/06 23:35:35 djm Exp $ */
|
||||
/*
|
||||
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
|
||||
* All rights reserved
|
||||
|
@ -599,7 +599,7 @@ static struct {
|
|||
{ "macs", sMacs, SSHCFG_GLOBAL },
|
||||
{ "protocol", sIgnore, SSHCFG_GLOBAL },
|
||||
{ "gatewayports", sGatewayPorts, SSHCFG_ALL },
|
||||
{ "subsystem", sSubsystem, SSHCFG_GLOBAL },
|
||||
{ "subsystem", sSubsystem, SSHCFG_ALL },
|
||||
{ "maxstartups", sMaxStartups, SSHCFG_GLOBAL },
|
||||
{ "persourcemaxstartups", sPerSourceMaxStartups, SSHCFG_GLOBAL },
|
||||
{ "persourcenetblocksize", sPerSourceNetBlockSize, SSHCFG_GLOBAL },
|
||||
|
@ -1876,39 +1876,54 @@ process_server_config_line_depth(ServerOptions *options, char *line,
|
|||
break;
|
||||
|
||||
case sSubsystem:
|
||||
if (options->num_subsystems >= MAX_SUBSYSTEMS) {
|
||||
fatal("%s line %d: too many subsystems defined.",
|
||||
filename, linenum);
|
||||
}
|
||||
arg = argv_next(&ac, &av);
|
||||
if (!arg || *arg == '\0')
|
||||
fatal("%s line %d: %s missing argument.",
|
||||
filename, linenum, keyword);
|
||||
if (!*activep) {
|
||||
arg = argv_next(&ac, &av);
|
||||
argv_consume(&ac);
|
||||
break;
|
||||
}
|
||||
for (i = 0; i < options->num_subsystems; i++)
|
||||
if (strcmp(arg, options->subsystem_name[i]) == 0)
|
||||
fatal("%s line %d: Subsystem '%s' "
|
||||
"already defined.", filename, linenum, arg);
|
||||
found = 0;
|
||||
for (i = 0; i < options->num_subsystems; i++) {
|
||||
if (strcmp(arg, options->subsystem_name[i]) == 0) {
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (found) {
|
||||
debug("%s line %d: Subsystem '%s' already defined.",
|
||||
filename, linenum, arg);
|
||||
argv_consume(&ac);
|
||||
break;
|
||||
}
|
||||
options->subsystem_name = xrecallocarray(
|
||||
options->subsystem_name, options->num_subsystems,
|
||||
options->num_subsystems + 1,
|
||||
sizeof(options->subsystem_name));
|
||||
options->subsystem_command = xrecallocarray(
|
||||
options->subsystem_command, options->num_subsystems,
|
||||
options->num_subsystems + 1,
|
||||
sizeof(options->subsystem_command));
|
||||
options->subsystem_args = xrecallocarray(
|
||||
options->subsystem_args, options->num_subsystems,
|
||||
options->num_subsystems + 1,
|
||||
sizeof(options->subsystem_args));
|
||||
options->subsystem_name[options->num_subsystems] = xstrdup(arg);
|
||||
arg = argv_next(&ac, &av);
|
||||
if (!arg || *arg == '\0')
|
||||
if (!arg || *arg == '\0') {
|
||||
fatal("%s line %d: Missing subsystem command.",
|
||||
filename, linenum);
|
||||
options->subsystem_command[options->num_subsystems] = xstrdup(arg);
|
||||
|
||||
/* Collect arguments (separate to executable) */
|
||||
p = xstrdup(arg);
|
||||
len = strlen(p) + 1;
|
||||
while ((arg = argv_next(&ac, &av)) != NULL) {
|
||||
len += 1 + strlen(arg);
|
||||
p = xreallocarray(p, 1, len);
|
||||
strlcat(p, " ", len);
|
||||
strlcat(p, arg, len);
|
||||
}
|
||||
options->subsystem_args[options->num_subsystems] = p;
|
||||
options->subsystem_command[options->num_subsystems] =
|
||||
xstrdup(arg);
|
||||
/* Collect arguments (separate to executable) */
|
||||
arg = argv_assemble(1, &arg); /* quote command correctly */
|
||||
arg2 = argv_assemble(ac, av); /* rest of command */
|
||||
xasprintf(&options->subsystem_args[options->num_subsystems],
|
||||
"%s %s", arg, arg2);
|
||||
free(arg2);
|
||||
argv_consume(&ac);
|
||||
options->num_subsystems++;
|
||||
break;
|
||||
|
||||
|
@ -2618,6 +2633,47 @@ int parse_server_match_testspec(struct connection_info *ci, char *spec)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
servconf_merge_subsystems(ServerOptions *dst, ServerOptions *src)
|
||||
{
|
||||
u_int i, j, found;
|
||||
|
||||
for (i = 0; i < src->num_subsystems; i++) {
|
||||
found = 0;
|
||||
for (j = 0; j < dst->num_subsystems; j++) {
|
||||
if (strcmp(src->subsystem_name[i],
|
||||
dst->subsystem_name[j]) == 0) {
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (found) {
|
||||
debug_f("override \"%s\"", dst->subsystem_name[j]);
|
||||
free(dst->subsystem_command[j]);
|
||||
free(dst->subsystem_args[j]);
|
||||
dst->subsystem_command[j] =
|
||||
xstrdup(src->subsystem_command[i]);
|
||||
dst->subsystem_args[j] =
|
||||
xstrdup(src->subsystem_args[i]);
|
||||
continue;
|
||||
}
|
||||
debug_f("add \"%s\"", src->subsystem_name[i]);
|
||||
dst->subsystem_name = xrecallocarray(
|
||||
dst->subsystem_name, dst->num_subsystems,
|
||||
dst->num_subsystems + 1, sizeof(dst->subsystem_name));
|
||||
dst->subsystem_command = xrecallocarray(
|
||||
dst->subsystem_command, dst->num_subsystems,
|
||||
dst->num_subsystems + 1, sizeof(dst->subsystem_command));
|
||||
dst->subsystem_args = xrecallocarray(
|
||||
dst->subsystem_args, dst->num_subsystems,
|
||||
dst->num_subsystems + 1, sizeof(dst->subsystem_args));
|
||||
j = dst->num_subsystems++;
|
||||
dst->subsystem_name[j] = xstrdup(src->subsystem_name[i]);
|
||||
dst->subsystem_command[j] = xstrdup(src->subsystem_command[i]);
|
||||
dst->subsystem_args[j] = xstrdup(src->subsystem_args[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Copy any supported values that are set.
|
||||
*
|
||||
|
@ -2724,6 +2780,9 @@ copy_set_server_options(ServerOptions *dst, ServerOptions *src, int preauth)
|
|||
free(dst->chroot_directory);
|
||||
dst->chroot_directory = NULL;
|
||||
}
|
||||
|
||||
/* Subsystems require merging. */
|
||||
servconf_merge_subsystems(dst, src);
|
||||
}
|
||||
|
||||
#undef M_CP_INTOPT
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue