Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

piano: Check for libgcrypt errors

Fixes mysterious segfaults from issue #369 and #293.
  • Loading branch information...
commit f6df7d7e510f2d8879ec54dce32fee2b691dc32d 1 parent a1e73fc
@PromyLOPh authored
View
2  INSTALL
@@ -8,7 +8,7 @@ Dependencies
- pthreads
- libao
- gnutls
-- gcrypt
+- gcrypt (with blowfish cipher enabled)
- json-c
- libfaad2 (compiled with --without-drm)
- libmad (optional, Pandora One users only)
View
32 src/libpiano/piano.c
@@ -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 *partnerUser,
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
@@ -258,6 +268,10 @@ const char *PianoErrorToStr (PianoReturn_t ret) {
return "Selected audio quality is not available.";
break;
+ case PIANO_RET_GCRY_ERR:
+ return "libgcrypt initialization failed.";
+ break;
+
/* pandora error messages */
case PIANO_RET_P_INTERNAL:
return "Internal error.";
View
3  src/libpiano/piano.h
@@ -250,6 +250,7 @@ typedef enum {
PIANO_RET_OUT_OF_MEMORY = 4,
PIANO_RET_INVALID_LOGIN = 5,
PIANO_RET_QUALITY_UNAVAILABLE = 6,
+ PIANO_RET_GCRY_ERR = 7,
/* pandora error codes */
PIANO_RET_P_INTERNAL = PIANO_RET_OFFSET+0,
@@ -297,7 +298,7 @@ typedef enum {
PIANO_RET_P_RATE_LIMIT = PIANO_RET_OFFSET+1039,
} PianoReturn_t;
-void PianoInit (PianoHandle_t *, const char *,
+PianoReturn_t PianoInit (PianoHandle_t *, const char *,
const char *, const char *, const char *,
const char *);
void PianoDestroy (PianoHandle_t *);
View
10 src/main.c
@@ -424,8 +424,14 @@ int main (int argc, char **argv) {
BarSettingsInit (&app.settings);
BarSettingsRead (&app.settings);
- PianoInit (&app.ph, app.settings.partnerUser, app.settings.partnerPassword,
- app.settings.device, app.settings.inkey, app.settings.outkey);
+ PianoReturn_t pret;
+ if ((pret = PianoInit (&app.ph, app.settings.partnerUser,
+ app.settings.partnerPassword, app.settings.device,
+ app.settings.inkey, app.settings.outkey)) != PIANO_RET_OK) {
+ BarUiMsg (&app.settings, MSG_ERR, "Initialization failed:"
+ " %s\n", PianoErrorToStr (pret));
+ return 0;
+ }
BarUiMsg (&app.settings, MSG_NONE,
"Welcome to " PACKAGE " (" VERSION ")! ");
Please sign in to comment.
Something went wrong with that request. Please try again.