diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/sp_config.c | 102 |
1 files changed, 59 insertions, 43 deletions
diff --git a/src/sp_config.c b/src/sp_config.c index 72781c6..db3f12d 100644 --- a/src/sp_config.c +++ b/src/sp_config.c | |||
| @@ -56,12 +56,19 @@ static int parse_line(char *line) { | |||
| 56 | } | 56 | } |
| 57 | 57 | ||
| 58 | /* keyword parsing */ | 58 | /* keyword parsing */ |
| 59 | #define CHECK_DUPLICATE_KEYWORD(retval) \ | ||
| 60 | if (*(void**)(retval)) { \ | ||
| 61 | sp_log_err("config", "duplicate %s) on line %zu near `%s`", keyword, sp_line_no, line); \ | ||
| 62 | return -1; } | ||
| 63 | |||
| 64 | |||
| 59 | int parse_empty(char *restrict line, char *restrict keyword, void *retval) { | 65 | int parse_empty(char *restrict line, char *restrict keyword, void *retval) { |
| 60 | *(bool *)retval = true; | 66 | *(bool *)retval = true; |
| 61 | return 0; | 67 | return 0; |
| 62 | } | 68 | } |
| 63 | 69 | ||
| 64 | int parse_list(char *restrict line, char *restrict keyword, void *list_ptr) { | 70 | int parse_list(char *restrict line, char *restrict keyword, void *list_ptr) { |
| 71 | CHECK_DUPLICATE_KEYWORD(list_ptr); | ||
| 65 | zend_string *value = NULL; | 72 | zend_string *value = NULL; |
| 66 | sp_list_node **list = list_ptr; | 73 | sp_list_node **list = list_ptr; |
| 67 | char *token, *tmp; | 74 | char *token, *tmp; |
| @@ -86,48 +93,50 @@ int parse_list(char *restrict line, char *restrict keyword, void *list_ptr) { | |||
| 86 | } | 93 | } |
| 87 | 94 | ||
| 88 | int parse_php_type(char *restrict line, char *restrict keyword, void *retval) { | 95 | int parse_php_type(char *restrict line, char *restrict keyword, void *retval) { |
| 96 | CHECK_DUPLICATE_KEYWORD(retval); | ||
| 89 | size_t consumed = 0; | 97 | size_t consumed = 0; |
| 90 | zend_string *value = get_param(&consumed, line, SP_TYPE_STR, keyword); | 98 | zend_string *value = get_param(&consumed, line, SP_TYPE_STR, keyword); |
| 91 | if (value) { | 99 | if (!value) { |
| 92 | if (zend_string_equals_literal_ci(value, "undef")) { | 100 | return -1; |
| 93 | *(sp_php_type *)retval = SP_PHP_TYPE_UNDEF; | 101 | } |
| 94 | } else if (zend_string_equals_literal_ci(value, "null")) { | 102 | |
| 95 | *(sp_php_type *)retval = SP_PHP_TYPE_NULL; | 103 | if (zend_string_equals_literal_ci(value, "undef")) { |
| 96 | } else if (zend_string_equals_literal_ci(value, "true")) { | 104 | *(sp_php_type *)retval = SP_PHP_TYPE_UNDEF; |
| 97 | *(sp_php_type *)retval = SP_PHP_TYPE_TRUE; | 105 | } else if (zend_string_equals_literal_ci(value, "null")) { |
| 98 | } else if (zend_string_equals_literal_ci(value, "false")) { | 106 | *(sp_php_type *)retval = SP_PHP_TYPE_NULL; |
| 99 | *(sp_php_type *)retval = SP_PHP_TYPE_FALSE; | 107 | } else if (zend_string_equals_literal_ci(value, "true")) { |
| 100 | } else if (zend_string_equals_literal_ci(value, "long")) { | 108 | *(sp_php_type *)retval = SP_PHP_TYPE_TRUE; |
| 101 | *(sp_php_type *)retval = SP_PHP_TYPE_LONG; | 109 | } else if (zend_string_equals_literal_ci(value, "false")) { |
| 102 | } else if (zend_string_equals_literal_ci(value, "double")) { | 110 | *(sp_php_type *)retval = SP_PHP_TYPE_FALSE; |
| 103 | *(sp_php_type *)retval = SP_PHP_TYPE_DOUBLE; | 111 | } else if (zend_string_equals_literal_ci(value, "long")) { |
| 104 | } else if (zend_string_equals_literal_ci(value, "string")) { | 112 | *(sp_php_type *)retval = SP_PHP_TYPE_LONG; |
| 105 | *(sp_php_type *)retval = SP_PHP_TYPE_STRING; | 113 | } else if (zend_string_equals_literal_ci(value, "double")) { |
| 106 | } else if (zend_string_equals_literal_ci(value, "array")) { | 114 | *(sp_php_type *)retval = SP_PHP_TYPE_DOUBLE; |
| 107 | *(sp_php_type *)retval = SP_PHP_TYPE_ARRAY; | 115 | } else if (zend_string_equals_literal_ci(value, "string")) { |
| 108 | } else if (zend_string_equals_literal_ci(value, "object")) { | 116 | *(sp_php_type *)retval = SP_PHP_TYPE_STRING; |
| 109 | *(sp_php_type *)retval = SP_PHP_TYPE_OBJECT; | 117 | } else if (zend_string_equals_literal_ci(value, "array")) { |
| 110 | } else if (zend_string_equals_literal_ci(value, "resource")) { | 118 | *(sp_php_type *)retval = SP_PHP_TYPE_ARRAY; |
| 111 | *(sp_php_type *)retval = SP_PHP_TYPE_RESOURCE; | 119 | } else if (zend_string_equals_literal_ci(value, "object")) { |
| 112 | } else if (zend_string_equals_literal_ci(value, "reference")) { | 120 | *(sp_php_type *)retval = SP_PHP_TYPE_OBJECT; |
| 113 | *(sp_php_type *)retval = SP_PHP_TYPE_REFERENCE; | 121 | } else if (zend_string_equals_literal_ci(value, "resource")) { |
| 114 | } else { | 122 | *(sp_php_type *)retval = SP_PHP_TYPE_RESOURCE; |
| 115 | pefree(value, 1); | 123 | } else if (zend_string_equals_literal_ci(value, "reference")) { |
| 116 | sp_log_err("error", | 124 | *(sp_php_type *)retval = SP_PHP_TYPE_REFERENCE; |
| 117 | "%s) is expecting a valid php type ('false', 'true'," | ||
| 118 | " 'array'. 'object', 'long', 'double', 'null', 'resource', " | ||
| 119 | "'reference', 'undef') on line %zu", | ||
| 120 | keyword, sp_line_no); | ||
| 121 | return -1; | ||
| 122 | } | ||
| 123 | pefree(value, 1); | ||
| 124 | return consumed; | ||
| 125 | } else { | 125 | } else { |
| 126 | pefree(value, 1); | ||
| 127 | sp_log_err("error", | ||
| 128 | "%s) is expecting a valid php type ('false', 'true'," | ||
| 129 | " 'array'. 'object', 'long', 'double', 'null', 'resource', " | ||
| 130 | "'reference', 'undef') on line %zu", | ||
| 131 | keyword, sp_line_no); | ||
| 126 | return -1; | 132 | return -1; |
| 127 | } | 133 | } |
| 134 | pefree(value, 1); | ||
| 135 | return consumed; | ||
| 128 | } | 136 | } |
| 129 | 137 | ||
| 130 | int parse_str(char *restrict line, char *restrict keyword, void *retval) { | 138 | int parse_str(char *restrict line, char *restrict keyword, void *retval) { |
| 139 | CHECK_DUPLICATE_KEYWORD(retval); | ||
| 131 | zend_string *value = NULL; | 140 | zend_string *value = NULL; |
| 132 | 141 | ||
| 133 | size_t consumed = 0; | 142 | size_t consumed = 0; |
| @@ -140,27 +149,34 @@ int parse_str(char *restrict line, char *restrict keyword, void *retval) { | |||
| 140 | } | 149 | } |
| 141 | 150 | ||
| 142 | int parse_cidr(char *restrict line, char *restrict keyword, void *retval) { | 151 | int parse_cidr(char *restrict line, char *restrict keyword, void *retval) { |
| 152 | CHECK_DUPLICATE_KEYWORD(retval); | ||
| 153 | |||
| 143 | size_t consumed = 0; | 154 | size_t consumed = 0; |
| 144 | zend_string *value = get_param(&consumed, line, SP_TYPE_STR, keyword); | 155 | zend_string *value = get_param(&consumed, line, SP_TYPE_STR, keyword); |
| 156 | |||
| 157 | if (!value) { | ||
| 158 | sp_log_err("config", "%s doesn't contain a valid cidr on line %zu", line, sp_line_no); | ||
| 159 | return -1; | ||
| 160 | } | ||
| 161 | |||
| 145 | sp_cidr *cidr = pecalloc(sizeof(sp_cidr), 1, 1); | 162 | sp_cidr *cidr = pecalloc(sizeof(sp_cidr), 1, 1); |
| 146 | 163 | ||
| 147 | if (value) { | 164 | if (0 == get_ip_and_cidr(ZSTR_VAL(value), cidr)) { |
| 148 | if (-1 == get_ip_and_cidr(ZSTR_VAL(value), cidr)) { | 165 | pefree(cidr, 1); |
| 149 | return -1; | 166 | *(sp_cidr **)retval = NULL; |
| 150 | } | ||
| 151 | *(sp_cidr **)retval = cidr; | ||
| 152 | return consumed; | ||
| 153 | } else { | ||
| 154 | sp_log_err("config", "%s doesn't contain a valid cidr on line %zu", line, | ||
| 155 | sp_line_no); | ||
| 156 | return -1; | 167 | return -1; |
| 157 | } | 168 | } |
| 169 | |||
| 170 | *(sp_cidr **)retval = cidr; | ||
| 171 | return consumed; | ||
| 158 | } | 172 | } |
| 159 | 173 | ||
| 160 | int parse_regexp(char *restrict line, char *restrict keyword, void *retval) { | 174 | int parse_regexp(char *restrict line, char *restrict keyword, void *retval) { |
| 161 | /* TODO: Do we want to use pcre_study? | 175 | /* TODO: Do we want to use pcre_study? |
| 162 | * (http://www.pcre.org/original/doc/html/pcre_study.html) | 176 | * (http://www.pcre.org/original/doc/html/pcre_study.html) |
| 163 | * maybe not: http://sljit.sourceforge.net/pcre.html*/ | 177 | * maybe not: http://sljit.sourceforge.net/pcre.html*/ |
| 178 | CHECK_DUPLICATE_KEYWORD(retval); | ||
| 179 | |||
| 164 | size_t consumed = 0; | 180 | size_t consumed = 0; |
| 165 | zend_string *value = get_param(&consumed, line, SP_TYPE_STR, keyword); | 181 | zend_string *value = get_param(&consumed, line, SP_TYPE_STR, keyword); |
| 166 | 182 | ||
