Issue #13379 has been updated by ahorek (Pavel Rosick).


Yes, these APIs are very platform specific. I was just checking documentations and existing solutions. Maybe I'll use the Resolv api, but I need to check incompatibilities and also a performance impact.

----------------------------------------
Feature #13379: [PATCH] safe IMAP connections
https://bugs.ruby-lang.org/issues/13379#change-64006

* Author: ahorek (Pavel Rosick)
* Status: Open
* Priority: Normal
* Assignee: shugo (Shugo Maeda)
* Target version: 
----------------------------------------
Hi,
I found out that using the standard IMAP library isn't very safe. It can be forced to hang the whole application.

the problem is here
```
s = @sock.gets(CRLF)
```
-> the server accepted the connection but it didn't send any data. Now I need to reboot the server because my thread is blocked forever.

I have no other option but to use this
```
Timeout.timeout(timeout, Net::OpenTimeout) { Net::IMAP.new(host, port, ssl) }
```

which basically works, but I really don't want to create a new thread for each IMAP call, so I did these changes:
1/ replaced TCPSocket with Socket.tcp
2/ replaced sock.read and sock.gets with sock.read_nonblock

now it works as expected.

Patch
https://github.com/ruby/ruby/pull/1557

related issue, please consider merging this one as well
#12928

---Files--------------------------------
imap.patch (3.29 KB)
0002-raise-Net-OpenTimeout.patch (1.27 KB)
0001-ssl_socket_connect-for-imap.patch (1.01 KB)


-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>