[tor-commits] [stegotorus/master] symbolic names for opcodes, better presentation of bad packet headers

zwol at torproject.org zwol at torproject.org
Fri Jul 20 23:17:08 UTC 2012


commit 05efb662f00e77a4333fce9dd5fada425b62b0b3
Author: Zack Weinberg <zackw at cmu.edu>
Date:   Wed Jun 20 10:50:48 2012 -0700

    symbolic names for opcodes, better presentation of bad packet headers
---
 src/protocol/chop.cc |   56 ++++++++++++++++++++++++++++++++-----------------
 1 files changed, 36 insertions(+), 20 deletions(-)

diff --git a/src/protocol/chop.cc b/src/protocol/chop.cc
index 8b79167..0d914d8 100644
--- a/src/protocol/chop.cc
+++ b/src/protocol/chop.cc
@@ -77,14 +77,29 @@ enum opcode_t
   op_DAT = 0,       // Pass data section along to upstream
   op_FIN = 1,       // No further transmissions (pass data along if any)
   op_RST = 2,       // Protocol error, close circuit now
-  op_RK1 = 3,       // Commence rekeying
-  op_RK2 = 4,       // Continue rekeying
-  op_RK3 = 5,       // Conclude rekeying
-  op_RESERVED0 = 6, // 6 -- 127 reserved for future definition
+  op_RESERVED0 = 3, // 3 -- 127 reserved for future definition
   op_STEG0 = 128,   // 128 -- 255 reserved for steganography modules
   op_LAST = 255
 };
 
+static const char *
+opname(opcode_t o, char fallbackbuf[4])
+{
+  switch (o) {
+  case op_DAT: return "DAT";
+  case op_FIN: return "FIN";
+  case op_RST: return "RST";
+  default: {
+    unsigned int x = o;
+    if (x < op_STEG0)
+      xsnprintf(fallbackbuf, sizeof fallbackbuf, "R%02x", x);
+    else
+      xsnprintf(fallbackbuf, sizeof fallbackbuf, "S%02x", x - op_STEG0);
+    return fallbackbuf;
+  }
+  }
+}
+
 class block_header
 {
   uint8_t clear[16];
@@ -857,9 +872,10 @@ chop_circuit_t::send_targeted(chop_conn_t *conn, size_t d, size_t p, opcode_t f,
     return -1;
   }
 
-  log_debug(conn, "transmitting block %u <d=%lu p=%lu f=%02x>",
+  char fallbackbuf[3];
+  log_debug(conn, "transmitting block %u <d=%lu p=%lu f=%s>",
             hdr.seqno(), (unsigned long)hdr.dlen(), (unsigned long)hdr.plen(),
-            (uint8_t)hdr.opcode());
+            opname(hdr.opcode(), fallbackbuf));
 
   if (conn->send(block)) {
     evbuffer_free(block);
@@ -1016,16 +1032,10 @@ chop_circuit_t::process_queue()
       pending_error = true;
       break;
 
-    case op_RK1:
-    case op_RK2:
-    case op_RK3:
-      log_warn(this, "rekeying not yet implemented");
-      pending_error = true;
-      break;
-
     default:
-      log_warn(this, "protocol error: unknown block opcode %x",
-               (unsigned int)blk.op);
+      char fallbackbuf[4];
+      log_warn(this, "protocol error: unsupported block opcode %s",
+               opname(blk.op, fallbackbuf));
       pending_error = true;
       break;
     }
@@ -1260,9 +1270,14 @@ chop_conn_t::recv()
     block_header hdr(recv_pending, *upstream->recv_hdr_crypt);
     if (!hdr.valid(upstream->recv_queue.window())) {
       const uint8_t *c = hdr.cleartext();
-      log_info(this, "invalid block header: %02x%02x%02x%02x|%02x%02x|%02x%02x|%02x|%02x%02x%02x%02x%02x%02x%02x",
-               c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7],
-               c[8], c[9], c[10], c[11], c[12], c[13], c[14], c[15]);
+      char fallbackbuf[4];
+      log_info(this, "invalid block header: "
+               "%lu|%lu|%lu|%s|%02x%02x%02x%02x%02x%02x%02x",
+               (unsigned long)hdr.seqno(),
+               (unsigned long)hdr.dlen(),
+               (unsigned long)hdr.plen(),
+               opname(hdr.opcode(), fallbackbuf),
+               c[9], c[10], c[11], c[12], c[13], c[14], c[15]);
       return -1;
     }
     if (avail < hdr.total_len()) {
@@ -1285,9 +1300,10 @@ chop_conn_t::recv()
       return -1;
     }
 
-    log_debug(this, "receiving block %u <d=%lu p=%lu f=%02x>",
+    char fallbackbuf[4];
+    log_debug(this, "receiving block %u <d=%lu p=%lu f=%s>",
               hdr.seqno(), (unsigned long)hdr.dlen(), (unsigned long)hdr.plen(),
-              (unsigned int)hdr.opcode());
+              opname(hdr.opcode(), fallbackbuf));
 
     evbuffer *data = evbuffer_new();
     if (!data || (hdr.dlen() && evbuffer_add(data, decodebuf, hdr.dlen()))) {





More information about the tor-commits mailing list