static void client_dns_set_entry(const char *address, uint32_t val);
void relay_header_pack(char *dest, const relay_header_t *src) {
+ uint16_t tmp;
+
+ /* we have to do slow memcpy's here, because we screwed up
+ * and made our cell payload not word-aligned. we should fix
+ * this someday.
+ */
+
+ *(uint8_t*)(dest) = src->command;
+
+ tmp = htons(src->recognized);
+ memcpy(dest+1, &tmp, 2);
+
+ tmp = htons(src->stream_id);
+ memcpy(dest+3, &tmp, 2);
+
+ memcpy(dest+5, src->integrity, 4);
+
+ tmp = htons(src->length);
+ memcpy(dest+9, &tmp, 2);
+
+#if 0
*(uint8_t*)(dest) = src->command;
*(uint16_t*)(dest+1) = htons(src->recognized);
*(uint16_t*)(dest+3) = htons(src->stream_id);
memcpy(dest+5, src->integrity, 4);
*(uint16_t*)(dest+9) = htons(src->length);
+#endif
}
void relay_header_unpack(relay_header_t *dest, const char *src) {
+ dest->command = *(uint8_t*)(src);
+
+ memcpy(&dest->recognized, src+1, 2);
+ dest->recognized = ntohs(dest->recognized);
+
+ memcpy(&dest->stream_id, src+3, 2);
+ dest->stream_id = ntohs(dest->stream_id);
+
+ memcpy(dest->integrity, src+5, 4);
+
+ memcpy(&dest->length, src+9, 2);
+ dest->length = ntohs(dest->length);
+
+#if 0
dest->command = *(uint8_t*)(src);
dest->recognized = ntohs(*(uint16_t*)(src+1));
dest->stream_id = ntohs(*(uint16_t*)(src+3));
memcpy(dest->integrity, src+5, 4);
dest->length = ntohs(*(uint16_t*)(src+9));
+#endif
}
int connection_edge_process_inbuf(connection_t *conn) {
payload[0] = reason;
if(reason == END_STREAM_REASON_EXITPOLICY) {
- *(uint32_t *)(payload+1) = htonl(conn->addr);
+ uint32_t tmp = htonl(conn->addr);
+ memcpy(payload+1, &tmp, 4);
+// *(uint32_t *)(payload+1) = htonl(conn->addr);
payload_len += 4;
}
// log_fn(LOG_INFO,"Connected! Notifying application.");
conn->state = AP_CONN_STATE_OPEN;
if (rh.length >= 4) {
- addr = ntohl(*(uint32_t*)(cell->payload + RELAY_HEADER_SIZE));
+ memcpy(&addr, cell->payload + RELAY_HEADER_SIZE, 4);
+ addr = ntohl(addr);
+// addr = ntohl(*(uint32_t*)(cell->payload + RELAY_HEADER_SIZE));
client_dns_set_entry(conn->socks_request->address, addr);
}
log_fn(LOG_INFO,"'connected' received after %d seconds.",
* we try a new exit node.
* cell->payload+RELAY_HEADER_SIZE+1 holds the destination addr.
*/
- addr = ntohl(*(uint32_t*)(cell->payload+RELAY_HEADER_SIZE+1));
+ memcpy(&addr, cell->payload+RELAY_HEADER_SIZE+1, 4);
+ addr = ntohl(addr);
+// addr = ntohl(*(uint32_t*)(cell->payload+RELAY_HEADER_SIZE+1));
client_dns_set_entry(conn->socks_request->address, addr);
conn->state = AP_CONN_STATE_CIRCUIT_WAIT;
if(connection_ap_handshake_attach_circuit(conn) >= 0)
connection_watch_events(conn, POLLIN);
/* also, deliver a 'connected' cell back through the circuit. */
- *((uint32_t*) connected_payload) = htonl(conn->addr);
+ *(uint32_t*)connected_payload = htonl(conn->addr);
connection_edge_send_command(conn, circuit_get_by_conn(conn), RELAY_COMMAND_CONNECTED,
connected_payload, 4, NULL);
}
}
int connection_cpu_process_inbuf(connection_t *conn) {
+ char success;
unsigned char buf[LEN_ONION_RESPONSE];
uint32_t addr;
uint16_t port;
return 0; /* not yet */
assert(buf_datalen(conn->inbuf) == LEN_ONION_RESPONSE);
- connection_fetch_from_buf(buf,LEN_ONION_RESPONSE,conn);
+ connection_fetch_from_buf(&success,1,conn);
+ connection_fetch_from_buf(buf,LEN_ONION_RESPONSE-1,conn);
/* parse out the circ it was talking about */
- tag_unpack(buf+1, &addr, &port, &circ_id);
+ tag_unpack(buf, &addr, &port, &circ_id);
circ = NULL;
p_conn = connection_exact_get_by_addr_port(addr,port);
if(p_conn)
goto done_processing;
}
assert(circ->p_conn);
- if(*buf == 0) {
+ if(success == 0) {
log_fn(LOG_WARN,"decoding onionskin failed. Closing.");
circuit_mark_for_close(circ);
goto done_processing;
}
- if(onionskin_answer(circ, buf+1+TAG_LEN, buf+1+TAG_LEN+ONIONSKIN_REPLY_LEN) < 0) {
+ 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);
goto done_processing;
}
int connection_dns_process_inbuf(connection_t *conn) {
- char answer[5];
+ char success;
uint32_t addr;
assert(conn && conn->type == CONN_TYPE_DNSWORKER);
return 0; /* not yet */
assert(buf_datalen(conn->inbuf) == 5);
- connection_fetch_from_buf(answer,sizeof(answer),conn);
- addr = *(uint32_t*)(answer+1);
+ connection_fetch_from_buf(&success,1,conn);
+ connection_fetch_from_buf((char *)&addr,sizeof(uint32_t),conn);
log_fn(LOG_DEBUG, "DNSWorker (fd %d) returned answer for '%s'",
conn->s, conn->address);
- assert(answer[0] >= DNS_RESOLVE_FAILED_TRANSIENT);
- assert(answer[0] <= DNS_RESOLVE_SUCCEEDED);
- dns_found_answer(conn->address, addr, answer[0]);
+ assert(success >= DNS_RESOLVE_FAILED_TRANSIENT);
+ assert(success <= DNS_RESOLVE_SUCCEEDED);
+ dns_found_answer(conn->address, addr, success);
tor_free(conn->address);
conn->address = tor_strdup("<idle>");