ueno / ruby-gpgme

a ruby interface to GnuPG Made Easy (GPGME).
GNU Lesser General Public License v2.1
232 stars 99 forks source link

Errno::ENOMEM Foked process memory issue? #71

Open neohunter opened 9 years ago

neohunter commented 9 years ago

We are using this on a big site, server has 32 Gb ram. But after a couple of days runing we are receiving this error when trying to encript a binary file:

Errno::ENOMEM (Cannot allocate memory):
  gpgme (2.0.2) lib/gpgme/ctx.rb:219:in `keylist_start'
  gpgme (2.0.2) lib/gpgme/ctx.rb:250:in `each_key'
  gpgme (2.0.2) lib/gpgme/ctx.rb:265:in `keys'
  gpgme (2.0.2) lib/gpgme/key.rb:57:in `find'
  gpgme (2.0.2) lib/gpgme/ctx.rb:67:in `new'
  gpgme (2.0.2) lib/gpgme/key.rb:56:in `find'
  gpgme (2.0.2) lib/gpgme/key.rb:52:in `each'
  gpgme (2.0.2) lib/gpgme/key.rb:52:in `find'
  gpgme (2.0.2) lib/gpgme/crypto.rb:84:in `encrypt'
  lib/attachment_auto_backup.rb:13:in `send_to_s3'
  app/models/zipped_file.rb:19
....
  config/initializers/mongrel.rb:62:in `dispatch_cgi'

this is our code:

crypto = GPGME::Crypto.new
    crypted_content = crypto.encrypt relative_path_tarball, :recipients => "our@email.com", :always_trust => true

My experience suggest me that this is because an attemp to fork a process... but I've searched over the gpgme code and it seems to happend on a loop trying to find the key to encrypt.

crypto.rb
keys        = Key.find(:public, options[:recipients])

If i run on rails console:

GPGME::Key.find :public, "our@email.com"

I got this output almost inmediatly:

[
    [0] #<GPGME::Key pub 1024D/9869EFC4 2007-11-17 trust=nil, owner_trust=:ultimate, capability=[:encrypt, :sign, :certify, :authenticate], subkeys=[#<GPGME::SubKey sub 1024D/XXXXX XXX-11-17 trust=nil, capability=[:encrypt, :sign, :certify, :authenticate]>, #<GPGME::SubKey sub 2048g/XXXXXXXX 2007-11-17 trust=nil, capability=[:encrypt, :sign, :certify, :authenticate]>], uids=[#<GPGME::UserID XXX <our@email.com> validity=ultimate, signatures=[]>]>
]