Compare commits

..

2 Commits

Author SHA1 Message Date
Vladimir Dubrovin
12c9039ea4 Fixed: crash on invalid configuration file
Some checks failed
C/C++ CI / ${{ matrix.target }} (macos-15) (push) Has been cancelled
C/C++ CI / ${{ matrix.target }} (ubuntu-24.04-arm) (push) Has been cancelled
C/C++ CI / ${{ matrix.target }} (ubuntu-latest) (push) Has been cancelled
C/C++ CI / ${{ matrix.target }} (windows-2022) (push) Has been cancelled
2026-01-28 19:40:58 +03:00
Vladimir Dubrovin
1a970c5c98 Fixed: memory corruptions on config parsing 2026-01-28 19:13:41 +03:00
2 changed files with 15 additions and 9 deletions

View File

@ -105,6 +105,10 @@ unsigned char * dologname (unsigned char *buf, unsigned char *name, const unsign
struct tm *ts; struct tm *ts;
ts = localtime(&t); ts = localtime(&t);
if(strlen((char *)name) >= 4096){
*buf = 0;
return buf;
}
if(strchr((char *)name, '%')){ if(strchr((char *)name, '%')){
struct clientparam fakecli; struct clientparam fakecli;
@ -905,7 +909,7 @@ struct ace * make_ace (int argc, unsigned char ** argv){
if(argc > 0 && strcmp("*", (char *)argv[0])) { if(argc > 0 && strcmp("*", (char *)argv[0])) {
arg = argv[0]; arg = argv[0];
arg = (unsigned char *)strtok((char *)arg, ","); arg = (unsigned char *)strtok((char *)arg, ",");
do { if(arg) do {
if(!acl->users) { if(!acl->users) {
acl->users = userl = myalloc(sizeof(struct userlist)); acl->users = userl = myalloc(sizeof(struct userlist));
} }
@ -924,7 +928,7 @@ struct ace * make_ace (int argc, unsigned char ** argv){
} }
if(argc > 1 && strcmp("*", (char *)argv[1])) { if(argc > 1 && strcmp("*", (char *)argv[1])) {
arg = (unsigned char *)strtok((char *)argv[1], ","); arg = (unsigned char *)strtok((char *)argv[1], ",");
do { if(arg) do {
if(!acl->src) { if(!acl->src) {
acl->src = ipl = myalloc(sizeof(struct iplist)); acl->src = ipl = myalloc(sizeof(struct iplist));
} }
@ -945,7 +949,7 @@ struct ace * make_ace (int argc, unsigned char ** argv){
} }
if(argc > 2 && strcmp("*", (char *)argv[2])) { if(argc > 2 && strcmp("*", (char *)argv[2])) {
arg = (unsigned char *)strtok((char *)argv[2], ","); arg = (unsigned char *)strtok((char *)argv[2], ",");
do { if(arg) do {
int arglen; int arglen;
unsigned char *pattern; unsigned char *pattern;
struct iplist tmpip={NULL}; struct iplist tmpip={NULL};
@ -1002,7 +1006,7 @@ struct ace * make_ace (int argc, unsigned char ** argv){
} }
if(argc > 3 && strcmp("*", (char *)argv[3])) { if(argc > 3 && strcmp("*", (char *)argv[3])) {
arg = (unsigned char *)strtok((char *)argv[3], ","); arg = (unsigned char *)strtok((char *)argv[3], ",");
do { if(arg) do {
if(!acl->ports) { if(!acl->ports) {
acl->ports = portl = myalloc(sizeof(struct portlist)); acl->ports = portl = myalloc(sizeof(struct portlist));
} }
@ -1025,7 +1029,7 @@ struct ace * make_ace (int argc, unsigned char ** argv){
} }
if(argc > 4 && strcmp("*", (char *)argv[4])) { if(argc > 4 && strcmp("*", (char *)argv[4])) {
arg = (unsigned char *)strtok((char *)argv[4], ","); arg = (unsigned char *)strtok((char *)argv[4], ",");
do { if(arg) do {
if(!strcmp((char *)arg, "CONNECT")){ if(!strcmp((char *)arg, "CONNECT")){
acl->operation |= CONNECT; acl->operation |= CONNECT;
} }
@ -1682,7 +1686,7 @@ int parsestr (unsigned char *str, unsigned char **argm, int nitems, unsigned cha
} }
switch(*str){ switch(*str){
case '\0': case '\0':
if(comment) return -1; if(comment || incbegin) return -1;
argm[argc] = 0; argm[argc] = 0;
return argc; return argc;
case '$': case '$':
@ -1709,14 +1713,14 @@ int parsestr (unsigned char *str, unsigned char **argm, int nitems, unsigned cha
argc--; argc--;
if((fd = open((char *)incbegin+1, O_RDONLY)) <= 0){ if((fd = open((char *)incbegin+1, O_RDONLY)) <= 0){
fprintf(stderr, "Failed to open %s\n", incbegin+1); fprintf(stderr, "Failed to open %s\n", incbegin+1);
break; return -1;
} }
if((*bufsize - *inbuf) <STRINGBUF){ if((*bufsize - *inbuf) <STRINGBUF){
*bufsize += STRINGBUF; *bufsize += STRINGBUF;
if(!(buf = myrealloc(buf, *bufsize))){ if(!(buf = myrealloc(buf, *bufsize))){
fprintf(stderr, "Failed to allocate memory for %s\n", incbegin+1); fprintf(stderr, "Failed to allocate memory for %s\n", incbegin+1);
close(fd); close(fd);
break; return -1;
} }
} }
len = 0; len = 0;
@ -1727,7 +1731,7 @@ int parsestr (unsigned char *str, unsigned char **argm, int nitems, unsigned cha
if((res = read(fd, buf+*inbuf+len, STRINGBUF-(1+len))) <= 0) { if((res = read(fd, buf+*inbuf+len, STRINGBUF-(1+len))) <= 0) {
perror((char *)incbegin+1); perror((char *)incbegin+1);
close(fd); close(fd);
break; return -1;
} }
close(fd); close(fd);
buf[*inbuf+res+len] = 0; buf[*inbuf+res+len] = 0;

View File

@ -300,6 +300,8 @@ int dobuf2(struct clientparam * param, unsigned char * buf, const unsigned char
break; break;
} }
case 0:
j--;
default: default:
buf[i++] = format[j]; buf[i++] = format[j];
} }