projects
/
tinc
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'master' into 1.1
[tinc]
/
src
/
protocol.c
diff --git
a/src/protocol.c
b/src/protocol.c
index
c3fe6f3
..
50f6fe7
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,
@@
-68,17
+68,17
@@
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();
- /* Use vsnprintf instead of vasprintf: faster, no memory
+ /* Use vsnprintf instead of v
x
asprintf: faster, no memory
fragmentation, cleanup is automatic, and there is a limit on the
input buffer anyway */
va_start(args, format);
fragmentation, cleanup is automatic, and there is a limit on the
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 {
@@
-202,7
+196,7
@@
bool seen_request(char *request) {
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);
splay_insert(past_request_tree, new);
new->request = xstrdup(request);
new->firstseen = time(NULL);
splay_insert(past_request_tree, new);