Add some sanity checks and some logging to http code.
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@3200 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -141,6 +141,19 @@ process_request(unsigned char *buf,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
addr_to_string(struct sockaddr *addr, size_t addr_len, char *str, size_t len)
|
||||||
|
{
|
||||||
|
switch(addr->sa_family){
|
||||||
|
case AF_INET:
|
||||||
|
strncpy(str, inet_ntoa(((struct sockaddr_in*)addr)->sin_addr), len);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
snprintf(str, len, "<%d addr>", addr->sa_family);
|
||||||
|
}
|
||||||
|
str[len - 1] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
do_request(void *buf, size_t len,
|
do_request(void *buf, size_t len,
|
||||||
int socket, struct sockaddr *from, size_t from_len)
|
int socket, struct sockaddr *from, size_t from_len)
|
||||||
@@ -148,9 +161,8 @@ do_request(void *buf, size_t len,
|
|||||||
krb5_error_code ret;
|
krb5_error_code ret;
|
||||||
krb5_data reply;
|
krb5_data reply;
|
||||||
|
|
||||||
char addr[128] = "<unknown address>";
|
char addr[128];
|
||||||
if(from->sa_family == AF_INET)
|
addr_to_string(from, from_len, addr, sizeof(addr));
|
||||||
strcpy(addr, inet_ntoa(((struct sockaddr_in*)from)->sin_addr));
|
|
||||||
|
|
||||||
reply.length = 0;
|
reply.length = 0;
|
||||||
ret = process_request(buf, len, &reply, addr, from);
|
ret = process_request(buf, len, &reply, addr, from);
|
||||||
@@ -204,6 +216,7 @@ static void
|
|||||||
handle_tcp(struct descr *d, int index, int min_free)
|
handle_tcp(struct descr *d, int index, int min_free)
|
||||||
{
|
{
|
||||||
unsigned char buf[1024];
|
unsigned char buf[1024];
|
||||||
|
char addr[32];
|
||||||
struct sockaddr_in from;
|
struct sockaddr_in from;
|
||||||
int from_len = sizeof(from);
|
int from_len = sizeof(from);
|
||||||
size_t n;
|
size_t n;
|
||||||
@@ -237,6 +250,7 @@ handle_tcp(struct descr *d, int index, int min_free)
|
|||||||
from_len = sizeof(from);
|
from_len = sizeof(from);
|
||||||
getpeername(d[index].s, (struct sockaddr*)&from, &from_len);
|
getpeername(d[index].s, (struct sockaddr*)&from, &from_len);
|
||||||
}
|
}
|
||||||
|
addr_to_string((struct sockaddr*)&from, from_len, addr, sizeof(addr));
|
||||||
if(d[index].size - d[index].len < n){
|
if(d[index].size - d[index].len < n){
|
||||||
unsigned char *tmp;
|
unsigned char *tmp;
|
||||||
d[index].size += 1024;
|
d[index].size += 1024;
|
||||||
@@ -276,11 +290,12 @@ handle_tcp(struct descr *d, int index, int min_free)
|
|||||||
p = strstr(s, "\r\n");
|
p = strstr(s, "\r\n");
|
||||||
*p = 0;
|
*p = 0;
|
||||||
p = NULL;
|
p = NULL;
|
||||||
kdc_log(5, "HTTP request");
|
|
||||||
strtok_r(s, " \t", &p);
|
strtok_r(s, " \t", &p);
|
||||||
t = strtok_r(NULL, " \t", &p);
|
t = strtok_r(NULL, " \t", &p);
|
||||||
if(t == NULL){
|
if(t == NULL){
|
||||||
|
kdc_log(0, "Malformed HTTP request from %s", addr);
|
||||||
|
clear_descr(d + index);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
data = malloc(strlen(t));
|
data = malloc(strlen(t));
|
||||||
len = base64_decode(t, data);
|
len = base64_decode(t, data);
|
||||||
@@ -297,6 +312,7 @@ handle_tcp(struct descr *d, int index, int min_free)
|
|||||||
write(d[index].s, msg, strlen(msg));
|
write(d[index].s, msg, strlen(msg));
|
||||||
free(data);
|
free(data);
|
||||||
clear_descr(d + index);
|
clear_descr(d + index);
|
||||||
|
kdc_log(0, "HTTP request from %s is non KDC request", addr);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user