From cbfca49ac69e701566d507e6ee77a7a77929f054 Mon Sep 17 00:00:00 2001 From: ston1th Date: Tue, 10 Jan 2017 22:44:06 +0100 Subject: [PATCH] some improvements --- ddns.c | 42 +++++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/ddns.c b/ddns.c index 44e0176..c6107cc 100644 --- a/ddns.c +++ b/ddns.c @@ -7,6 +7,8 @@ #include #define SEP '=' +#define MAX_QUERY_LEN 255 +#define MAX_QUERY_ARGS 2 #define IP_LEN 16 #define IP_FILE "ip.txt" #define TOKEN "" @@ -23,9 +25,11 @@ char **parse(const char *str) { const char *s = str; char *qs, *token; char **arr = NULL; - int c = 1; + int c = 1, argc = 0; qs = strdup(s); while((token = strsep(&qs, "&")) != NULL) { + if(++argc > MAX_QUERY_ARGS) + break; c++; if(arr == NULL) { arr = malloc(c*sizeof(char *)); @@ -58,9 +62,10 @@ int ctb(unsigned char a, unsigned char b) { } int ctc(const char *a, const char *b) { - if(strlen(a) != strlen(b)) { + if(!a || !b) + return(0); + if(strlen(a) != strlen(b)) return(0); - } const char *x = a, *y = b; char v = 0; while(*x) @@ -69,7 +74,7 @@ int ctc(const char *a, const char *b) { } int set_ip(char *env, int fd) { - char *ip, *token, *tmp; + char *ip = NULL, *token = NULL, *tmp = NULL; int ret = -1, len = 0; char **arg = parse(env); char **arr = arg; @@ -91,35 +96,46 @@ int set_ip(char *env, int fd) { tmp = NULL; free_arr(arg); if(ctc(token, TOKEN) == 1) { - len = strlen(ip); - if(len >= IP_LEN-1) - len = IP_LEN-1; - write(fd, ip, len); + if(ip) { + len = strlen(ip); + if(len >= IP_LEN-1) + len = IP_LEN-1; + write(fd, ip, len); + } close(fd); } else ret = 1; - free(token); - free(ip); + if(ip) + free(ip); + if(token) + free(token); return(ret); } char *err_msg[2] = {"wrong input", "wrong token"}; int main(void) { - char *env; + char *env = NULL; char ip[IP_LEN]; int errn = 0, len = 0; - int rfd = open(IP_FILE, O_RDONLY|O_SHLOCK); + int rfd, wfd; + if((rfd = open(IP_FILE, O_RDONLY|O_SHLOCK)) == -1) + err(EXIT_FAILURE, "read open failed"); if(read(rfd, &ip, IP_LEN) <= 0) ip[0] = '\0'; close(rfd); ip[IP_LEN] = '\0'; - int wfd = open(IP_FILE, O_WRONLY|O_CREAT|O_TRUNC|O_EXLOCK); + if((wfd = open(IP_FILE, O_WRONLY|O_CREAT|O_TRUNC|O_EXLOCK)) == -1) + err(EXIT_FAILURE, "rw open failed"); if(pledge("stdio", NULL) == -1) err(EXIT_FAILURE, "pledge"); env = getenv("QUERY_STRING"); header(); if(env != NULL) { + if(strlen(env) > MAX_QUERY_LEN) { + puts("query longer than 255 bytes"); + return(EXIT_SUCCESS); + } if((errn = set_ip(env, wfd)) >= 0) puts(err_msg[errn]); else