1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-09 17:38:00 +00:00
Go to file
Simon Tatham 17c57e1078 Reorganise Windows HANDLE management.
Before commit 6e69223dc2, Pageant would stop working after a
certain number of PuTTYs were active at the same time. (At most about
60, but maybe fewer - see below.)

This was because of two separate bugs. The easy one, fixed in
6e69223dc2 itself, was that PuTTY left each named-pipe connection
to Pageant open for the rest of its lifetime. So the real problem was
that Pageant had too many active connections at once. (And since a
given PuTTY might make multiple connections during userauth - one to
list keys, and maybe another to actually make a signature - that was
why the number of _PuTTYs_ might vary.)

It was clearly a bug that PuTTY was leaving connections to Pageant
needlessly open. But it was _also_ a bug that Pageant couldn't handle
more than about 60 at once. In this commit, I fix that secondary bug.

The cause of the bug is that the WaitForMultipleObjects function
family in the Windows API have a limit on the number of HANDLE objects
they can select between. The limit is MAXIMUM_WAIT_OBJECTS, defined to
be 64. And handle-io.c was using a separate event object for each I/O
subthread to communicate back to the main thread, so as soon as all
those event objects (plus a handful of other HANDLEs) added up to more
than 64, we'd start passing an overlarge handle array to
WaitForMultipleObjects, and it would start not doing what we wanted.

To fix this, I've reorganised handle-io.c so that all its subthreads
share just _one_ event object to signal readiness back to the main
thread. There's now a linked list of 'struct handle' objects that are
ready to be processed, protected by a CRITICAL_SECTION. Each subthread
signals readiness by adding itself to the linked list, and setting the
event object to indicate that the list is now non-empty. When the main
thread receives the event, it iterates over the whole list processing
all the ready handles.

(Each 'struct handle' still has a separate event object for the main
thread to use to communicate _to_ the subthread. That's OK, because no
thread is ever waiting on all those events at once: each subthread
only waits on its own.)

The previous HT_FOREIGN system didn't really fit into this framework.
So I've moved it out into its own system. There's now a handle-wait.c
which deals with the relatively simple job of managing a list of
handles that need to be waited for, each with a callback function;
that's what communicates a list of HANDLEs to event loops, and
receives the notification when the event loop notices that one of them
has done something. And handle-io.c is now just one client of
handle-wait.c, providing a single HANDLE to the event loop, and
dealing internally with everything that needs to be done when that
handle fires.

The new top-level handle-wait.c system *still* can't deal with more
than MAXIMUM_WAIT_OBJECTS. At the moment, I'm reasonably convinced it
doesn't need to: the only kind of HANDLE that any of our tools could
previously have needed to wait on more than one of was the one in
handle-io.c that I've just removed. But I've left some assertions and
a TODO comment in there just in case we need to change that in future.
2021-05-24 15:27:38 +01:00
charset Add missing dependencies on generated source files. 2021-04-18 17:01:50 +01:00
cmake Don't #include <utmp.h> if it doesn't exist. 2021-05-13 18:40:47 +01:00
contrib New script contrib/plinkfs. 2020-08-04 18:56:47 +01:00
crypto Spelling: standardise on "DSA", not "DSS". 2021-04-22 18:34:47 +01:00
doc Allow standalone cmake in the doc subdirectory. 2021-05-08 10:37:41 +01:00
icons Make Windows versions of the pterm icons. 2021-05-08 17:33:25 +01:00
keygen Spelling: standardise on "DSA", not "DSS". 2021-04-22 18:34:47 +01:00
otherbackends New Seat method, notify_remote_disconnect. 2021-05-22 13:09:34 +01:00
ssh New Seat method, notify_remote_disconnect. 2021-05-22 13:09:34 +01:00
test New test tool: list-accel.py. 2021-05-09 09:06:12 +01:00
unix Initial support for in-process proxy SSH connections. 2021-05-22 14:13:52 +01:00
utils New Seat method, notify_remote_disconnect. 2021-05-22 13:09:34 +01:00
windows Reorganise Windows HANDLE management. 2021-05-24 15:27:38 +01:00
.gitignore Add .gitignore rules for in-tree builds. 2021-04-19 18:26:56 +01:00
aqsync.c Build outgoing SSH agent requests in a strbuf. 2018-05-25 14:36:16 +01:00
be_all_s.c New GUI for protocol selection. 2021-04-10 09:51:29 +01:00
be_all.c New GUI for protocol selection. 2021-04-10 09:51:29 +01:00
be_misc.c Formatting change to braces around one case of a switch. 2020-02-16 11:26:21 +00:00
be_none.c New GUI for protocol selection. 2021-04-10 09:51:29 +01:00
be_nos_s.c New GUI for protocol selection. 2021-04-10 09:51:29 +01:00
be_nossh.c New GUI for protocol selection. 2021-04-10 09:51:29 +01:00
be_ssh.c New GUI for protocol selection. 2021-04-10 09:51:29 +01:00
Buildscr New application: a Windows version of 'pterm'! 2021-05-08 17:51:27 +01:00
Buildscr.cv Replace mkfiles.pl with a CMake build system. 2021-04-17 13:53:02 +01:00
callback.c Add lots of missing 'static' keywords. 2020-01-29 06:44:18 +00:00
cgtest.c cmdgen: support configurable key fingerprint type. 2021-03-13 11:01:35 +00:00
CHECKLST.txt Spelling errors in the release checklist. 2021-05-03 17:01:55 +01:00
clicons.c Change vtable defs to use C99 designated initialisers. 2020-03-10 21:06:29 +00:00
CMakeLists.txt Initial support for in-process proxy SSH connections. 2021-05-22 14:13:52 +01:00
cmdgen.c cmdgen: add missing null pointer check in --dump mode. 2021-05-19 10:42:42 +01:00
cmdline.c Document new backend command-line options. 2021-02-21 16:44:51 +00:00
config.c Initial support for in-process proxy SSH connections. 2021-05-22 14:13:52 +01:00
console.c Console host key prompts: add 'more info' action. 2021-03-13 13:54:59 +00:00
console.h Factor out some common code in {ux,win}cons.c. 2021-03-13 11:01:35 +00:00
cproxy.c Whitespace rationalisation of entire code base. 2019-09-08 20:29:21 +01:00
defs.h Make cmake.h available everywhere. 2021-04-19 18:26:56 +01:00
dialog.c dialog system: add a side-by-side alignment feature. 2021-04-10 09:43:25 +01:00
dialog.h dialog system: add a side-by-side alignment feature. 2021-04-10 09:43:25 +01:00
errsock.c Change vtable defs to use C99 designated initialisers. 2020-03-10 21:06:29 +00:00
fuzzterm.c Make TermWin's palette_get_overrides() take a Terminal *. 2021-05-08 18:14:56 +01:00
import.c Spelling: standardise on "DSA", not "DSS". 2021-04-22 18:34:47 +01:00
LATEST.VER Update version number for 0.75 release. 2021-05-02 08:11:24 +01:00
ldisc.c Remove assertion that len != 0 in ldisc_send. 2020-06-14 10:17:20 +01:00
ldisc.h New array-growing macros: sgrowarray and sgrowarrayn. 2019-02-28 20:15:38 +00:00
LICENCE It's a new year. 2021-01-11 21:37:51 +00:00
licence.pl Separate the functions of licence.pl. 2021-04-17 13:52:27 +01:00
logging.c Assorted benign warning fixes. 2020-01-29 06:44:18 +00:00
marshal.h Add some more marshalling functions, for file parsing. 2020-01-09 19:57:35 +00:00
minibidi.c Formatting change to braces around one case of a switch. 2020-02-16 11:26:21 +00:00
misc.h Break up x11fwd.c. 2021-04-18 08:18:27 +01:00
mksrcarc.sh Replace mkfiles.pl with a CMake build system. 2021-04-17 13:53:02 +01:00
mkunxarc.sh Integrate the 'doc' subdir into the CMake system. 2021-05-03 17:01:55 +01:00
mpint.h Add mp_copy_integer_into function. 2020-03-01 20:09:01 +00:00
network.h Initial support for in-process proxy SSH connections. 2021-05-22 14:13:52 +01:00
nocmdline.c Make cmdline_tooltype a const int. 2020-01-30 06:40:22 +00:00
nocproxy.c Whitespace rationalisation of entire code base. 2019-09-08 20:29:21 +01:00
nogss.c Rewrite gprefs() in settings.c so that its input mapping includes 2011-06-25 17:37:31 +00:00
noprint.c noprint.c: fix compile failure. 2021-02-10 21:07:57 +00:00
noproxy.c Introduce noproxy.c. 2020-09-13 09:11:31 +01:00
norand.c Centralise 'no random numbers' stubs into norand.c. 2020-02-07 19:17:19 +00:00
nosshproxy.c Initial support for in-process proxy SSH connections. 2021-05-22 14:13:52 +01:00
noterm.c Make calling term_nopaste() a cross-platform feature. 2013-08-17 16:06:40 +00:00
notiming.c Whitespace rationalisation of entire code base. 2019-09-08 20:29:21 +01:00
nullplug.c Change vtable defs to use C99 designated initialisers. 2020-03-10 21:06:29 +00:00
pageant.c pageant_get_keylist: add missing init of kl->broken. 2021-04-10 10:55:53 +01:00
pageant.h winpgnt: menu options to delete/reencrypt everything. 2021-04-04 10:02:24 +01:00
pinger.c Whitespace rationalisation of entire code base. 2019-09-08 20:29:21 +01:00
pproxy.c Get rid of lots of implicit pointer types. 2018-10-04 19:10:23 +01:00
proxy.c Make SSH proxying conditional on CONF_proxy_type! 2021-05-24 14:16:01 +01:00
proxy.h Whitespace rationalisation of entire code base. 2019-09-08 20:29:21 +01:00
pscp.c New Seat method, notify_remote_disconnect. 2021-05-22 13:09:34 +01:00
psftp.c New Seat method, notify_remote_disconnect. 2021-05-22 13:09:34 +01:00
psftp.h Remove FLAG_VERBOSE. 2020-01-30 06:40:21 +00:00
psftpcommon.c Move the SSH implementation into its own subdirectory. 2021-04-22 18:09:13 +01:00
psocks.c Move the SSH implementation into its own subdirectory. 2021-04-22 18:09:13 +01:00
psocks.h Auxiliary application: 'psocks', a simple SOCKS server. 2020-02-23 16:36:27 +00:00
putty.h Reorder proxy-type enum for backwards compatibility. 2021-05-24 14:18:01 +01:00
puttymem.h Whitespace rationalisation of entire code base. 2019-09-08 20:29:21 +01:00
README Replace mkfiles.pl with a CMake build system. 2021-04-17 13:53:02 +01:00
release.pl Replace mkfiles.pl with a CMake build system. 2021-04-17 13:53:02 +01:00
settings.c Move the SSH implementation into its own subdirectory. 2021-04-22 18:09:13 +01:00
sign.sh Whitespace rationalisation of entire code base. 2019-09-08 20:29:21 +01:00
ssh.h Spelling: standardise on "DSA", not "DSS". 2021-04-22 18:34:47 +01:00
sshcr.h Assorted benign warning fixes. 2020-01-29 06:44:18 +00:00
sshkeygen.h Spelling: standardise on "DSA", not "DSS". 2021-04-22 18:34:47 +01:00
sshproxy.c Initial support for in-process proxy SSH connections. 2021-05-22 14:13:52 +01:00
sshpubk.c Fix tight loop on reading truncated key files. 2021-05-23 08:59:13 +01:00
sshrand.c Remove dependency of sshrand.c on SHA-512. 2020-09-13 09:11:31 +01:00
storage.h Whitespace rationalisation of entire code base. 2019-09-08 20:29:21 +01:00
terminal.c Fix changing colours in Change Settings. 2021-05-20 23:39:42 +01:00
terminal.h Apply UPDATE_DELAY in arrears, not in advance. 2021-02-07 19:59:21 +00:00
testcrypt.c Spelling: standardise on "DSA", not "DSS". 2021-04-22 18:34:47 +01:00
testcrypt.h Break up crypto modules containing HW acceleration. 2021-04-21 21:55:26 +01:00
testsc.c Move a few stray header files into the crypto subdir. 2021-04-22 17:57:56 +01:00
testzlib.c Move the SSH implementation into its own subdirectory. 2021-04-22 18:09:13 +01:00
timing.c Whitespace rationalisation of entire code base. 2019-09-08 20:29:21 +01:00
tree234.h Whitespace rationalisation of entire code base. 2019-09-08 20:29:21 +01:00
version.h Replace mkfiles.pl with a CMake build system. 2021-04-17 13:53:02 +01:00
x11disp.c Move the SSH implementation into its own subdirectory. 2021-04-22 18:09:13 +01:00

This is the README for PuTTY, a free Windows and Unix Telnet and SSH
client.

PuTTY is built using CMake <https://cmake.org/>. To compile in the
simplest way (on any of Linux, Windows or Mac), run these commands in
the source directory:

  cmake .
  cmake --build .

Documentation (in various formats including Windows Help and Unix
`man' pages) is built from the Halibut (`.but') files in the `doc'
subdirectory using `doc/Makefile'. If you aren't using one of our
source snapshots, you'll need to do this yourself. Halibut can be
found at <https://www.chiark.greenend.org.uk/~sgtatham/halibut/>.

The PuTTY home web site is

    https://www.chiark.greenend.org.uk/~sgtatham/putty/

If you want to send bug reports or feature requests, please read the
Feedback section of the web site before doing so. Sending one-line
reports saying `it doesn't work' will waste your time as much as
ours.

See the file LICENCE for the licence conditions.