Projects
Factory:RISC-V:Base
openssh
_service:tar_scm:openssh-7.3p1-x11-max-displays...
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File _service:tar_scm:openssh-7.3p1-x11-max-displays.patch of Package openssh
Reference:https://src.fedoraproject.org/rpms/openssh/blob/rawhide/f/openssh-7.3p1-x11-max-displays.patch --- channels.c | 23 ++++++++++++++--------- channels.h | 2 +- servconf.c | 12 +++++++++++- servconf.h | 2 ++ session.c | 5 +++-- sshd_config.5 | 7 +++++++ 6 files changed, 38 insertions(+), 13 deletions(-) diff --git a/channels.c b/channels.c index 7230540..040a4c6 100644 --- a/channels.c +++ b/channels.c @@ -101,8 +101,8 @@ #define FWD_PERMIT_ANY_HOST "*" /* -- X11 forwarding */ -/* Maximum number of fake X11 displays to try. */ -#define MAX_DISPLAYS 1000 +/* Minimum port number for X11 forwarding */ +#define X11_PORT_MIN 6000 /* Per-channel callback for pre/post IO actions */ typedef void chan_fn(struct ssh *, Channel *c); @@ -4801,7 +4801,7 @@ rdynamic_connect_finish(struct ssh *ssh, Channel *c) */ int x11_create_display_inet(struct ssh *ssh, int x11_display_offset, - int x11_use_localhost, int single_connection, + int x11_use_localhost, int x11_max_displays, int single_connection, u_int *display_numberp, int **chanids) { Channel *nc = NULL; @@ -4814,10 +4814,15 @@ x11_create_display_inet(struct ssh *ssh, int x11_display_offset, if (chanids == NULL) return -1; + /* Try to bind ports starting at 6000+X11DisplayOffset */ + x11_max_displays = x11_max_displays + x11_display_offset; + for (display_number = x11_display_offset; - display_number < MAX_DISPLAYS; + display_number < x11_max_displays; display_number++) { - port = 6000 + display_number; + port = X11_PORT_MIN + display_number; + if (port < X11_PORT_MIN) /* overflow */ + break; memset(&hints, 0, sizeof(hints)); hints.ai_family = ssh->chanctxt->IPv4or6; hints.ai_flags = x11_use_localhost ? 0: AI_PASSIVE; @@ -4870,7 +4875,7 @@ x11_create_display_inet(struct ssh *ssh, int x11_display_offset, if (num_socks > 0) break; } - if (display_number >= MAX_DISPLAYS) { + if (display_number >= x11_max_displays || port < X11_PORT_MIN ) { error("Failed to allocate internet-domain X11 display socket."); return -1; } @@ -5054,7 +5059,7 @@ x11_connect_display(struct ssh *ssh) memset(&hints, 0, sizeof(hints)); hints.ai_family = ssh->chanctxt->IPv4or6; hints.ai_socktype = SOCK_STREAM; - snprintf(strport, sizeof strport, "%u", 6000 + display_number); + snprintf(strport, sizeof strport, "%u", X11_PORT_MIN + display_number); if ((gaierr = getaddrinfo(buf, strport, &hints, &aitop)) != 0) { error("%.100s: unknown host. (%s)", buf, ssh_gai_strerror(gaierr)); @@ -5070,7 +5075,7 @@ x11_connect_display(struct ssh *ssh) /* Connect it to the display. */ if (connect(sock, ai->ai_addr, ai->ai_addrlen) == -1) { debug2("connect %.100s port %u: %.100s", buf, - 6000 + display_number, strerror(errno)); + X11_PORT_MIN + display_number, strerror(errno)); close(sock); continue; } @@ -5080,7 +5085,7 @@ x11_connect_display(struct ssh *ssh) freeaddrinfo(aitop); if (!ai) { error("connect %.100s port %u: %.100s", buf, - 6000 + display_number, strerror(errno)); + X11_PORT_MIN + display_number, strerror(errno)); return -1; } set_nodelay(sock); diff --git a/channels.h b/channels.h index 828c1b6..7d8a83e 100644 --- a/channels.h +++ b/channels.h @@ -361,7 +361,7 @@ int permitopen_port(const char *); void channel_set_x11_refuse_time(struct ssh *, u_int); int x11_connect_display(struct ssh *); -int x11_create_display_inet(struct ssh *, int, int, int, u_int *, int **); +int x11_create_display_inet(struct ssh *, int, int, int, int, u_int *, int **); void x11_request_forwarding_with_spoofing(struct ssh *, int, const char *, const char *, const char *, int); diff --git a/servconf.c b/servconf.c index 13c4a08..fdba127 100644 --- a/servconf.c +++ b/servconf.c @@ -115,6 +115,7 @@ initialize_server_options(ServerOptions *options) options->print_lastlog = -1; options->x11_forwarding = -1; options->x11_display_offset = -1; + options->x11_max_displays = -1; options->x11_use_localhost = -1; options->permit_tty = -1; options->permit_user_rc = -1; @@ -330,6 +331,8 @@ fill_default_server_options(ServerOptions *options) options->x11_forwarding = 0; if (options->x11_display_offset == -1) options->x11_display_offset = 10; + if (options->x11_max_displays == -1) + options->x11_max_displays = DEFAULT_MAX_DISPLAYS; if (options->x11_use_localhost == -1) options->x11_use_localhost = 1; if (options->xauth_location == NULL) @@ -518,7 +521,7 @@ typedef enum { sPasswordAuthentication, sKbdInteractiveAuthentication, sListenAddress, sAddressFamily, sPrintMotd, sPrintLastLog, sIgnoreRhosts, - sX11Forwarding, sX11DisplayOffset, sX11UseLocalhost, + sX11Forwarding, sX11DisplayOffset, sX11MaxDisplays, sX11UseLocalhost, sPermitTTY, sStrictModes, sEmptyPasswd, sTCPKeepAlive, sPermitUserEnvironment, sAllowTcpForwarding, sCompression, sRekeyLimit, sAllowUsers, sDenyUsers, sAllowGroups, sDenyGroups, @@ -652,6 +655,7 @@ static struct { { "ignoreuserknownhosts", sIgnoreUserKnownHosts, SSHCFG_GLOBAL }, { "x11forwarding", sX11Forwarding, SSHCFG_ALL }, { "x11displayoffset", sX11DisplayOffset, SSHCFG_ALL }, + { "x11maxdisplays", sX11MaxDisplays, SSHCFG_ALL }, { "x11uselocalhost", sX11UseLocalhost, SSHCFG_ALL }, { "xauthlocation", sXAuthLocation, SSHCFG_GLOBAL }, { "strictmodes", sStrictModes, SSHCFG_GLOBAL }, @@ -1680,6 +1684,10 @@ process_server_config_line_depth(ServerOptions *options, char *line, *intptr = value; break; + case sX11MaxDisplays: + intptr = &options->x11_max_displays; + goto parse_int; + case sX11UseLocalhost: intptr = &options->x11_use_localhost; goto parse_flag; @@ -2678,6 +2686,7 @@ copy_set_server_options(ServerOptions *dst, ServerOptions *src, int preauth) M_CP_INTOPT(fwd_opts.streamlocal_bind_unlink); M_CP_INTOPT(x11_display_offset); M_CP_INTOPT(x11_forwarding); + M_CP_INTOPT(x11_max_displays); M_CP_INTOPT(x11_use_localhost); M_CP_INTOPT(permit_tty); M_CP_INTOPT(permit_user_rc); @@ -2953,6 +2962,7 @@ dump_config(ServerOptions *o) #endif dump_cfg_int(sLoginGraceTime, o->login_grace_time); dump_cfg_int(sX11DisplayOffset, o->x11_display_offset); + dump_cfg_int(sX11MaxDisplays, o->x11_max_displays); dump_cfg_int(sMaxAuthTries, o->max_authtries); dump_cfg_int(sMaxSessions, o->max_sessions); dump_cfg_int(sClientAliveInterval, o->client_alive_interval); diff --git a/servconf.h b/servconf.h index 37d3a6f..77fd779 100644 --- a/servconf.h +++ b/servconf.h @@ -45,6 +45,7 @@ #define DEFAULT_AUTH_FAIL_MAX 6 /* Default for MaxAuthTries */ #define DEFAULT_SESSIONS_MAX 10 /* Default for MaxSessions */ +#define DEFAULT_MAX_DISPLAYS 1000 /* Maximum number of fake X11 displays to try. */ /* Magic name for internal sftp-server */ #define INTERNAL_SFTP_NAME "internal-sftp" @@ -105,6 +106,7 @@ typedef struct { int x11_forwarding; /* If true, permit inet (spoofing) X11 fwd. */ int x11_display_offset; /* What DISPLAY number to start * searching at */ + int x11_max_displays; /* Number of displays to search */ int x11_use_localhost; /* If true, use localhost for fake X11 server. */ char *xauth_location; /* Location of xauth program */ int permit_tty; /* If false, deny pty allocation */ diff --git a/session.c b/session.c index 6040d51..dd7d148 100644 --- a/session.c +++ b/session.c @@ -2612,8 +2612,9 @@ session_setup_x11fwd(struct ssh *ssh, Session *s) return 0; } if (x11_create_display_inet(ssh, options.x11_display_offset, - options.x11_use_localhost, s->single_connection, - &s->display_number, &s->x11_chanids) == -1) { + options.x11_use_localhost, options.x11_max_displays, + s->single_connection, &s->display_number, + &s->x11_chanids) == -1) { debug("x11_create_display_inet failed."); return 0; } diff --git a/sshd_config.5 b/sshd_config.5 index 4396b93..440fe92 100644 --- a/sshd_config.5 +++ b/sshd_config.5 @@ -1280,6 +1280,7 @@ Available keywords are .Cm StreamLocalBindUnlink , .Cm TrustedUserCAKeys , .Cm X11DisplayOffset , +.Cm X11MaxDisplays , .Cm X11Forwarding and .Cm X11UseLocalhost . @@ -1847,6 +1848,12 @@ Specifies the first display number available for X11 forwarding. This prevents sshd from interfering with real X11 servers. The default is 10. +.It Cm X11MaxDisplays +Specifies the maximum number of displays available for +.Xr sshd 8 Ns 's +X11 forwarding. +This prevents sshd from exhausting local ports. +The default is 1000. .It Cm X11Forwarding Specifies whether X11 forwarding is permitted. The argument must be -- 2.27.0
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.
浙ICP备2022010568号-2