projects
/
exim.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Add perl_taintmode option
[exim.git]
/
src
/
src
/
sieve.c
diff --git
a/src/src/sieve.c
b/src/src/sieve.c
index 7653993da742472ebb56226c8b08604168526fd6..5d072f855aafa5e306cd9bfd40088bc8d1c69067 100644
(file)
--- a/
src/src/sieve.c
+++ b/
src/src/sieve.c
@@
-2,8
+2,10
@@
* Exim - an Internet mail transport agent *
*************************************************/
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) Michael Haardt 2003-2008 */
-/* See the file NOTICE for conditions of use and distribution. */
+/* Copyright (c) Michael Haardt 2003 - 2015
+ * Copyright (c) The Exim Maintainers 2016
+ * See the file NOTICE for conditions of use and distribution.
+ */
/* This code was contributed by Michael Haardt. */
/* This code was contributed by Michael Haardt. */
@@
-232,6
+234,9
@@
uschar *new = NULL;
uschar ch;
size_t line;
uschar ch;
size_t line;
+/* Two passes: one to count output allocation size, second
+to do the encoding */
+
for (pass=0; pass<=1; ++pass)
{
line=0;
for (pass=0; pass<=1; ++pass)
{
line=0;
@@
-245,54
+250,47
@@
for (pass=0; pass<=1; ++pass)
for (start=src->character,end=start+src->length; start<end; ++start)
{
ch=*start;
for (start=src->character,end=start+src->length; start<end; ++start)
{
ch=*start;
- if (line>=73)
+ if (line>=73)
/* line length limit */
{
if (pass==0)
dst->length+=2;
else
{
{
if (pass==0)
dst->length+=2;
else
{
- *new++='=';
+ *new++='=';
/* line split */
*new++='\n';
}
line=0;
}
*new++='\n';
}
line=0;
}
- if
- (
- (ch>=33 && ch<=60)
- || (ch>=62 && ch<=126)
- ||
- (
- (ch==9 || ch==32)
- && start+2<end
- && (*(start+1)!='\r' || *(start+2)!='\n')
- )
- )
+ if ( (ch>='!' && ch<='<')
+ || (ch>='>' && ch<='~')
+ || ( (ch=='\t' || ch==' ')
+ && start+2<end
+ && (*(start+1)!='\r' || *(start+2)!='\n') /* CRLF */
+ )
+ )
{
if (pass==0)
++dst->length;
else
{
if (pass==0)
++dst->length;
else
- *new++=*start;
+ *new++=*start;
/* copy char */
++line;
}
++line;
}
- else if (ch=='\r' && start+1<end && *(start+1)=='\n')
+ else if (ch=='\r' && start+1<end && *(start+1)=='\n')
/* CRLF */
{
if (pass==0)
{
if (pass==0)
- {
++dst->length;
++dst->length;
- line=0;
- }
else
else
- *new++='\n';
-
line=0;
- ++start;
+ *new++='\n';
/* NL */
+ line=0;
+ ++start;
/* consume extra input char */
}
else
{
if (pass==0)
dst->length+=3;
else
}
else
{
if (pass==0)
dst->length+=3;
else
- {
- sprintf(CS new,"=%02X",ch);
+ {
/* encoded char */
+
new +=
sprintf(CS new,"=%02X",ch);
new+=3;
}
line+=3;
new+=3;
}
line+=3;
@@
-433,7
+431,7
@@
if (*uri && *uri!='?')
if (uri>start)
{
capacity=0;
if (uri>start)
{
capacity=0;
- to.character=
(uschar*)0
;
+ to.character=
NULL
;
to.length=0;
to.character=string_cat(to.character,&capacity,&to.length,start,uri-start);
to.character[to.length]='\0';
to.length=0;
to.character=string_cat(to.character,&capacity,&to.length,start,uri-start);
to.character[to.length]='\0';
@@
-467,7
+465,7
@@
if (*uri=='?')
if (uri>start)
{
capacity=0;
if (uri>start)
{
capacity=0;
- hname.character=
(uschar*)0
;
+ hname.character=
NULL
;
hname.length=0;
hname.character=string_cat(hname.character,&capacity,&hname.length,start,uri-start);
hname.character[hname.length]='\0';
hname.length=0;
hname.character=string_cat(hname.character,&capacity,&hname.length,start,uri-start);
hname.character[hname.length]='\0';
@@
-490,7
+488,7
@@
if (*uri=='?')
if (uri>start)
{
capacity=0;
if (uri>start)
{
capacity=0;
- hvalue.character=
(uschar*)0
;
+ hvalue.character=
NULL
;
hvalue.length=0;
hvalue.character=string_cat(hvalue.character,&capacity,&hvalue.length,start,uri-start);
hvalue.character[hvalue.length]='\0';
hvalue.length=0;
hvalue.character=string_cat(hvalue.character,&capacity,&hvalue.length,start,uri-start);
hvalue.character[hvalue.length]='\0';