$OpenBSD: patch-src_libpiano_piano_c,v 1.10 2013/07/10 16:40:47 dcoppa Exp $

commit f6df7d7e510f2d8879ec54dce32fee2b691dc32d
Author: Lars-Dominik Braun <lars@6xq.net>
Date:   Tue Jul 2 17:13:47 2013 +0200

piano: Check for libgcrypt errors

Fixes mysterious segfaults from issue #369 and #293.

--- src/libpiano/piano.c.orig	Sun May 19 12:58:18 2013
+++ src/libpiano/piano.c	Wed Jul 10 18:20:12 2013
@@ -40,7 +40,7 @@ THE SOFTWARE.
  *	@param piano handle
  *	@return nothing
  */
-void PianoInit (PianoHandle_t *ph, const char *partnerUser,
+PianoReturn_t PianoInit (PianoHandle_t *ph, const char *partnerUser,
 		const char *partnerPassword, const char *device, const char *inkey,
 		const char *outkey) {
 	memset (ph, 0, sizeof (*ph));
@@ -48,15 +48,25 @@ void PianoInit (PianoHandle_t *ph, const char *partner
 	ph->partner.password = strdup (partnerPassword);
 	ph->partner.device = strdup (device);
 
-	gcry_cipher_open (&ph->partner.in, GCRY_CIPHER_BLOWFISH,
-			GCRY_CIPHER_MODE_ECB, 0);
-	gcry_cipher_setkey (ph->partner.in, (const unsigned char *) inkey,
-			strlen (inkey));
+	if (gcry_cipher_open (&ph->partner.in, GCRY_CIPHER_BLOWFISH,
+			GCRY_CIPHER_MODE_ECB, 0) != GPG_ERR_NO_ERROR) {
+		return PIANO_RET_GCRY_ERR;
+	}
+	if (gcry_cipher_setkey (ph->partner.in, (const unsigned char *) inkey,
+			strlen (inkey)) != GPG_ERR_NO_ERROR) {
+		return PIANO_RET_GCRY_ERR;
+	}
 
-	gcry_cipher_open (&ph->partner.out, GCRY_CIPHER_BLOWFISH,
-			GCRY_CIPHER_MODE_ECB, 0);
-	gcry_cipher_setkey (ph->partner.out, (const unsigned char *) outkey,
-			strlen (outkey));
+	if (gcry_cipher_open (&ph->partner.out, GCRY_CIPHER_BLOWFISH,
+			GCRY_CIPHER_MODE_ECB, 0) != GPG_ERR_NO_ERROR) {
+		return PIANO_RET_GCRY_ERR;
+	}
+	if (gcry_cipher_setkey (ph->partner.out, (const unsigned char *) outkey,
+			strlen (outkey)) != GPG_ERR_NO_ERROR) {
+		return PIANO_RET_GCRY_ERR;
+	}
+
+	return PIANO_RET_OK;
 }
 
 /*	destroy artist linked list
@@ -256,6 +266,10 @@ const char *PianoErrorToStr (PianoReturn_t ret) {
 
 		case PIANO_RET_QUALITY_UNAVAILABLE:
 			return "Selected audio quality is not available.";
+			break;
+
+		case PIANO_RET_GCRY_ERR:
+			return "libgcrypt initialization failed.";
 			break;
 
 		/* pandora error messages */
