Commit 9698858abc134a5dadda33b21780e35443d4f74f

Con Kolivas 2012-10-03T18:19:31

Remove the sshare hash entry if we failed to send it.

diff --git a/cgminer.c b/cgminer.c
index a78b1a2..4969315 100644
--- a/cgminer.c
+++ b/cgminer.c
@@ -2767,7 +2767,12 @@ static void *submit_work_thread(void *userdata)
 
 		applog(LOG_INFO, "Submitting share %08lx to pool %d", (unsigned long)(hash32[6]), pool->pool_no);
 
-		stratum_send(pool, s, strlen(s));
+		if (unlikely(!stratum_send(pool, s, strlen(s)))) {
+			mutex_lock(&sshare_lock);
+			HASH_DEL(stratum_shares, sshare);
+			mutex_unlock(&sshare_lock);
+			free(sshare);
+		}
 
 		goto out;
 	}
diff --git a/util.c b/util.c
index c0c85e8..9b6677b 100644
--- a/util.c
+++ b/util.c
@@ -1189,9 +1189,10 @@ out:
 bool initiate_stratum(struct pool *pool)
 {
 	json_t *val = NULL, *res_val, *err_val, *notify_val;
+	bool ret = false, notify = false;
 	char *s, *buf, *sret = NULL;
 	json_error_t err;
-	bool ret = false;
+	int i, arr_size;
 
 	if (pool->stratum_active)
 		return true;
@@ -1232,7 +1233,8 @@ bool initiate_stratum(struct pool *pool)
 	err_val = json_object_get(val, "error");
 
 	if (!res_val || json_is_null(res_val) ||
-	    (err_val && !json_is_null(err_val))) {
+	    (err_val && !json_is_null(err_val)) ||
+	    !json_is_array(res_val)) {
 		char *ss;
 
 		if (err_val)
@@ -1247,17 +1249,26 @@ bool initiate_stratum(struct pool *pool)
 		goto out;
 	}
 
-	notify_val = json_array_get(res_val, 0);
-	if (!notify_val || json_is_null(notify_val)) {
-		applog(LOG_INFO, "Failed to parse notify_val in initiate_stratum");
-		goto out;
+	arr_size = json_array_size(res_val);
+	for (i = 0; i < arr_size; i++) {
+		notify_val = json_array_get(res_val, i);
+		if (!notify_val || json_is_null(notify_val)) {
+			applog(LOG_INFO, "Failed to parse notify_val in initiate_stratum");
+			goto out;
+		}
+
+		buf = __json_array_string(notify_val, 0);
+		if (buf && !strcasecmp(buf, "mining.notify")) {
+			notify = true;
+			break;
+		}
 	}
 
-	buf = __json_array_string(notify_val, 0);
-	if (!buf || strcasecmp(buf, "mining.notify")) {
+	if (!notify) {
 		applog(LOG_INFO, "Failed to get mining notify in initiate_stratum");
 		goto out;
 	}
+
 	pool->subscription = json_array_string(notify_val, 1);
 	if (!pool->subscription) {
 		applog(LOG_INFO, "Failed to get a subscription in initiate_stratum");