diff --git a/src/protocol_misc.c b/src/protocol_misc.c
index b2695436..91bb28c0 100644
--- a/src/protocol_misc.c
+++ b/src/protocol_misc.c
@@ -123,12 +123,19 @@ bool send_pong(connection_t *c) {
 }
 
 bool pong_h(connection_t *c, const char *request) {
-	int current_rtt = 0;
-	int tv_sec, tv_usec, ret;
+	int ret;
+	long current_rtt = 0;
+	long tv_sec, tv_usec;
 	struct timeval _now;
+
+	if (!c->status.pinged) {
+		logger(DEBUG_ALWAYS, LOG_WARNING, "received pong without ping");
+		return false;
+	}
+
 	c->status.pinged = false;
 
-	ret = sscanf(request, "%*d %d %d", &tv_sec, &tv_usec);
+	ret = sscanf(request, "%*d %ld %ld", &tv_sec, &tv_usec);
 	gettimeofday(&_now, NULL);
 
 	if (ret != 2) {
@@ -137,12 +144,17 @@ bool pong_h(connection_t *c, const char *request) {
 		tv_usec = c->last_ping_time.tv_usec;
 	}
 
-	/* RTT should be in ms */
-	current_rtt = (_now.tv_sec - tv_sec)*1000;
-	/* Compute diff between usec */
-	current_rtt += _now.tv_usec >= tv_usec ? _now.tv_usec - tv_usec : tv_usec - _now.tv_usec;
+	if (_now.tv_sec - tv_sec > 2*pingtimeout) {
+		/* timeout_handler should close the meta connection after pingtimeout.
+		 * So if we still receive such pong, something is fishy. */
+		logger(DEBUG_ALWAYS, LOG_ERR, "bogus pong received from %s (%s)", c->name, c->hostname);
+		return false;
+	}
 
-	current_rtt = current_rtt/1000;
+	/* current_rtt should be in ms */
+	current_rtt += (_now.tv_sec - tv_sec) * 1000;
+	/* Compute diff between usec */
+	current_rtt += (_now.tv_usec - tv_usec) / 1000;
 
 	if (c->edge->avg_rtt == 0)
 		c->edge->avg_rtt = current_rtt;