Project

General

Profile

Feature #2361 » lighttpd_pcrejit_v2.patch

mm, 2011-11-02 15:48

View differences:

src/data_config.c (working copy)
if (ds->string) buffer_free(ds->string);
#ifdef HAVE_PCRE_H
if (ds->regex) pcre_free(ds->regex);
if (ds->regex_study) pcre_free(ds->regex_study);
if (ds->regex_study) {
#ifdef PCRE_STUDY_JIT_COMPILE
pcre_free_study(ds->regex_study);
#else
pcre_free(ds->regex_study);
#endif
}
#endif
free(d);
}
src/configparser.y (working copy)
#ifdef HAVE_PCRE_H
const char *errptr;
int erroff, captures;
#ifdef PCRE_STUDY_JIT_COMPILE
static int study_options = PCRE_STUDY_JIT_COMPILE;
#else
static int study_options = 0;
#endif
if (NULL == (dc->regex =
pcre_compile(rvalue->ptr, 0, &errptr, &erroff, NULL))) {
......
ctx->ok = 0;
} else if (NULL == (dc->regex_study =
pcre_study(dc->regex, 0, &errptr)) &&
pcre_study(dc->regex, study_options, &errptr)) &&
errptr != NULL) {
fprintf(stderr, "studying regex failed: %s -> %s\n",
rvalue->ptr, errptr);
ctx->ok = 0;
} else if (0 != (pcre_fullinfo(dc->regex, dc->regex_study, PCRE_INFO_CAPTURECOUNT, &captures))) {
fprintf(stderr, "getting capture count for regex failed: %s\n",
rvalue->ptr);
ctx->ok = 0;
} else if (captures > 9) {
fprintf(stderr, "Too many captures in regex, use (?:...) instead of (...): %s\n",
rvalue->ptr);
ctx->ok = 0;
} else {
dc->string = buffer_init_buffer(rvalue);
#ifdef PCRE_STUDY_JIT_COMPILE
pcre_assign_jit_stack(dc->regex_study, NULL, NULL);
#endif
if (0 != (pcre_fullinfo(dc->regex, dc->regex_study, PCRE_INFO_CAPTURECOUNT, &captures))) {
fprintf(stderr, "getting capture count for regex failed: %s\n",
rvalue->ptr);
ctx->ok = 0;
} else if (captures > 9) {
fprintf(stderr, "Too many captures in regex, use (?:...) instead of (...): %s\n",
rvalue->ptr);
ctx->ok = 0;
} else {
dc->string = buffer_init_buffer(rvalue);
}
}
#else
fprintf(stderr, "can't handle '$%s[%s] =~ ...' as you compiled without pcre support. \n"
src/mod_ssi.c (working copy)
array_free(p->ssi_vars);
array_free(p->ssi_cgi_env);
#ifdef HAVE_PCRE_H
pcre_free(p->ssi_regex);
if (p->ssi_regex) pcre_free(p->ssi_regex);
if (p->ssi_regex_extra) {
#ifdef PCRE_STUDY_JIT_COMPILE
pcre_free_study(p->ssi_regex_extra);
#else
pcre_free(p->ssi_regex_extra);
#endif
}
#endif
buffer_free(p->timefmt);
buffer_free(p->stat_fn);
......
#ifdef HAVE_PCRE_H
const char *errptr;
int erroff;
#ifdef PCRE_STUDY_JIT_EXTRA
static int study_options = PCRE_STUDY_JIT_EXTRA;
#else
static int study_options = 0;
#endif
#endif
config_values_t cv[] = {
{ "ssi.extension", NULL, T_CONFIG_ARRAY, T_CONFIG_SCOPE_CONNECTION }, /* 0 */
......
erroff, errptr);
return HANDLER_ERROR;
}
if (NULL == (p->ssi_regex_extra = pcre_study(p->ssi_regex, study_options, &errptr))) {
log_error_write(srv, __FILE__, __LINE__, "ss",
"ssi: pcre study ",
errptr);
return HANDLER_ERROR;
}
#ifdef PCRE_STUDY_JIT_COMPILE
pcre_assign_jit_stack(p->ssi_regex_extra, NULL, NULL);
#endif
#else
log_error_write(srv, __FILE__, __LINE__, "s",
"mod_ssi: pcre support is missing, please recompile with pcre support or remove mod_ssi from the list of modules");
......
*
*/
#ifdef HAVE_PCRE_H
for (i = 0; (n = pcre_exec(p->ssi_regex, NULL, s.start, s.size, i, 0, ovec, N * 3)) > 0; i = ovec[1]) {
for (i = 0; (n = pcre_exec(p->ssi_regex, p->ssi_regex_extra, s.start, s.size, i, 0, ovec, N * 3)) > 0; i = ovec[1]) {
const char **l;
/* take everything from last offset to current match pos */
src/mod_ssi.h (working copy)
#ifdef HAVE_PCRE_H
pcre *ssi_regex;
pcre_extra *ssi_regex_extra;
#endif
buffer *timefmt;
int sizefmt;
src/mod_dirlisting.c (working copy)
typedef struct {
#ifdef HAVE_PCRE_H
pcre *regex;
pcre_extra *regex_extra;
#endif
buffer *string;
} excludes;
......
size_t i;
const char *errptr;
int erroff;
#ifdef PCRE_STUDY_JIT_COMPILE
static int study_options = PCRE_STUDY_JIT_COMPILE;
#else
static int study_options = 0;
#endif
if (!string) return -1;
......
return -1;
}
if (NULL == (exb->ptr[exb->used]->regex_extra = pcre_study(exb->ptr[exb->used]->regex,
study_options, &errptr))) {
return -1;
}
#ifdef PCRE_STUDY_JIT_COMPILE
pcre_assign_jit_stack(exb->ptr[exb->used]->regex_extra, NULL, NULL);
#endif
exb->ptr[exb->used]->string = buffer_init();
buffer_copy_string_buffer(exb->ptr[exb->used]->string, string);
......
for (i = 0; i < exb->size; i++) {
if (exb->ptr[i]->regex) pcre_free(exb->ptr[i]->regex);
if (exb->ptr[i]->regex_extra) {
#ifdef PCRE_STUDY_JIT_COMPILE
pcre_free_study(exb->ptr[i]->regex_extra);
#else
pcre_free(exb->ptr[i]->regex_extra);
#endif
}
if (exb->ptr[i]->string) buffer_free(exb->ptr[i]->string);
free(exb->ptr[i]);
}
src/mod_rewrite.c (working copy)
#ifdef HAVE_PCRE_H
typedef struct {
pcre *key;
pcre_extra *key_extra;
buffer *value;
......
size_t i;
const char *errptr;
int erroff;
#ifdef PCRE_STUDY_JIT_COMPILE
static int study_options = PCRE_STUDY_JIT_COMPILE;
#else
static int study_options = 0;
#endif
if (!key) return -1;
......
if (NULL == (kvb->ptr[kvb->used]->key = pcre_compile(key->ptr,
0, &errptr, &erroff, NULL))) {
return -1;
}
if (NULL == (kvb->ptr[kvb->used]->key_extra = pcre_study(kvb->ptr[kvb->used]->key,
study_options, &errptr)) &&
errptr != NULL) {
return -1;
}
#ifdef PCRE_STUDY_JIT_COMPILE
pcre_assign_jit_stack(kvb->ptr[kvb->used]->key_extra, NULL, NULL);
#endif
kvb->ptr[kvb->used]->value = buffer_init();
buffer_copy_string_buffer(kvb->ptr[kvb->used]->value, value);
......
for (i = 0; i < kvb->size; i++) {
if (kvb->ptr[i]->key) pcre_free(kvb->ptr[i]->key);
if (kvb->ptr[i]->value) buffer_free(kvb->ptr[i]->value);
if (kvb->ptr[i]->key_extra) {
#ifdef PCRE_STUDY_JIT_COMPILE
pcre_free_study(kvb->ptr[i]->key_extra);
#else
pcre_free(kvb->ptr[i]->key_extra);
#endif
}
free(kvb->ptr[i]);
}
......
for (i = 0; i < kvb->used; i++) {
pcre *match;
pcre_extra *extra;
const char *pattern;
size_t pattern_len;
int n;
......
int ovec[N * 3];
match = rule->key;
extra = rule->key_extra;
pattern = rule->value->ptr;
pattern_len = rule->value->used - 1;
if ((n = pcre_exec(match, NULL, p->match_buf->ptr, p->match_buf->used - 1, 0, 0, ovec, 3 * N)) < 0) {
if ((n = pcre_exec(match, extra, p->match_buf->ptr, p->match_buf->used - 1, 0, 0, ovec, 3 * N)) < 0) {
if (n != PCRE_ERROR_NOMATCH) {
log_error_write(srv, __FILE__, __LINE__, "sd",
"execution error while matching: ", n);
src/mod_trigger_b4_dl.c (working copy)
#if defined(HAVE_PCRE_H)
pcre *trigger_regex;
pcre *download_regex;
pcre_extra *trigger_regex_extra;
pcre_extra *download_regex_extra;
#endif
#if defined(HAVE_GDBM_H)
GDBM_FILE db;
......
#if defined(HAVE_PCRE_H)
if (s->trigger_regex) pcre_free(s->trigger_regex);
if (s->download_regex) pcre_free(s->download_regex);
if (s->trigger_regex_extra) {
#ifdef PCRE_STUDY_JIT_COMPILE
pcre_free_study(s->trigger_regex_extra);
#else
pcre_free(s->trigger_regex_extra);
#endif
}
if (s->download_regex_extra) {
#ifdef PCRE_STUDY_JIT_COMPILE
pcre_free_study(s->download_regex_extra);
#else
pcre_free(s->download_regex_extra);
#endif
}
#endif
#if defined(HAVE_GDBM_H)
if (s->db) gdbm_close(s->db);
#endif
......
#if defined(HAVE_PCRE_H)
const char *errptr;
int erroff;
#ifdef PCRE_STUDY_JIT_EXTRA
static int study_options = PCRE_STUDY_JIT_EXTRA;
#else
static int study_options = 0;
#endif
#endif
s = calloc(1, sizeof(plugin_config));
s->db_filename = buffer_init();
......
s->download_url, "pos:", erroff);
return HANDLER_ERROR;
}
if (NULL == (s->download_regex_extra = pcre_study(s->download_regex,
study_options, &errptr))) {
log_error_write(srv, __FILE__, __LINE__, "sb",
"studying regex for download-url failed:",
s->download_url);
return HANDLER_ERROR;
}
#ifdef PCRE_STUDY_JIT_COMPILE
pcre_assign_jit_stack(s->download_regex_extra, NULL, NULL);
#endif
}
if (!buffer_is_empty(s->trigger_url)) {
......
return HANDLER_ERROR;
}
if (NULL == (s->trigger_regex_extra = pcre_study(s->trigger_regex,
study_options, &errptr))) {
log_error_write(srv, __FILE__, __LINE__, "sb",
"studying regex for trigger-url failed:",
s->trigger_url);
return HANDLER_ERROR;
}
#ifdef PCRE_STUDY_JIT_COMPILE
pcre_assign_jit_stack(s->trigger_regex_extra, NULL, NULL);
#endif
}
#endif
......
}
/* check if URL is a trigger -> insert IP into DB */
if ((n = pcre_exec(p->conf.trigger_regex, NULL, con->uri.path->ptr, con->uri.path->used - 1, 0, 0, ovec, 3 * N)) < 0) {
if ((n = pcre_exec(p->conf.trigger_regex, p->conf.trigger_regex_extra, con->uri.path->ptr, con->uri.path->used - 1, 0, 0, ovec, 3 * N)) < 0) {
if (n != PCRE_ERROR_NOMATCH) {
log_error_write(srv, __FILE__, __LINE__, "sd",
"execution error while matching:", n);
src/keyvalue.c (working copy)
const char *errptr;
int erroff;
pcre_keyvalue *kv;
#ifdef PCRE_STUDY_JIT_COMPILE
static int study_options = PCRE_STUDY_JIT_COMPILE;
#else
static int study_options = 0;
#endif
#endif
if (!key) return -1;
......
"rexexp compilation error at ", errptr);
return -1;
}
if (NULL == (kv->key_extra = pcre_study(kv->key, 0, &errptr)) &&
if (NULL == (kv->key_extra = pcre_study(kv->key, study_options, &errptr)) &&
errptr != NULL) {
return -1;
}
#ifdef PCRE_STUDY_JIT_COMPILE
pcre_assign_jit_stack(kv->key_extra, NULL, NULL);
#endif
kv->value = buffer_init_string(value);
......
for (i = 0; i < kvb->size; i++) {
kv = kvb->kv[i];
if (kv->key) pcre_free(kv->key);
if (kv->key_extra) pcre_free(kv->key_extra);
if (kv->key_extra) {
#ifdef PCRE_STUDY_JIT_COMPILE
pcre_free_study(kv->key_extra);
#else
pcre_free(kv->key_extra);
#endif
}
if (kv->value) buffer_free(kv->value);
free(kv);
}
(2-2/4)