浏览代码

log correctly if decoding onion failed

svn:r1690
Roger Dingledine 21 年之前
父节点
当前提交
e355ed0e15
共有 2 个文件被更改,包括 12 次插入9 次删除
  1. 6 4
      src/or/connection.c
  2. 6 5
      src/or/cpuworker.c

+ 6 - 4
src/or/connection.c

@@ -774,18 +774,20 @@ void connection_write_to_buf(const char *string, int len, connection_t *conn) {
   }
 }
 
+/* get the conn to addr/port that has the most recent timestamp_created */
 connection_t *connection_exact_get_by_addr_port(uint32_t addr, uint16_t port) {
   int i, n;
-  connection_t *conn;
+  connection_t *conn, *best=NULL;
   connection_t **carray;
 
   get_connection_array(&carray,&n);
   for(i=0;i<n;i++) {
     conn = carray[i];
-    if(conn->addr == addr && conn->port == port && !conn->marked_for_close)
-      return conn;
+    if(conn->addr == addr && conn->port == port && !conn->marked_for_close &&
+       (!best || best->timestamp_created < conn->timestamp_created))
+      best = conn;
   }
-  return NULL;
+  return best;
 }
 
 connection_t *connection_twin_get_by_addr_port(uint32_t addr, uint16_t port) {

+ 6 - 5
src/or/cpuworker.c

@@ -102,16 +102,17 @@ int connection_cpu_process_inbuf(connection_t *conn) {
     if(p_conn)
       circ = circuit_get_by_circ_id_conn(circ_id, p_conn);
 
+    if(success == 0) {
+      log_fn(LOG_WARN,"decoding onionskin failed. Closing.");
+      if(circ)
+        circuit_mark_for_close(circ);
+      goto done_processing;
+    }
     if(!circ) {
       log_fn(LOG_INFO,"processed onion for a circ that's gone. Dropping.");
       goto done_processing;
     }
     assert(circ->p_conn);
-    if(success == 0) {
-      log_fn(LOG_WARN,"decoding onionskin failed. Closing.");
-      circuit_mark_for_close(circ);
-      goto done_processing;
-    }
     if(onionskin_answer(circ, buf+TAG_LEN, buf+TAG_LEN+ONIONSKIN_REPLY_LEN) < 0) {
       log_fn(LOG_WARN,"onionskin_answer failed. Closing.");
       circuit_mark_for_close(circ);