1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-10 01:48:00 +00:00
putty-source/windows
Simon Tatham ee987ce4cd pterm.exe: fix handling of Windows exception codes.
Unlike on Unix, a Windows process's exit status is a DWORD, i.e. a
32-bit unsigned integer. And exit statuses seen in practice can range
up into the high half of that space. For example, if a process dies of
an 'illegal instruction' exception, then the exit status retrieved by
GetExitCodeProcess will be 0xC000001D == STATUS_ILLEGAL_INSTRUCTION.

If this happens to the process running inside pterm.exe, then
conpty->exitstatus will be set to a value greater than INT_MAX, which
will cause conpty_exitcode to return -1. Unfortunately, a -1 return
from conpty_exitstatus is treated by front ends as saying that the
backend process hasn't exited yet, and is still running. So pterm will
sit around after its subprocess has already terminated, contrary to
your 'close on exit' setting.

Moreover, when cmd.exe exits, it apparently passes on to its parent
process the exit status of the last subcommand it ran. So if you run a
Windows pterm containing an ordinary interactive console session, and
the last subprogram you happen to run inside that session dies of a
fatal signal, then the same thing will happen after you type 'exit' at
the command prompt.

This has been happening to me intermittently ever since I created
pterm.exe in the first place, and I guessed completely wrong about the
cause (I feared some kind of subtle race condition in pterm's use of
the process API). I've only just managed to reproduce it reliably
enough to debug, and I'm relieved to find it's much simpler than that!

The immediate fix, in any case, is to ensure we don't return -1 from
conpty_exitcode unless the process really is still running. And don't
return INT_MAX either, because that indicates 'unclean exit' in a way
that triggers 'close window only on clean exit' (and even Unix pterm
doesn't consider the primary subprocess dying of a signal to count as
unclean). So we clip all out-of-range Windows exception codes to
INT_MAX-1.

In the longer term I think it would be nice to turn exit codes into a
full 32-bit space, and move the special values completely out of it.
That would permit actually keeping the exact exception code and
passing it on to a caller who needed it. For example, if we were to
write a Windows psusan (which I could imagine being occasionally
useful), this way it would be able to return the unmodified full
Windows exit code via the "exit-status" chanreq. But I don't think we
currently have any clients needing that much detail, so that's a more
intrusive cleanup for a later date.
2022-03-08 18:05:48 +00:00
..
utils Windows Pageant and PuTTYgen: spiff up option parsing. 2022-01-15 18:27:19 +00:00
agent-client.c Move agent_named_pipe_name into its own source file. 2022-01-03 12:12:05 +00:00
cliloop.c Reorganise Windows HANDLE management. 2021-05-24 15:27:38 +01:00
CMakeLists.txt Windows Pageant and PuTTYgen: spiff up option parsing. 2022-01-15 18:27:19 +00:00
config.c Update source file names in comments and docs. 2022-01-22 15:51:31 +00:00
conpty.c pterm.exe: fix handling of Windows exception codes. 2022-03-08 18:05:48 +00:00
console.c Update source file names in comments and docs. 2022-01-22 15:51:31 +00:00
controls.c Update source file names in comments and docs. 2022-01-22 15:51:31 +00:00
cryptoapi.h Rename most of the platform source files. 2021-04-26 18:00:01 +01:00
dialog.c Update source file names in comments and docs. 2022-01-22 15:51:31 +00:00
gss.c Avoid crash in MIT Kerberos for Windows on session restart. 2021-07-01 18:59:44 +01:00
handle-io.c Update source file names in comments and docs. 2022-01-22 15:51:31 +00:00
handle-socket.c Update source file names in comments and docs. 2022-01-22 15:51:31 +00:00
handle-wait.c Fix an unused variable. 2021-05-27 09:48:32 +01:00
help.c Update source file names in comments and docs. 2022-01-22 15:51:31 +00:00
help.h New config option for shifted arrow key handling. 2021-10-18 20:15:35 +01:00
help.rc2 Rename most of the platform source files. 2021-04-26 18:00:01 +01:00
installer.wxs Configurable CHM path in installer source. 2021-05-03 17:01:55 +01:00
jump-list.c Update source file names in comments and docs. 2022-01-22 15:51:31 +00:00
local-proxy.c Update source file names in comments and docs. 2022-01-22 15:51:31 +00:00
make_install_images.sh Remove white dialog background in MSI user interface. 2020-06-21 16:39:47 +01:00
msifixup.py Remove white dialog background in MSI user interface. 2020-06-21 16:39:47 +01:00
named-pipe-client.c Update source file names in comments and docs. 2022-01-22 15:51:31 +00:00
named-pipe-server.c Move proxy-related source files into a subdirectory. 2021-10-30 17:29:24 +01:00
network.c net_service_lookup: add missing 'const'. 2022-01-22 15:51:33 +00:00
no-jump-list.c Update source file names in comments and docs. 2022-01-22 15:51:31 +00:00
nohelp.c Update source file names in comments and docs. 2022-01-22 15:51:31 +00:00
noise.c Rename most of the platform source files. 2021-04-26 18:00:01 +01:00
pageant-rc.h winpgnt: say 'click to focus' in async passphrase prompt. 2021-04-22 20:00:46 +01:00
pageant.c Update source file names in comments and docs. 2022-01-22 15:51:31 +00:00
pageant.ico
pageant.mft Whitespace rationalisation of entire code base. 2019-09-08 20:29:21 +01:00
pageant.rc Rename most of the platform source files. 2021-04-26 18:00:01 +01:00
pageants.ico
platform.h Update source file names in comments and docs. 2022-01-22 15:51:31 +00:00
plink.c Richer data type for interactive prompt results. 2021-12-28 18:08:31 +00:00
plink.rc
printing.c Rename most of the platform source files. 2021-04-26 18:00:01 +01:00
pscp.ico
pscp.rc
psftp.rc
psocks.c Rename most of the platform source files. 2021-04-26 18:00:01 +01:00
pterm.c New config option for shifted arrow key handling. 2021-10-18 20:15:35 +01:00
pterm.ico Make Windows versions of the pterm icons. 2021-05-08 17:33:25 +01:00
pterm.rc New application: a Windows version of 'pterm'! 2021-05-08 17:51:27 +01:00
ptermcfg.ico Make Windows versions of the pterm icons. 2021-05-08 17:33:25 +01:00
putty-common.rc2 Mention the host name in host-key prompts. 2021-09-16 14:33:59 +01:00
putty-rc.h Mention the host name in host-key prompts. 2021-09-16 14:33:59 +01:00
putty.c Move some parts of window.c into putty.c. 2021-05-08 17:20:50 +01:00
putty.ico
putty.mft Windows 10: add per monitor DPI awareness support. 2021-04-02 19:04:19 +01:00
putty.rc Move icon declarations out of putty-common.rc2. 2021-05-08 17:33:25 +01:00
puttycfg.ico
puttygen-rc.h PuTTYgen: option to control Argon2 flavour. 2021-02-23 18:26:50 +00:00
puttygen.c Windows PuTTYgen: support cmdgen's key-type and PPK options. 2022-01-15 18:54:07 +00:00
puttygen.ico
puttygen.mft Whitespace rationalisation of entire code base. 2019-09-08 20:29:21 +01:00
puttygen.rc Rename most of the platform source files. 2021-04-26 18:00:01 +01:00
puttyins.ico
puttytel.mft Windows 10: add per monitor DPI awareness support. 2021-04-02 19:04:19 +01:00
puttytel.rc Move icon declarations out of putty-common.rc2. 2021-05-08 17:33:25 +01:00
rcstuff.h Replace mkfiles.pl with a CMake build system. 2021-04-17 13:53:02 +01:00
README-msi.txt Remove note about .CHM on network drives. 2019-03-18 21:53:45 +00:00
security-api.h Update source file names in comments and docs. 2022-01-22 15:51:31 +00:00
select-cli.c Update source file names in comments and docs. 2022-01-22 15:51:31 +00:00
select-gui.c Update source file names in comments and docs. 2022-01-22 15:51:31 +00:00
serial.c Add memsets after allocation of all Backend implementors. 2021-10-30 17:28:28 +01:00
sftp.c Update source file names in comments and docs. 2022-01-22 15:51:31 +00:00
sharing.c Windows: factor out mutex lock/unlock from sharing.c. 2022-01-03 12:12:05 +00:00
sizetip.c Formatting change to braces around one case of a switch. 2020-02-16 11:26:21 +00:00
storage.c Update source file names in comments and docs. 2022-01-22 15:51:31 +00:00
unicode.c Rename most of the platform source files. 2021-04-26 18:00:01 +01:00
version.rc2 FIXME about Windows resource CHMfulness hint. 2019-03-18 22:02:13 +00:00
website.url Switch chiark URLs to https. 2017-05-07 16:29:01 +01:00
win-gui-seat.h Update source file names in comments and docs. 2022-01-22 15:51:31 +00:00
window.c Windows: make 'resize by changing font' work again. 2022-01-08 14:04:51 +00:00
x11.c Update source file names in comments and docs. 2022-01-22 15:51:31 +00:00