Fix config file parsing
This commit is contained in:
@ -77,16 +77,28 @@ int config_load(const char *filename) {
|
||||
|
||||
int i = 0;
|
||||
int j = 0;
|
||||
int line = 0;
|
||||
int mode = 0;
|
||||
char section = 0;
|
||||
char *ptr = NULL;
|
||||
char *source, *target;
|
||||
while ((ptr = strtok(ptr == NULL ? conf : NULL, "\n")) != NULL) {
|
||||
while ((ptr = strsep(&conf, "\r\n")) != NULL) {
|
||||
line++;
|
||||
char *comment = strchr(ptr, '#');
|
||||
if (comment != NULL) comment[0] = 0;
|
||||
|
||||
len = strlen(ptr);
|
||||
char *end_ptr = ptr + len - 1;
|
||||
while (end_ptr[0] == ' ' || end_ptr[0] == '\t') {
|
||||
end_ptr[0] = 0;
|
||||
end_ptr--;
|
||||
}
|
||||
len = strlen(ptr);
|
||||
if (len == 0) continue;
|
||||
|
||||
if (ptr[0] == '[') {
|
||||
if (ptr[len - 1] != ']') goto err;
|
||||
ptr++;
|
||||
int l = 0;
|
||||
if (strncmp(ptr, "host", 4) == 0 && (ptr[4] == ' ' || ptr[4] == '\t')) {
|
||||
ptr += 4;
|
||||
@ -115,6 +127,8 @@ int config_load(const char *filename) {
|
||||
} else if (len > 11 && strncmp(ptr, "dns_server", 10) == 0 && (ptr[10] == ' ' || ptr[10] == '\t')) {
|
||||
source = ptr + 10;
|
||||
target = dns_server;
|
||||
} else {
|
||||
goto err;
|
||||
}
|
||||
} else if (section == 'c') {
|
||||
cert_config *cc = &tmp_config->certs[j - 1];
|
||||
@ -124,6 +138,8 @@ int config_load(const char *filename) {
|
||||
} else if (len > 12 && strncmp(ptr, "private_key", 11) == 0 && (ptr[11] == ' ' || ptr[11] == '\t')) {
|
||||
source = ptr + 11;
|
||||
target = cc->priv_key;
|
||||
} else {
|
||||
goto err;
|
||||
}
|
||||
} else if (section == 'h') {
|
||||
host_config *hc = &tmp_config->hosts[i - 1];
|
||||
@ -180,21 +196,22 @@ int config_load(const char *filename) {
|
||||
hc->rev_proxy.enc = 1;
|
||||
}
|
||||
continue;
|
||||
} else {
|
||||
goto err;
|
||||
}
|
||||
} else {
|
||||
goto err;
|
||||
}
|
||||
char *end_ptr = source + strlen(source) - 1;
|
||||
|
||||
while (source[0] == ' ' || source[0] == '\t') source++;
|
||||
while (end_ptr[0] == ' ' || end_ptr[0] == '\t') end_ptr--;
|
||||
if (end_ptr <= source) {
|
||||
if (strlen(source) == 0) {
|
||||
err:
|
||||
free(conf);
|
||||
free(tmp_config);
|
||||
fprintf(stderr, ERR_STR "Unable to parse config file" CLR_STR "\n");
|
||||
fprintf(stderr, ERR_STR "Unable to parse config file (line %i)" CLR_STR "\n", line);
|
||||
return -2;
|
||||
}
|
||||
end_ptr[1] = 0;
|
||||
|
||||
if (target != NULL) {
|
||||
strcpy(target, source);
|
||||
} else if (mode == 1) {
|
||||
|
Reference in New Issue
Block a user