diff --git a/apps/app_festival.c b/apps/app_festival.c
index e7e0bd42697a9cac6e633b2494a11f77fa9bbb2f..7b6f68634e94c7c3f61ff16775208d75fa8a2493 100755
--- a/apps/app_festival.c
+++ b/apps/app_festival.c
@@ -305,9 +305,9 @@ static int festival_exec(struct ast_channel *chan, void *vdata)
 	if (!(festivalcommand = ast_variable_retrieve(cfg, "general", "festivalcommand"))) {
 		festivalcommand = "(tts_textasterisk \"%s\" 'file)(quit)\n";
 	}
-	ast_destroy(cfg);
 	if (!vdata || ast_strlen_zero(vdata)) {
 		ast_log(LOG_WARNING, "festival requires an argument (text)\n");
+		ast_destroy(cfg);
 		return -1;
 	}
 	strncpy(data, vdata, sizeof(data) - 1);
@@ -325,6 +325,7 @@ static int festival_exec(struct ast_channel *chan, void *vdata)
 
     	if (fd < 0) {
 		ast_log(LOG_WARNING,"festival_client: can't get socket\n");
+		ast_destroy(cfg);
         	return -1;
 	}
         memset(&serv_addr, 0, sizeof(serv_addr));
@@ -333,6 +334,7 @@ static int festival_exec(struct ast_channel *chan, void *vdata)
 	        serverhost = ast_gethostbyname(host, &ahp);
 	        if (serverhost == (struct hostent *)0) {
         	    	ast_log(LOG_WARNING,"festival_client: gethostbyname failed\n");
+			ast_destroy(cfg);
 	            	return -1;
         	}
 	        memmove(&serv_addr.sin_addr,serverhost->h_addr, serverhost->h_length);
@@ -342,6 +344,7 @@ static int festival_exec(struct ast_channel *chan, void *vdata)
 
 	if (connect(fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) != 0) {
 		ast_log(LOG_WARNING,"festival_client: connect to server failed\n");
+		ast_destroy(cfg);
         	return -1;
     	}
     	
@@ -444,6 +447,7 @@ static int festival_exec(struct ast_channel *chan, void *vdata)
     		}
 	} while (strcmp(ack,"OK\n") != 0);
 	close(fd);
+	ast_destroy(cfg);
 	LOCAL_USER_REMOVE(u);                                                                                
 	return res;