projects
/
privoxy.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Update CVS ids in footers
[privoxy.git]
/
pcrs.c
diff --git
a/pcrs.c
b/pcrs.c
index
d645538
..
156ae98
100644
(file)
--- a/
pcrs.c
+++ b/
pcrs.c
@@
-1,4
+1,4
@@
-const char pcrs_rcs[] = "$Id: pcrs.c,v 1.4
3 2012/10/29 12:01:31
fabiankeil Exp $";
+const char pcrs_rcs[] = "$Id: pcrs.c,v 1.4
7 2015/01/24 16:40:59
fabiankeil Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/pcrs.c,v $
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/pcrs.c,v $
@@
-80,6
+80,8
@@
static int is_hex_sequence(const char *sequence);
*********************************************************************/
const char *pcrs_strerror(const int error)
{
*********************************************************************/
const char *pcrs_strerror(const int error)
{
+ static char buf[100];
+
if (error != 0)
{
switch (error)
if (error != 0)
{
switch (error)
@@
-119,7
+121,11
@@
const char *pcrs_strerror(const int error)
* version. If Privoxy is linked against a newer
* PCRE version all bets are off ...
*/
* version. If Privoxy is linked against a newer
* PCRE version all bets are off ...
*/
- default: return "Unknown error. Privoxy out of sync with PCRE?";
+ default:
+ snprintf(buf, sizeof(buf),
+ "Error code %d. For details, check the pcre documentation.",
+ error);
+ return buf;
}
}
/* error >= 0: No error */
}
}
/* error >= 0: No error */
@@
-319,6
+325,13
@@
static pcrs_substitute *pcrs_compile_replacement(const char *replacement, int tr
if (replacement[i] == '$' && !quoted && i < (int)(length - 1))
{
char *symbol, symbols[] = "'`+&";
if (replacement[i] == '$' && !quoted && i < (int)(length - 1))
{
char *symbol, symbols[] = "'`+&";
+ if (l >= PCRS_MAX_SUBMATCHES)
+ {
+ freez(text);
+ freez(r);
+ *errptr = PCRS_WARN_BADREF;
+ return NULL;
+ }
r->block_length[l] = (size_t)(k - r->block_offset[l]);
/* Numerical backreferences */
r->block_length[l] = (size_t)(k - r->block_offset[l]);
/* Numerical backreferences */
@@
-330,7
+343,10
@@
static pcrs_substitute *pcrs_compile_replacement(const char *replacement, int tr
}
if (r->backref[l] > capturecount)
{
}
if (r->backref[l] > capturecount)
{
+ freez(text);
+ freez(r);
*errptr = PCRS_WARN_BADREF;
*errptr = PCRS_WARN_BADREF;
+ return NULL;
}
}
}
}
@@
-360,14
+376,17
@@
static pcrs_substitute *pcrs_compile_replacement(const char *replacement, int tr
}
/* Valid and in range? -> record */
}
/* Valid and in range? -> record */
- if (r->backref[l] < PCRS_MAX_SUBMATCHES + 2)
+ if (
0 <= r->backref[l] &&
r->backref[l] < PCRS_MAX_SUBMATCHES + 2)
{
r->backref_count[r->backref[l]] += 1;
r->block_offset[++l] = k;
}
else
{
{
r->backref_count[r->backref[l]] += 1;
r->block_offset[++l] = k;
}
else
{
+ freez(text);
+ freez(r);
*errptr = PCRS_WARN_BADREF;
*errptr = PCRS_WARN_BADREF;
+ return NULL;
}
continue;
}
}
continue;
}
@@
-725,7
+744,7
@@
int pcrs_execute_list(pcrs_job *joblist, char *subject, size_t subject_length, c
* 1 : job = the pcrs_job to be executed
* 2 : subject = the subject (== original) string
* 3 : subject_length = the subject's length
* 1 : job = the pcrs_job to be executed
* 2 : subject = the subject (== original) string
* 3 : subject_length = the subject's length
- * 4 : result = char** for returning
the result
+ * 4 : result = char** for returning
the result (NULL on error)
* 5 : result_length = size_t* for returning the result's length
*
* Returns : On success, the number of substitutions that were made.
* 5 : result_length = size_t* for returning the result's length
*
* Returns : On success, the number of substitutions that were made.
@@
-747,19
+766,18
@@
int pcrs_execute(pcrs_job *job, const char *subject, size_t subject_length, char
char *result_offset;
offset = i = 0;
char *result_offset;
offset = i = 0;
+ *result = NULL;
/*
* Sanity check & memory allocation
*/
if (job == NULL || job->pattern == NULL || job->substitute == NULL || NULL == subject)
{
/*
* Sanity check & memory allocation
*/
if (job == NULL || job->pattern == NULL || job->substitute == NULL || NULL == subject)
{
- *result = NULL;
return(PCRS_ERR_BADJOB);
}
if (NULL == (matches = (pcrs_match *)malloc((size_t)max_matches * sizeof(pcrs_match))))
{
return(PCRS_ERR_BADJOB);
}
if (NULL == (matches = (pcrs_match *)malloc((size_t)max_matches * sizeof(pcrs_match))))
{
- *result = NULL;
return(PCRS_ERR_NOMEM);
}
memset(matches, '\0', (size_t)max_matches * sizeof(pcrs_match));
return(PCRS_ERR_NOMEM);
}
memset(matches, '\0', (size_t)max_matches * sizeof(pcrs_match));
@@
-806,7
+824,6
@@
int pcrs_execute(pcrs_job *job, const char *subject, size_t subject_length, char
if (NULL == (dummy = (pcrs_match *)realloc(matches, (size_t)max_matches * sizeof(pcrs_match))))
{
free(matches);
if (NULL == (dummy = (pcrs_match *)realloc(matches, (size_t)max_matches * sizeof(pcrs_match))))
{
free(matches);
- *result = NULL;
return(PCRS_ERR_NOMEM);
}
matches = dummy;
return(PCRS_ERR_NOMEM);
}
matches = dummy;
@@
-1102,6
+1119,7
@@
pcrs_job *pcrs_compile_dynamic_command(char *pcrs_command, const struct pcrs_var
{
/* No proper delimiter found */
*error = PCRS_ERR_CMDSYNTAX;
{
/* No proper delimiter found */
*error = PCRS_ERR_CMDSYNTAX;
+ freez(pcrs_command_tmp);
return NULL;
}
return NULL;
}