[or-cvs] fix endian issue: rh.integrity was getting sent wrong

Roger Dingledine arma at seul.org
Fri Jan 2 09:03:42 UTC 2004


Update of /home/or/cvsroot/src/or
In directory moria.mit.edu:/home2/arma/work/onion/cvs/src/or

Modified Files:
	circuit.c connection_edge.c or.h 
Log Message:
fix endian issue: rh.integrity was getting sent wrong
now it's a char[4] rather than an int


Index: circuit.c
===================================================================
RCS file: /home/or/cvsroot/src/or/circuit.c,v
retrieving revision 1.130
retrieving revision 1.131
diff -u -d -r1.130 -r1.131
--- circuit.c	30 Dec 2003 22:49:35 -0000	1.130
+++ circuit.c	2 Jan 2004 09:03:38 -0000	1.131
@@ -314,14 +314,15 @@
 
 /* update digest from the payload of cell. assign integrity part to cell. */
 static void relay_set_digest(crypto_digest_env_t *digest, cell_t *cell) {
-  uint32_t integrity;
+  char integrity[4];
   relay_header_t rh;
 
   crypto_digest_add_bytes(digest, cell->payload, CELL_PAYLOAD_SIZE);
-  crypto_digest_get_digest(digest, (char *)&integrity, 4);
-  log_fn(LOG_DEBUG,"Putting digest of %u into relay cell.",integrity);
+  crypto_digest_get_digest(digest, integrity, 4);
+  log_fn(LOG_DEBUG,"Putting digest of %u %u %u %u into relay cell.",
+    integrity[0], integrity[1], integrity[2], integrity[3]);
   relay_header_unpack(&rh, cell->payload);
-  rh.integrity = integrity;
+  memcpy(rh.integrity, integrity, 4);
   relay_header_pack(cell->payload, &rh);
 }
 
@@ -330,29 +331,31 @@
  * and cell to their original state and return 0.
  */
 static int relay_digest_matches(crypto_digest_env_t *digest, cell_t *cell) {
-  uint32_t received_integrity, calculated_integrity;
+  char received_integrity[4], calculated_integrity[4];
   relay_header_t rh;
   crypto_digest_env_t *backup_digest=NULL;
 
   backup_digest = crypto_digest_dup(digest);
 
   relay_header_unpack(&rh, cell->payload);
-  received_integrity = rh.integrity;
-  rh.integrity = 0;
+  memcpy(received_integrity, rh.integrity, 4);
+  memset(rh.integrity, 0, 4);
   relay_header_pack(cell->payload, &rh);
 
-  log_fn(LOG_DEBUG,"Reading digest of %u from relay cell.",received_integrity);
+  log_fn(LOG_DEBUG,"Reading digest of %u %u %u %u from relay cell.",
+    received_integrity[0], received_integrity[1],
+    received_integrity[2], received_integrity[3]);
 
   crypto_digest_add_bytes(digest, cell->payload, CELL_PAYLOAD_SIZE);
-  crypto_digest_get_digest(digest, (char *)&calculated_integrity, 4);
+  crypto_digest_get_digest(digest, calculated_integrity, 4);
 
-  if(received_integrity != calculated_integrity) {
-    log_fn(LOG_INFO,"Recognized=0 but bad digest. Not recognizing. (%d vs %d).",
-           received_integrity, calculated_integrity);
+  if(memcmp(received_integrity, calculated_integrity, 4)) {
+    log_fn(LOG_INFO,"Recognized=0 but bad digest. Not recognizing.");
+// (%d vs %d).", received_integrity, calculated_integrity);
     /* restore digest to its old form */
     crypto_digest_assign(digest, backup_digest);
     /* restore the relay header */
-    rh.integrity = received_integrity;
+    memcpy(rh.integrity, received_integrity, 4);
     relay_header_pack(cell->payload, &rh);
     crypto_free_digest_env(backup_digest);
     return 0;

Index: connection_edge.c
===================================================================
RCS file: /home/or/cvsroot/src/or/connection_edge.c,v
retrieving revision 1.84
retrieving revision 1.85
diff -u -d -r1.84 -r1.85
--- connection_edge.c	1 Jan 2004 07:01:09 -0000	1.84
+++ connection_edge.c	2 Jan 2004 09:03:38 -0000	1.85
@@ -24,7 +24,7 @@
   *(uint8_t*)(dest)    = src->command;
   *(uint16_t*)(dest+1) = htons(src->recognized);
   *(uint16_t*)(dest+3) = htons(src->stream_id);
-  *(uint32_t*)(dest+5) = htonl(src->integrity);
+  memcpy(dest+5, src->integrity, 4);
   *(uint16_t*)(dest+9) = htons(src->length);
 }
 
@@ -32,7 +32,7 @@
   dest->command    = *(uint8_t*)(src);
   dest->recognized = ntohs(*(uint16_t*)(src+1));
   dest->stream_id  = ntohs(*(uint16_t*)(src+3));
-  dest->integrity  = ntohl(*(uint32_t*)(src+5));
+  memcpy(dest->integrity, src+5, 4);
   dest->length     = ntohs(*(uint16_t*)(src+9));
 }
 

Index: or.h
===================================================================
RCS file: /home/or/cvsroot/src/or/or.h,v
retrieving revision 1.215
retrieving revision 1.216
diff -u -d -r1.215 -r1.216
--- or.h	23 Dec 2003 07:45:31 -0000	1.215
+++ or.h	2 Jan 2004 09:03:38 -0000	1.216
@@ -283,7 +283,7 @@
   uint8_t command;
   uint16_t recognized;
   uint16_t stream_id;
-  uint32_t integrity;
+  char integrity[4];
   uint16_t length;
 } relay_header_t;
 



More information about the tor-commits mailing list