mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-13 06:33:44 +01:00
deal with hardware word alignment
this was causing the seg faults on sparc processors i wonder if i got them all. svn:r1314
This commit is contained in:
parent
2ba2f02181
commit
66f878513f
@ -483,7 +483,8 @@ int fetch_from_buf_socks(buf_t *buf, socks_request_t *req) {
|
|||||||
}
|
}
|
||||||
memcpy(req->address,buf->mem+5,len);
|
memcpy(req->address,buf->mem+5,len);
|
||||||
req->address[len] = 0;
|
req->address[len] = 0;
|
||||||
req->port = ntohs(*(uint16_t*)(buf->mem+5+len));
|
memcpy(&req->port, buf->mem+5+len, 2);
|
||||||
|
req->port = ntohs(req->port);
|
||||||
buf_remove_from_front(buf, 5+len+2);
|
buf_remove_from_front(buf, 5+len+2);
|
||||||
return 1;
|
return 1;
|
||||||
default: /* unsupported */
|
default: /* unsupported */
|
||||||
|
@ -1116,8 +1116,13 @@ int circuit_extend(cell_t *cell, circuit_t *circ) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
circ->n_addr = ntohl(*(uint32_t*)(cell->payload+RELAY_HEADER_SIZE));
|
memcpy(&circ->n_addr, cell->payload+RELAY_HEADER_SIZE, 4);
|
||||||
circ->n_port = ntohs(*(uint16_t*)(cell->payload+RELAY_HEADER_SIZE+4));
|
circ->n_addr = ntohl(circ->n_addr);
|
||||||
|
memcpy(&circ->n_port, cell->payload+RELAY_HEADER_SIZE+4, 2);
|
||||||
|
circ->n_port = ntohs(circ->n_port);
|
||||||
|
|
||||||
|
// circ->n_addr = ntohl(*(uint32_t*)(cell->payload+RELAY_HEADER_SIZE));
|
||||||
|
// circ->n_port = ntohs(*(uint16_t*)(cell->payload+RELAY_HEADER_SIZE+4));
|
||||||
|
|
||||||
n_conn = connection_twin_get_by_addr_port(circ->n_addr,circ->n_port);
|
n_conn = connection_twin_get_by_addr_port(circ->n_addr,circ->n_port);
|
||||||
if(!n_conn || n_conn->type != CONN_TYPE_OR) {
|
if(!n_conn || n_conn->type != CONN_TYPE_OR) {
|
||||||
|
@ -22,19 +22,56 @@ static uint32_t client_dns_lookup_entry(const char *address);
|
|||||||
static void client_dns_set_entry(const char *address, uint32_t val);
|
static void client_dns_set_entry(const char *address, uint32_t val);
|
||||||
|
|
||||||
void relay_header_pack(char *dest, const relay_header_t *src) {
|
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;
|
*(uint8_t*)(dest) = src->command;
|
||||||
*(uint16_t*)(dest+1) = htons(src->recognized);
|
*(uint16_t*)(dest+1) = htons(src->recognized);
|
||||||
*(uint16_t*)(dest+3) = htons(src->stream_id);
|
*(uint16_t*)(dest+3) = htons(src->stream_id);
|
||||||
memcpy(dest+5, src->integrity, 4);
|
memcpy(dest+5, src->integrity, 4);
|
||||||
*(uint16_t*)(dest+9) = htons(src->length);
|
*(uint16_t*)(dest+9) = htons(src->length);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void relay_header_unpack(relay_header_t *dest, const char *src) {
|
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->command = *(uint8_t*)(src);
|
||||||
dest->recognized = ntohs(*(uint16_t*)(src+1));
|
dest->recognized = ntohs(*(uint16_t*)(src+1));
|
||||||
dest->stream_id = ntohs(*(uint16_t*)(src+3));
|
dest->stream_id = ntohs(*(uint16_t*)(src+3));
|
||||||
memcpy(dest->integrity, src+5, 4);
|
memcpy(dest->integrity, src+5, 4);
|
||||||
dest->length = ntohs(*(uint16_t*)(src+9));
|
dest->length = ntohs(*(uint16_t*)(src+9));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int connection_edge_process_inbuf(connection_t *conn) {
|
int connection_edge_process_inbuf(connection_t *conn) {
|
||||||
@ -138,7 +175,9 @@ int connection_edge_end(connection_t *conn, char reason, crypt_path_t *cpath_lay
|
|||||||
|
|
||||||
payload[0] = reason;
|
payload[0] = reason;
|
||||||
if(reason == END_STREAM_REASON_EXITPOLICY) {
|
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;
|
payload_len += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -236,7 +275,9 @@ int connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ, connection
|
|||||||
// log_fn(LOG_INFO,"Connected! Notifying application.");
|
// log_fn(LOG_INFO,"Connected! Notifying application.");
|
||||||
conn->state = AP_CONN_STATE_OPEN;
|
conn->state = AP_CONN_STATE_OPEN;
|
||||||
if (rh.length >= 4) {
|
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);
|
client_dns_set_entry(conn->socks_request->address, addr);
|
||||||
}
|
}
|
||||||
log_fn(LOG_INFO,"'connected' received after %d seconds.",
|
log_fn(LOG_INFO,"'connected' received after %d seconds.",
|
||||||
@ -311,7 +352,9 @@ int connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ, connection
|
|||||||
* we try a new exit node.
|
* we try a new exit node.
|
||||||
* cell->payload+RELAY_HEADER_SIZE+1 holds the destination addr.
|
* 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);
|
client_dns_set_entry(conn->socks_request->address, addr);
|
||||||
conn->state = AP_CONN_STATE_CIRCUIT_WAIT;
|
conn->state = AP_CONN_STATE_CIRCUIT_WAIT;
|
||||||
if(connection_ap_handshake_attach_circuit(conn) >= 0)
|
if(connection_ap_handshake_attach_circuit(conn) >= 0)
|
||||||
@ -936,7 +979,7 @@ void connection_exit_connect(connection_t *conn) {
|
|||||||
connection_watch_events(conn, POLLIN);
|
connection_watch_events(conn, POLLIN);
|
||||||
|
|
||||||
/* also, deliver a 'connected' cell back through the circuit. */
|
/* 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,
|
connection_edge_send_command(conn, circuit_get_by_conn(conn), RELAY_COMMAND_CONNECTED,
|
||||||
connected_payload, 4, NULL);
|
connected_payload, 4, NULL);
|
||||||
}
|
}
|
||||||
|
@ -48,6 +48,7 @@ static void tag_unpack(char *tag, uint32_t *addr, uint16_t *port, uint16_t *circ
|
|||||||
}
|
}
|
||||||
|
|
||||||
int connection_cpu_process_inbuf(connection_t *conn) {
|
int connection_cpu_process_inbuf(connection_t *conn) {
|
||||||
|
char success;
|
||||||
unsigned char buf[LEN_ONION_RESPONSE];
|
unsigned char buf[LEN_ONION_RESPONSE];
|
||||||
uint32_t addr;
|
uint32_t addr;
|
||||||
uint16_t port;
|
uint16_t port;
|
||||||
@ -77,10 +78,11 @@ int connection_cpu_process_inbuf(connection_t *conn) {
|
|||||||
return 0; /* not yet */
|
return 0; /* not yet */
|
||||||
assert(buf_datalen(conn->inbuf) == LEN_ONION_RESPONSE);
|
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 */
|
/* 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;
|
circ = NULL;
|
||||||
p_conn = connection_exact_get_by_addr_port(addr,port);
|
p_conn = connection_exact_get_by_addr_port(addr,port);
|
||||||
if(p_conn)
|
if(p_conn)
|
||||||
@ -91,12 +93,12 @@ int connection_cpu_process_inbuf(connection_t *conn) {
|
|||||||
goto done_processing;
|
goto done_processing;
|
||||||
}
|
}
|
||||||
assert(circ->p_conn);
|
assert(circ->p_conn);
|
||||||
if(*buf == 0) {
|
if(success == 0) {
|
||||||
log_fn(LOG_WARN,"decoding onionskin failed. Closing.");
|
log_fn(LOG_WARN,"decoding onionskin failed. Closing.");
|
||||||
circuit_mark_for_close(circ);
|
circuit_mark_for_close(circ);
|
||||||
goto done_processing;
|
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.");
|
log_fn(LOG_WARN,"onionskin_answer failed. Closing.");
|
||||||
circuit_mark_for_close(circ);
|
circuit_mark_for_close(circ);
|
||||||
goto done_processing;
|
goto done_processing;
|
||||||
|
12
src/or/dns.c
12
src/or/dns.c
@ -363,7 +363,7 @@ int connection_dns_finished_flushing(connection_t *conn) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int connection_dns_process_inbuf(connection_t *conn) {
|
int connection_dns_process_inbuf(connection_t *conn) {
|
||||||
char answer[5];
|
char success;
|
||||||
uint32_t addr;
|
uint32_t addr;
|
||||||
|
|
||||||
assert(conn && conn->type == CONN_TYPE_DNSWORKER);
|
assert(conn && conn->type == CONN_TYPE_DNSWORKER);
|
||||||
@ -384,15 +384,15 @@ int connection_dns_process_inbuf(connection_t *conn) {
|
|||||||
return 0; /* not yet */
|
return 0; /* not yet */
|
||||||
assert(buf_datalen(conn->inbuf) == 5);
|
assert(buf_datalen(conn->inbuf) == 5);
|
||||||
|
|
||||||
connection_fetch_from_buf(answer,sizeof(answer),conn);
|
connection_fetch_from_buf(&success,1,conn);
|
||||||
addr = *(uint32_t*)(answer+1);
|
connection_fetch_from_buf((char *)&addr,sizeof(uint32_t),conn);
|
||||||
|
|
||||||
log_fn(LOG_DEBUG, "DNSWorker (fd %d) returned answer for '%s'",
|
log_fn(LOG_DEBUG, "DNSWorker (fd %d) returned answer for '%s'",
|
||||||
conn->s, conn->address);
|
conn->s, conn->address);
|
||||||
|
|
||||||
assert(answer[0] >= DNS_RESOLVE_FAILED_TRANSIENT);
|
assert(success >= DNS_RESOLVE_FAILED_TRANSIENT);
|
||||||
assert(answer[0] <= DNS_RESOLVE_SUCCEEDED);
|
assert(success <= DNS_RESOLVE_SUCCEEDED);
|
||||||
dns_found_answer(conn->address, addr, answer[0]);
|
dns_found_answer(conn->address, addr, success);
|
||||||
|
|
||||||
tor_free(conn->address);
|
tor_free(conn->address);
|
||||||
conn->address = tor_strdup("<idle>");
|
conn->address = tor_strdup("<idle>");
|
||||||
|
Loading…
Reference in New Issue
Block a user