require 'formula'

class Gloox < Formula
  homepage 'http://camaya.net/gloox/'
  url 'http://camaya.net/download/gloox-1.0.tar.bz2'
  sha1 '8c788738f72b05fae7c05c744a67859419ffa09c'

  depends_on 'pkg-config' => :build

  # Fix memory leak
  # http://bugs.camaya.net/horde/whups/ticket/?id=181
  # Issue tracker is 404 on 3/17/2012 - @adamv
  def patches; DATA; end

  def install
    system "./configure", "--disable-debug",
                          "--prefix=#{prefix}",
                          "--with-openssl",
                          "--without-gnutls",
                          "--with-zlib"
    system "make install"
  end
end

__END__
diff --git a/src/tlsgnutlsbase.cpp b/src/tlsgnutlsbase.cpp
index d98c802..37f702d 100644
--- a/src/tlsgnutlsbase.cpp
+++ b/src/tlsgnutlsbase.cpp
@@ -97,7 +97,7 @@ namespace gloox
     gnutls_bye( *m_session, GNUTLS_SHUT_RDWR );
     gnutls_db_remove_session( *m_session );
     gnutls_credentials_clear( *m_session );
-    if( m_secure )
+    if( m_session )
       gnutls_deinit( *m_session );
 
     m_secure = false;
diff --git a/src/tlsgnutlsclient.cpp b/src/tlsgnutlsclient.cpp
index c1d24c2..d250f32 100644
--- a/src/tlsgnutlsclient.cpp
+++ b/src/tlsgnutlsclient.cpp
@@ -33,6 +33,8 @@ namespace gloox
   void GnuTLSClient::cleanup()
   {
     GnuTLSBase::cleanup();
+    if (m_credentials)
+        gnutls_certificate_free_credentials( m_credentials );
     init();
   }
 
@@ -120,6 +122,7 @@ namespace gloox
       m_certInfo.status |= CertSignerNotCa;
     const gnutls_datum_t* certList = 0;
     unsigned int certListSize;
+    unsigned int certListSizeFull;
     if( !error && ( ( certList = gnutls_certificate_get_peers( *m_session, &certListSize ) ) == 0 ) )
       error = true;
 
@@ -131,6 +134,7 @@ namespace gloox
         error = true;
     }
 
+    certListSizeFull = certListSize;
     if( ( gnutls_x509_crt_check_issuer( cert[certListSize-1], cert[certListSize-1] ) > 0 )
          && certListSize > 0 )
       certListSize--;
@@ -189,7 +193,7 @@ namespace gloox
     if( !gnutls_x509_crt_check_hostname( cert[0], m_server.c_str() ) )
       m_certInfo.status |= CertWrongPeer;
 
-    for( unsigned int i = 0; i < certListSize; ++i )
+    for( unsigned int i = 0; i < certListSizeFull; ++i )
       gnutls_x509_crt_deinit( cert[i] );
 
     delete[] cert;
