summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsimon MAGNIN-FEYSOT2018-01-17 19:25:08 +0100
committerjvoisin2018-01-17 19:25:08 +0100
commitb213c8e08b5624da9bb69dd05e132e247bab3082 (patch)
tree70098ca8ea967138d4beb3a1f423e5beb2908fd3
parent05e4b7ea67e07bb82db2a37930b383d51500b341 (diff)
Remove useless "head" member in our linked lists implementation
This should close #85
-rw-r--r--src/snuffleupagus.c14
-rw-r--r--src/sp_config_keywords.c23
-rw-r--r--src/sp_config_utils.c4
-rw-r--r--src/sp_disabled_functions.c2
-rw-r--r--src/sp_execute.c3
-rw-r--r--src/sp_list.c47
-rw-r--r--src/sp_list.h6
-rw-r--r--src/sp_utils.c2
-rw-r--r--src/sp_var_parser.c9
9 files changed, 45 insertions, 65 deletions
diff --git a/src/snuffleupagus.c b/src/snuffleupagus.c
index cb79b23..78a8659 100644
--- a/src/snuffleupagus.c
+++ b/src/snuffleupagus.c
@@ -79,16 +79,16 @@ PHP_GINIT_FUNCTION(snuffleupagus) {
79 SP_INIT(snuffleupagus_globals->config.config_eval); 79 SP_INIT(snuffleupagus_globals->config.config_eval);
80 80
81 snuffleupagus_globals->config.config_disabled_constructs->construct_include = 81 snuffleupagus_globals->config.config_disabled_constructs->construct_include =
82 sp_list_new(); 82 NULL;
83 snuffleupagus_globals->config.config_disabled_constructs->construct_eval = 83 snuffleupagus_globals->config.config_disabled_constructs->construct_eval =
84 sp_list_new(); 84 NULL;
85 snuffleupagus_globals->config.config_disabled_functions->disabled_functions = 85 snuffleupagus_globals->config.config_disabled_functions->disabled_functions =
86 sp_list_new(); 86 NULL;
87 snuffleupagus_globals->config.config_disabled_functions_ret 87 snuffleupagus_globals->config.config_disabled_functions_ret
88 ->disabled_functions = sp_list_new(); 88 ->disabled_functions = NULL;
89 snuffleupagus_globals->config.config_cookie->cookies = sp_list_new(); 89 snuffleupagus_globals->config.config_cookie->cookies = NULL;
90 snuffleupagus_globals->config.config_eval->blacklist = sp_list_new(); 90 snuffleupagus_globals->config.config_eval->blacklist = NULL;
91 snuffleupagus_globals->config.config_eval->whitelist = sp_list_new(); 91 snuffleupagus_globals->config.config_eval->whitelist = NULL;
92 92
93#undef SP_INIT 93#undef SP_INIT
94#undef SP_INIT_HT 94#undef SP_INIT_HT
diff --git a/src/sp_config_keywords.c b/src/sp_config_keywords.c
index 135868b..93c3da9 100644
--- a/src/sp_config_keywords.c
+++ b/src/sp_config_keywords.c
@@ -102,7 +102,7 @@ int parse_global(char *line) {
102 return parse_keywords(sp_config_funcs_global, line); 102 return parse_keywords(sp_config_funcs_global, line);
103} 103}
104 104
105static int parse_eval_filter_conf(char *line, sp_list_node *list) { 105static int parse_eval_filter_conf(char *line, sp_list_node **list) {
106 char *token; 106 char *token;
107 char *rest; 107 char *rest;
108 sp_config_functions sp_config_funcs[] = { 108 sp_config_functions sp_config_funcs[] = {
@@ -116,19 +116,19 @@ static int parse_eval_filter_conf(char *line, sp_list_node *list) {
116 } 116 }
117 117
118 while ((token = strtok_r(rest, ",", &rest))) { 118 while ((token = strtok_r(rest, ",", &rest))) {
119 sp_list_insert(list, token); 119 *list = sp_list_insert(*list, token);
120 } 120 }
121 return SUCCESS; 121 return SUCCESS;
122} 122}
123 123
124int parse_eval_blacklist(char *line) { 124int parse_eval_blacklist(char *line) {
125 return parse_eval_filter_conf(line, 125 return parse_eval_filter_conf(line,
126 SNUFFLEUPAGUS_G(config).config_eval->blacklist); 126 &SNUFFLEUPAGUS_G(config).config_eval->blacklist);
127} 127}
128 128
129int parse_eval_whitelist(char *line) { 129int parse_eval_whitelist(char *line) {
130 return parse_eval_filter_conf(line, 130 return parse_eval_filter_conf(line,
131 SNUFFLEUPAGUS_G(config).config_eval->whitelist); 131 &SNUFFLEUPAGUS_G(config).config_eval->whitelist);
132} 132}
133 133
134int parse_cookie(char *line) { 134int parse_cookie(char *line) {
@@ -204,7 +204,8 @@ int parse_cookie(char *line) {
204 return -1; 204 return -1;
205 } 205 }
206 } 206 }
207 sp_list_insert(SNUFFLEUPAGUS_G(config).config_cookie->cookies, cookie); 207 SNUFFLEUPAGUS_G(config).config_cookie->cookies = sp_list_insert(
208 SNUFFLEUPAGUS_G(config).config_cookie->cookies, cookie);
208 return SUCCESS; 209 return SUCCESS;
209} 210}
210 211
@@ -371,12 +372,12 @@ int parse_disabled_functions(char *line) {
371 372
372 switch (get_construct_type(df)) { 373 switch (get_construct_type(df)) {
373 case ZEND_INCLUDE_OR_EVAL: 374 case ZEND_INCLUDE_OR_EVAL:
374 sp_list_insert( 375 SNUFFLEUPAGUS_G(config).config_disabled_constructs->construct_include = sp_list_insert(
375 SNUFFLEUPAGUS_G(config).config_disabled_constructs->construct_include, 376 SNUFFLEUPAGUS_G(config).config_disabled_constructs->construct_include,
376 df); 377 df);
377 return ret; 378 return ret;
378 case ZEND_EVAL_CODE: 379 case ZEND_EVAL_CODE:
379 sp_list_insert( 380 SNUFFLEUPAGUS_G(config).config_disabled_constructs->construct_eval = sp_list_insert(
380 SNUFFLEUPAGUS_G(config).config_disabled_constructs->construct_eval, 381 SNUFFLEUPAGUS_G(config).config_disabled_constructs->construct_eval,
381 df); 382 df);
382 return ret; 383 return ret;
@@ -390,11 +391,11 @@ int parse_disabled_functions(char *line) {
390 } 391 }
391 392
392 if (df->ret || df->r_ret || df->ret_type) { 393 if (df->ret || df->r_ret || df->ret_type) {
393 sp_list_insert(SNUFFLEUPAGUS_G(config) 394 SNUFFLEUPAGUS_G(config).config_disabled_functions_ret->disabled_functions = sp_list_insert(
394 .config_disabled_functions_ret->disabled_functions, 395 SNUFFLEUPAGUS_G(config).config_disabled_functions_ret->disabled_functions,
395 df); 396 df);
396 } else { 397 } else {
397 sp_list_insert( 398 SNUFFLEUPAGUS_G(config).config_disabled_functions->disabled_functions = sp_list_insert(
398 SNUFFLEUPAGUS_G(config).config_disabled_functions->disabled_functions, 399 SNUFFLEUPAGUS_G(config).config_disabled_functions->disabled_functions,
399 df); 400 df);
400 } 401 }
diff --git a/src/sp_config_utils.c b/src/sp_config_utils.c
index 20d4d79..130f07e 100644
--- a/src/sp_config_utils.c
+++ b/src/sp_config_utils.c
@@ -105,12 +105,12 @@ zend_always_inline sp_list_node *parse_functions_list(char *value) {
105 return NULL; 105 return NULL;
106 } 106 }
107 107
108 sp_list_node *list = sp_list_new(); 108 sp_list_node *list = NULL;
109 char *tmp = strdup(value); 109 char *tmp = strdup(value);
110 char *function_name; 110 char *function_name;
111 char *next_token = tmp; 111 char *next_token = tmp;
112 while ((function_name = strtok_r(NULL, sep, &next_token))) { 112 while ((function_name = strtok_r(NULL, sep, &next_token))) {
113 sp_list_prepend(list, strdup(function_name)); 113 list = sp_list_prepend(list, strdup(function_name));
114 } 114 }
115 free(tmp); 115 free(tmp);
116 116
diff --git a/src/sp_disabled_functions.c b/src/sp_disabled_functions.c
index bb4a402..5619e1f 100644
--- a/src/sp_disabled_functions.c
+++ b/src/sp_disabled_functions.c
@@ -501,7 +501,7 @@ int hook_disabled_functions(void) {
501 ret |= hook_functions(SNUFFLEUPAGUS_G(config) 501 ret |= hook_functions(SNUFFLEUPAGUS_G(config)
502 .config_disabled_functions_ret->disabled_functions); 502 .config_disabled_functions_ret->disabled_functions);
503 503
504 if (NULL != SNUFFLEUPAGUS_G(config).config_eval->blacklist->data) { 504 if (NULL != SNUFFLEUPAGUS_G(config).config_eval->blacklist) {
505 sp_list_node* it = SNUFFLEUPAGUS_G(config).config_eval->blacklist; 505 sp_list_node* it = SNUFFLEUPAGUS_G(config).config_eval->blacklist;
506 506
507 while (it) { 507 while (it) {
diff --git a/src/sp_execute.c b/src/sp_execute.c
index ac7cee3..036f1a4 100644
--- a/src/sp_execute.c
+++ b/src/sp_execute.c
@@ -50,7 +50,8 @@ is_in_eval_and_whitelisted(const zend_execute_data *execute_data) {
50 return; 50 return;
51 } 51 }
52 52
53 if (EXPECTED(NULL == SNUFFLEUPAGUS_G(config).config_eval->whitelist->data)) { 53 if (EXPECTED(NULL == SNUFFLEUPAGUS_G(config).config_eval->whitelist ||
54 NULL == SNUFFLEUPAGUS_G(config).config_eval->whitelist->data)) {
54 return; 55 return;
55 } 56 }
56 57
diff --git a/src/sp_list.c b/src/sp_list.c
index 447f479..8879d89 100644
--- a/src/sp_list.c
+++ b/src/sp_list.c
@@ -11,12 +11,6 @@ void sp_list_free(sp_list_node *node) {
11 } 11 }
12} 12}
13 13
14sp_list_node *sp_list_new() {
15 sp_list_node *new = pecalloc(sizeof(*new), 1, 1);
16 new->next = new->data = new->head = NULL;
17 return new;
18}
19
20// Thanks to https://en.wikipedia.org/wiki/Insertion_sort :> 14// Thanks to https://en.wikipedia.org/wiki/Insertion_sort :>
21sp_list_node *sp_list_sort(sp_list_node *pList, 15sp_list_node *sp_list_sort(sp_list_node *pList,
22 int (*cmp_func)(sp_list_node *, sp_list_node *)) { 16 int (*cmp_func)(sp_list_node *, sp_list_node *)) {
@@ -46,39 +40,26 @@ sp_list_node *sp_list_sort(sp_list_node *pList,
46 return head; 40 return head;
47} 41}
48 42
49void sp_list_insert(sp_list_node *list, void *data) { 43sp_list_node *sp_list_insert(sp_list_node *list, void *data) {
50 if (list->head == NULL) { 44 sp_list_node *new = pecalloc(sizeof(*new), 1, 1);
51 list->data = data; 45 sp_list_node *origin = list;
52 list->next = NULL; 46 new->data = data;
53 list->head = list; 47 new->next = NULL;
54 } else {
55 sp_list_node *new = pecalloc(sizeof(*new), 1, 1);
56
57 new->data = data;
58 new->next = NULL;
59 new->head = list;
60 48
49 if (list == NULL) {
50 origin = new;
51 } else {
61 while (list->next) { 52 while (list->next) {
62 list = list->next; 53 list = list->next;
63 } 54 }
64 list->next = new; 55 list->next = new;
65 } 56 }
57 return origin;
66} 58}
67 59
68void sp_list_prepend(sp_list_node *list, void *data) { 60sp_list_node *sp_list_prepend(sp_list_node *list, void *data) {
69 if (list->head == NULL) { 61 sp_list_node *new = pecalloc(sizeof(*new), 1, 1);
70 list->data = data; 62 new->next = list;
71 list->next = NULL; 63 new->data = data;
72 list->head = list; 64 return new;
73 } else {
74 sp_list_node *new = pecalloc(sizeof(*new), 1, 1);
75
76 new->next = list->next;
77 list->next = new;
78
79 new->head = list;
80
81 new->data = list->data;
82 list->data = data;
83 }
84} 65}
diff --git a/src/sp_list.h b/src/sp_list.h
index 8477463..6b04486 100644
--- a/src/sp_list.h
+++ b/src/sp_list.h
@@ -3,16 +3,14 @@
3 3
4typedef struct sp_node_s { 4typedef struct sp_node_s {
5 struct sp_node_s *next; 5 struct sp_node_s *next;
6 struct sp_node_s *head;
7 void *data; 6 void *data;
8 7
9} sp_list_node; 8} sp_list_node;
10 9
11sp_list_node *sp_list_new();
12sp_list_node *sp_list_sort(sp_list_node *, 10sp_list_node *sp_list_sort(sp_list_node *,
13 int (*)(sp_list_node *, sp_list_node *)); 11 int (*)(sp_list_node *, sp_list_node *));
14void sp_list_insert(sp_list_node *, void *); 12sp_list_node *sp_list_insert(sp_list_node *, void *);
13sp_list_node *sp_list_prepend(sp_list_node *, void *);
15void sp_list_free(sp_list_node *); 14void sp_list_free(sp_list_node *);
16void sp_list_prepend(sp_list_node *, void *);
17 15
18#endif 16#endif
diff --git a/src/sp_utils.c b/src/sp_utils.c
index 9cd2888..e1fc630 100644
--- a/src/sp_utils.c
+++ b/src/sp_utils.c
@@ -397,7 +397,7 @@ int hook_regexp(const pcre* regexp, HashTable* hook_table,
397bool check_is_in_eval_whitelist(const char* const function_name) { 397bool check_is_in_eval_whitelist(const char* const function_name) {
398 const sp_list_node* it = SNUFFLEUPAGUS_G(config).config_eval->whitelist; 398 const sp_list_node* it = SNUFFLEUPAGUS_G(config).config_eval->whitelist;
399 399
400 if (!it->head) { 400 if (!it) {
401 return false; 401 return false;
402 } 402 }
403 403
diff --git a/src/sp_var_parser.c b/src/sp_var_parser.c
index 55cbfc2..d0ae67c 100644
--- a/src/sp_var_parser.c
+++ b/src/sp_var_parser.c
@@ -1,6 +1,6 @@
1#include "php_snuffleupagus.h" 1#include "php_snuffleupagus.h"
2 2
3static int parse_str_tokens(const char *str, const sp_conf_token token, 3static sp_list_node *parse_str_tokens(const char *str, const sp_conf_token token,
4 sp_list_node *tokens_list) { 4 sp_list_node *tokens_list) {
5 const char *cur_str = str; 5 const char *cur_str = str;
6 6
@@ -10,13 +10,13 @@ static int parse_str_tokens(const char *str, const sp_conf_token token,
10 token_elm->pos = cur_str - str; 10 token_elm->pos = cur_str - str;
11 token_elm->text_repr = token.text_repr; 11 token_elm->text_repr = token.text_repr;
12 token_elm->type = token.type; 12 token_elm->type = token.type;
13 sp_list_insert(tokens_list, token_elm); 13 tokens_list = sp_list_insert(tokens_list, token_elm);
14 cur_str += strlen(token.text_repr); 14 cur_str += strlen(token.text_repr);
15 } else { 15 } else {
16 cur_str++; 16 cur_str++;
17 } 17 }
18 } 18 }
19 return 0; 19 return tokens_list;
20} 20}
21 21
22static bool is_var_name_valid(const char *name) { 22static bool is_var_name_valid(const char *name) {
@@ -240,10 +240,9 @@ sp_tree *parse_var(const char *line) {
240 if (!line) { 240 if (!line) {
241 return NULL; 241 return NULL;
242 } 242 }
243 tokens_list = sp_list_new();
244 for (unsigned int i = 0; i < sizeof(delimiter_list) / sizeof(sp_conf_token); 243 for (unsigned int i = 0; i < sizeof(delimiter_list) / sizeof(sp_conf_token);
245 i++) { 244 i++) {
246 parse_str_tokens(line, delimiter_list[i], tokens_list); 245 tokens_list = parse_str_tokens(line, delimiter_list[i], tokens_list);
247 } 246 }
248 tokens_list = sp_list_sort(tokens_list, cmp_tokens); 247 tokens_list = sp_list_sort(tokens_list, cmp_tokens);
249 tree = parse_tokens(line, tokens_list); 248 tree = parse_tokens(line, tokens_list);