projects
/
tinc
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix pointer arithmetic when creating and verifying message authentication codes.
[tinc]
/
src
/
protocol.c
diff --git
a/src/protocol.c
b/src/protocol.c
index
0fbf2a9
..
24ba88b
100644
(file)
--- a/
src/protocol.c
+++ b/
src/protocol.c
@@
-34,7
+34,7
@@
bool tunnelserver = false;
/* Jumptable for the request handlers */
/* Jumptable for the request handlers */
-static bool (*request_handlers[])(connection_t *) = {
+static bool (*request_handlers[])(connection_t *
, char *
) = {
id_h, metakey_h, challenge_h, chal_reply_h, ack_h,
status_h, error_h, termreq_h,
ping_h, pong_h,
id_h, metakey_h, challenge_h, chal_reply_h, ack_h,
status_h, error_h, termreq_h,
ping_h, pong_h,
@@
-53,7
+53,7
@@
static char (*request_name[]) = {
"ADD_EDGE", "DEL_EDGE", "KEY_CHANGED", "REQ_KEY", "ANS_KEY", "PACKET",
};
"ADD_EDGE", "DEL_EDGE", "KEY_CHANGED", "REQ_KEY", "ANS_KEY", "PACKET",
};
-static
avl
_tree_t *past_request_tree;
+static
splay
_tree_t *past_request_tree;
bool check_id(const char *id) {
for(; *id; id++)
bool check_id(const char *id) {
for(; *id; id++)
@@
-68,8
+68,8
@@
bool check_id(const char *id) {
bool send_request(connection_t *c, const char *format, ...) {
va_list args;
bool send_request(connection_t *c, const char *format, ...) {
va_list args;
- char
buffer
[MAXBUFSIZE];
- int len
, request
;
+ char
request
[MAXBUFSIZE];
+ int len;
cp();
cp();
@@
-78,7
+78,7
@@
bool send_request(connection_t *c, const char *format, ...) {
input buffer anyway */
va_start(args, format);
input buffer anyway */
va_start(args, format);
- len = vsnprintf(
buffer
, MAXBUFSIZE, format, args);
+ len = vsnprintf(
request
, MAXBUFSIZE, format, args);
va_end(args);
if(len < 0 || len > MAXBUFSIZE - 1) {
va_end(args);
if(len < 0 || len > MAXBUFSIZE - 1) {
@@
-88,55
+88,50
@@
bool send_request(connection_t *c, const char *format, ...) {
}
ifdebug(PROTOCOL) {
}
ifdebug(PROTOCOL) {
- sscanf(buffer, "%d", &request);
ifdebug(META)
logger(LOG_DEBUG, _("Sending %s to %s (%s): %s"),
ifdebug(META)
logger(LOG_DEBUG, _("Sending %s to %s (%s): %s"),
- request_name[
request], c->name, c->hostname, buffer
);
+ request_name[
atoi(request)], c->name, c->hostname, request
);
else
else
- logger(LOG_DEBUG, _("Sending %s to %s (%s)"), request_name[
request
],
+ logger(LOG_DEBUG, _("Sending %s to %s (%s)"), request_name[
atoi(request)
],
c->name, c->hostname);
}
c->name, c->hostname);
}
-
buffer
[len++] = '\n';
+
request
[len++] = '\n';
if(c == broadcast) {
if(c == broadcast) {
- broadcast_meta(NULL,
buffer
, len);
+ broadcast_meta(NULL,
request
, len);
return true;
} else
return true;
} else
- return send_meta(c,
buffer
, len);
+ return send_meta(c,
request
, len);
}
}
-void forward_request(connection_t *from) {
- int request;
-
+void forward_request(connection_t *from, char *request) {
cp();
ifdebug(PROTOCOL) {
cp();
ifdebug(PROTOCOL) {
- sscanf(from->buffer, "%d", &request);
ifdebug(META)
logger(LOG_DEBUG, _("Forwarding %s from %s (%s): %s"),
ifdebug(META)
logger(LOG_DEBUG, _("Forwarding %s from %s (%s): %s"),
- request_name[request], from->name, from->hostname,
- from->buffer);
+ request_name[atoi(request)], from->name, from->hostname, request);
else
logger(LOG_DEBUG, _("Forwarding %s from %s (%s)"),
else
logger(LOG_DEBUG, _("Forwarding %s from %s (%s)"),
- request_name[
request
], from->name, from->hostname);
+ request_name[
atoi(request)
], from->name, from->hostname);
}
}
-
from->buffer[from->reqlen - 1] = '\n'
;
-
- broadcast_meta(from,
from->buffer, from->req
len);
+
int len = strlen(request)
;
+ request[len] = '\n';
+ broadcast_meta(from,
request,
len);
}
}
-bool receive_request(connection_t *c) {
- int req
uest
;
+bool receive_request(connection_t *c
, char *request
) {
+ int req
no = atoi(request)
;
cp();
cp();
- if(
sscanf(c->buffer, "%d", &request) == 1
) {
- if((req
uest < 0) || (request >= LAST) || !request_handlers[request
]) {
+ if(
reqno || *request == '0'
) {
+ if((req
no < 0) || (reqno >= LAST) || !request_handlers[reqno
]) {
ifdebug(META)
logger(LOG_DEBUG, _("Unknown request from %s (%s): %s"),
ifdebug(META)
logger(LOG_DEBUG, _("Unknown request from %s (%s): %s"),
- c->name, c->hostname,
c->buffer
);
+ c->name, c->hostname,
request
);
else
logger(LOG_ERR, _("Unknown request from %s (%s)"),
c->name, c->hostname);
else
logger(LOG_ERR, _("Unknown request from %s (%s)"),
c->name, c->hostname);
@@
-146,25
+141,24
@@
bool receive_request(connection_t *c) {
ifdebug(PROTOCOL) {
ifdebug(META)
logger(LOG_DEBUG, _("Got %s from %s (%s): %s"),
ifdebug(PROTOCOL) {
ifdebug(META)
logger(LOG_DEBUG, _("Got %s from %s (%s): %s"),
- request_name[request], c->name, c->hostname,
- c->buffer);
+ request_name[reqno], c->name, c->hostname, request);
else
logger(LOG_DEBUG, _("Got %s from %s (%s)"),
else
logger(LOG_DEBUG, _("Got %s from %s (%s)"),
- request_name[req
uest
], c->name, c->hostname);
+ request_name[req
no
], c->name, c->hostname);
}
}
}
}
- if((c->allow_request != ALL) && (c->allow_request != req
uest
)) {
+ if((c->allow_request != ALL) && (c->allow_request != req
no
)) {
logger(LOG_ERR, _("Unauthorized request from %s (%s)"), c->name,
c->hostname);
return false;
}
logger(LOG_ERR, _("Unauthorized request from %s (%s)"), c->name,
c->hostname);
return false;
}
- if(!request_handlers[req
uest](c
)) {
+ if(!request_handlers[req
no](c, request
)) {
/* Something went wrong. Probably scriptkiddies. Terminate. */
logger(LOG_ERR, _("Error while processing %s from %s (%s)"),
/* Something went wrong. Probably scriptkiddies. Terminate. */
logger(LOG_ERR, _("Error while processing %s from %s (%s)"),
- request_name[req
uest
], c->name, c->hostname);
+ request_name[req
no
], c->name, c->hostname);
return false;
}
} else {
return false;
}
} else {
@@
-198,21
+192,21
@@
bool seen_request(char *request) {
p.request = request;
p.request = request;
- if(
avl
_search(past_request_tree, &p)) {
+ if(
splay
_search(past_request_tree, &p)) {
ifdebug(SCARY_THINGS) logger(LOG_DEBUG, _("Already seen request"));
return true;
} else {
ifdebug(SCARY_THINGS) logger(LOG_DEBUG, _("Already seen request"));
return true;
} else {
- new = xmalloc(sizeof
(*new)
);
+ new = xmalloc(sizeof
*new
);
new->request = xstrdup(request);
new->firstseen = time(NULL);
new->request = xstrdup(request);
new->firstseen = time(NULL);
-
avl
_insert(past_request_tree, new);
+
splay
_insert(past_request_tree, new);
event_add(&past_request_event, &(struct timeval){10, 0});
return false;
}
}
void age_past_requests(int fd, short events, void *data) {
event_add(&past_request_event, &(struct timeval){10, 0});
return false;
}
}
void age_past_requests(int fd, short events, void *data) {
-
avl
_node_t *node, *next;
+
splay
_node_t *node, *next;
past_request_t *p;
int left = 0, deleted = 0;
time_t now = time(NULL);
past_request_t *p;
int left = 0, deleted = 0;
time_t now = time(NULL);
@@
-224,7
+218,7
@@
void age_past_requests(int fd, short events, void *data) {
p = node->data;
if(p->firstseen + pinginterval < now)
p = node->data;
if(p->firstseen + pinginterval < now)
-
avl
_delete_node(past_request_tree, node), deleted++;
+
splay
_delete_node(past_request_tree, node), deleted++;
else
left++;
}
else
left++;
}
@@
-240,7
+234,7
@@
void age_past_requests(int fd, short events, void *data) {
void init_requests(void) {
cp();
void init_requests(void) {
cp();
- past_request_tree =
avl_alloc_tree((avl_compare_t) past_request_compare, (avl
_action_t) free_past_request);
+ past_request_tree =
splay_alloc_tree((splay_compare_t) past_request_compare, (splay
_action_t) free_past_request);
timeout_set(&past_request_event, age_past_requests, NULL);
}
timeout_set(&past_request_event, age_past_requests, NULL);
}
@@
-248,7
+242,7
@@
void init_requests(void) {
void exit_requests(void) {
cp();
void exit_requests(void) {
cp();
-
avl
_delete_tree(past_request_tree);
+
splay
_delete_tree(past_request_tree);
event_del(&past_request_event);
}
event_del(&past_request_event);
}