~x2go/x2go/python-x2go_master

« back to all changes in this revision

Viewing changes to x2go/rforward.py

  • Committer: Mike Gabriel
  • Author(s): Tomáš Cerha
  • Date: 2022-06-22 20:45:39 UTC
  • Revision ID: git-v1:8dc074e4a2bf630b14f50c41ce0154cb223b3b9a
Prevent infinite loop in X2GoRevFwTunnel handler

Without this change, we observed a running X2Go session freezing after about 3
hours running on Windows with the following output:

WARN: Reverse tunnel <paramiko.Channel 16 (open) window=2036405 ->
<paramiko.Transport at 0x4e4f270L (cipher aes128-ctr, 128 bits) (active; 2 open
channel(s))>> encoutered socket error: [Errno 10054] An existing connection was
forcibly closed by the remote host

Breaking after catching 1024 socket errors prevents looping forever.  The
tunnel is automatically closed, which allows the application to reopen it
automatically and recover gracefully from the situation.

Show diffs side-by-side

added added

removed removed

Lines of Context:
330
330
    logger('Connected! Reverse tunnel open %r -> %r -> %r' % (chan.origin_addr,
331
331
                                                              chan.getpeername(), (addr, port)),
332
332
                                                              loglevel=log.loglevel_INFO)
 
333
    n = 0
333
334
    while parent_thread._accept_channels:
334
335
        r, w, x = select.select([fw_socket, chan], [], [])
335
336
        try:
345
346
                fw_socket.send(data)
346
347
        except socket.error as e:
347
348
            logger('Reverse tunnel %s encoutered socket error: %s' % (chan, str(e)), loglevel=log.loglevel_WARN)
 
349
            n += 1
 
350
            if n >= 1024:
 
351
                break
348
352
 
349
353
    chan.close()
350
354
    fw_socket.close()