From c1e5c1c00bd996140d2a74ee4b5e50182b846bc6 Mon Sep 17 00:00:00 2001 From: Antonio Terceiro Date: Sun, 3 May 2015 20:13:29 -0300 Subject: Fix usage of filters - avoid accessing $? unless it is actually available - when calling a filter, make sure to release the mutex even if there is an exception during the filter handling. The long term solution is to drastically reorganize concurrency code. --- feed2imap-test | 5 +++++ lib/feed2imap/feed2imap.rb | 35 +++++++++++++++++++---------------- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/feed2imap-test b/feed2imap-test index b5e7390..e8424b5 100755 --- a/feed2imap-test +++ b/feed2imap-test @@ -24,6 +24,11 @@ feeds: - name: CNPQ url: http://www.cnpq.br/web/guest/noticias/-/asset_publisher/6QsO/rss?p_p_cacheability=cacheLevelPage target: maildir://#{maildir} + filter: /bin/cat + - name: Planet Debian (broken filter) + url: http://planet.debian.org/atom.xml + target: maildir://#{maildir} + filter: /bin/epicfail - name: XKCD url: http://www.xkcd.com/atom.xml target: maildir://#{maildir} diff --git a/lib/feed2imap/feed2imap.rb b/lib/feed2imap/feed2imap.rb index 64663c6..b84b6b6 100644 --- a/lib/feed2imap/feed2imap.rb +++ b/lib/feed2imap/feed2imap.rb @@ -130,7 +130,7 @@ class Feed2Imap # thread-safe, and we need to get the right exitcode mutex.lock s = %x{#{feed.execurl}} - if $?.exitstatus != 0 + if $? && $?.exitstatus != 0 @logger.warn("Command for #{feed.name} exited with status #{$?.exitstatus} !") end mutex.unlock @@ -143,22 +143,25 @@ class Feed2Imap # thread-safe, and we need to get the right exitcode. mutex.lock # hack hack hack, avoid buffering problems - stdin, stdout, stderr = Open3::popen3(feed.filter) - inth = Thread::new do - stdin.puts s - stdin.close + begin + stdin, stdout, stderr = Open3::popen3(feed.filter) + inth = Thread::new do + stdin.puts s + stdin.close + end + output = nil + outh = Thread::new do + output = stdout.read + end + inth.join + outh.join + s = output + if $? && $?.exitstatus != 0 + @logger.warn("Filter command for #{feed.name} exited with status #{$?.exitstatus}. Output might be corrupted !") + end + ensure + mutex.unlock end - output = nil - outh = Thread::new do - output = stdout.read - end - inth.join - outh.join - s = output - if $?.exitstatus != 0 - @logger.warn("Filter command for #{feed.name} exited with status #{$?.exitstatus}. Output might be corrupted !") - end - mutex.unlock end if Time::now - fetch_start > F2I_WARNFETCHTIME @logger.info("Fetching feed #{feed.name} took #{(Time::now - fetch_start).to_i}s") -- cgit v1.2.3