diff options
author | Philip Hazel <ph10@hermes.cam.ac.uk> | 2007-04-19 13:19:06 +0000 |
---|---|---|
committer | Philip Hazel <ph10@hermes.cam.ac.uk> | 2007-04-19 13:19:06 +0000 |
commit | eb4c0de6a9078df61b580ee20e575f1a40ddb242 (patch) | |
tree | b14ad892567e04a7b19efd71264799f9c111ce94 | |
parent | 4aa45c318ef507a75ea0aa97e0241b866b966b24 (diff) |
Update version number; apply new patch from Sieve maintainer.
-rw-r--r-- | doc/doc-txt/ChangeLog | 8 | ||||
-rw-r--r-- | src/src/sieve.c | 158 | ||||
-rw-r--r-- | src/src/version.c | 4 |
3 files changed, 87 insertions, 83 deletions
diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog index b54416c14..e6ecdce5b 100644 --- a/doc/doc-txt/ChangeLog +++ b/doc/doc-txt/ChangeLog @@ -1,8 +1,14 @@ -$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.504 2007/04/16 11:17:12 ph10 Exp $ +$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.505 2007/04/19 13:19:06 ph10 Exp $ Change log file for Exim from version 4.21 ------------------------------------------- +Exim version 4.68 +----------------- + +PH/01 Another patch from the Sieve maintainer. + + Exim version 4.67 ----------------- diff --git a/src/src/sieve.c b/src/src/sieve.c index 56b000272..e243f653c 100644 --- a/src/src/sieve.c +++ b/src/src/sieve.c @@ -1,4 +1,4 @@ -/* $Cambridge: exim/src/src/sieve.c,v 1.27 2007/04/12 09:00:52 ph10 Exp $ */ +/* $Cambridge: exim/src/src/sieve.c,v 1.28 2007/04/19 13:19:06 ph10 Exp $ */ /************************************************* * Exim - an Internet mail transport agent * @@ -1197,12 +1197,13 @@ return 1; #ifdef ENCODED_CHARACTER /************************************************* -* Decode encoded-character string * +* Decode hex-encoded-character string * *************************************************/ /* Encoding definition: - hex-pair-seq = hex-pair *(WSP hex-pair) + blank = SP / TAB / CRLF + hex-pair-seq = *blank hex-pair *(1*blank hex-pair) *blank hex-pair = 1*2HEXDIG Arguments: @@ -1219,37 +1220,42 @@ static int hex_decode(uschar *src, uschar *end, uschar *dst) { int decoded=0; -while (src<end) +while (*src==' ' || *src=='\t' || *src=='\n') ++src; +do { - int l,h; + int x,d,n; - if (*src==' ' || *src=='\t') ++src; - else if ((src+1)<end && isxdigit(h=tolower(*src)) && isxdigit(l=tolower(*(src+1)))) - { - h=(h>='0' && h<='9') ? h-'0' : 10+(h-'a'); - l=(l>='0' && l<='9') ? l-'0' : 10+(l-'a'); - if (dst) *dst++=(h<<4)|l; - ++decoded; - src+=2; - } - else return -1; + for (x=0,d=0; d<2 && src<end && isxdigit(n=tolower(*src)); x=(x<<4)|(n>='0' && n<='9' ? n-'0' : 10+(n-'a')),++d,++src); + if (d==0) return -1; + if (dst) *dst++=x; + ++decoded; + if (src==end) return decoded; + if (*src==' ' || *src=='\t' || *src=='\n') + while (*src==' ' || *src=='\t' || *src=='\n') ++src; + else + return -1; } - return decoded; +while (src<end); +return decoded; } /************************************************* -* Decode encoded-character string * +* Decode unicode-encoded-character string * *************************************************/ /* Encoding definition: - unicode-hex-seq = unicode-hex *(WSP unicode-hex) - unicode-hex = 1*6HEXDIG + blank = SP / TAB / CRLF + unicode-hex-seq = *blank unicode-hex *(blank unicode-hex) *blank + unicode-hex = 1*HEXDIG It is an error for a script to use a hexadecimal value that isn't in either the range 0 to D7FF or the range E000 to 10FFFF. + At this time, strings are already scanned, thus the CRLF is converted + to the internally used \n (should RFC_EOL have been used). + Arguments: src points to a unicode-hex-seq end points to its end @@ -1265,69 +1271,61 @@ static int unicode_decode(uschar *src, uschar *end, uschar *dst) { int decoded=0; -while (src<end) +while (*src==' ' || *src=='\t' || *src=='\n') ++src; +do { - int c,n5,n4,n3,n2,n1,n0; + uschar *hex_seq; + int c,d,n; - if (*src==' ' || *src=='\t') ++src; - else if ( - (src+5)<end - && isxdigit(n5=tolower(*src)) - && isxdigit(n4=tolower(*(src+1))) - && isxdigit(n3=tolower(*(src+2))) - && isxdigit(n2=tolower(*(src+3))) - && isxdigit(n1=tolower(*(src+4))) - && isxdigit(n0=tolower(*(src+5))) - ) + unicode_hex: + for (hex_seq=src; src<end && *src=='0'; ++src); + for (c=0,d=0; d<7 && src<end && isxdigit(n=tolower(*src)); c=(c<<4)|(n>='0' && n<='9' ? n-'0' : 10+(n-'a')),++d,++src); + if (src==hex_seq) return -1; + if (d==7 || (!((c>=0 && c<=0xd7ff) || (c>=0xe000 && c<=0x10ffff)))) return -2; + if (c<128) { - n5=(n5>='0' && n5<='9') ? n5-'0' : 10+(n5-'a'); - n4=(n4>='0' && n4<='9') ? n4-'0' : 10+(n4-'a'); - n3=(n3>='0' && n3<='9') ? n3-'0' : 10+(n3-'a'); - n2=(n2>='0' && n2<='9') ? n2-'0' : 10+(n2-'a'); - n1=(n1>='0' && n1<='9') ? n1-'0' : 10+(n1-'a'); - n0=(n0>='0' && n0<='9') ? n0-'0' : 10+(n0-'a'); - c=(n5<<24)|(n4<<16)|(n3<<12)|(n2<<8)|(n1<<4)|n0; - if (!((c>=0 && c<=0xd7ff) || (c>=0xe000 && c<=0x10ffff))) return -2; - if (c<128) - { - if (dst) *dst++=c; - ++decoded; - } - else if (c>=0x80 && c<=0x7ff) - { - if (dst) - { - *dst++=192+(c>>6); - *dst++=128+(c&0x3f); - } - decoded+=2; - } - else if (c>=0x800 && c<=0xffff) - { - if (dst) - { - *dst++=224+(c>>12); - *dst++=128+((c>>6)&0x3f); - *dst++=128+(c&0x3f); - } - decoded+=3; - } - else if (c>=0x10000 && c<=0x1fffff) - { - if (dst) - { - *dst++=240+(c>>18); - *dst++=128+((c>>10)&0x3f); - *dst++=128+((c>>6)&0x3f); - *dst++=128+(c&0x3f); - } - decoded+=4; - } - src+=6; + if (dst) *dst++=c; + ++decoded; + } + else if (c>=0x80 && c<=0x7ff) + { + if (dst) + { + *dst++=192+(c>>6); + *dst++=128+(c&0x3f); + } + decoded+=2; + } + else if (c>=0x800 && c<=0xffff) + { + if (dst) + { + *dst++=224+(c>>12); + *dst++=128+((c>>6)&0x3f); + *dst++=128+(c&0x3f); + } + decoded+=3; + } + else if (c>=0x10000 && c<=0x1fffff) + { + if (dst) + { + *dst++=240+(c>>18); + *dst++=128+((c>>10)&0x3f); + *dst++=128+((c>>6)&0x3f); + *dst++=128+(c&0x3f); + } + decoded+=4; + } + if (*src==' ' || *src=='\t' || *src=='\n') + { + while (*src==' ' || *src=='\t' || *src=='\n') ++src; + if (src==end) return decoded; + goto unicode_hex; } - else return -1; } - return decoded; +while (src<end); +return decoded; } @@ -1360,7 +1358,7 @@ while (src<end) uschar *brace; if ( - Ustrncmp(src,CUS "${hex:",6)==0 + strncmpic(src,US "${hex:",6)==0 && (brace=Ustrchr(src+6,'}'))!=(uschar*)0 && (hex_decode(src+6,brace,(uschar*)0))>=0 ) @@ -1369,7 +1367,7 @@ while (src<end) src=brace+1; } else if ( - Ustrncmp(src,CUS "${unicode:",10)==0 + strncmpic(src,US "${unicode:",10)==0 && (brace=Ustrchr(src+10,'}'))!=(uschar*)0 ) { @@ -1584,7 +1582,7 @@ static int parse_identifier(struct Sieve *filter, const uschar *id) { size_t idlen=Ustrlen(id); - if (Ustrncmp(filter->pc,id,idlen)==0) + if (strncmpic(US filter->pc,US id,idlen)==0) { uschar next=filter->pc[idlen]; diff --git a/src/src/version.c b/src/src/version.c index 70cf65a7b..969132e98 100644 --- a/src/src/version.c +++ b/src/src/version.c @@ -1,4 +1,4 @@ -/* $Cambridge: exim/src/src/version.c,v 1.21 2007/01/15 15:59:22 ph10 Exp $ */ +/* $Cambridge: exim/src/src/version.c,v 1.22 2007/04/19 13:19:06 ph10 Exp $ */ /************************************************* * Exim - an Internet mail transport agent * @@ -12,7 +12,7 @@ #include "exim.h" -#define THIS_VERSION "4.67" +#define THIS_VERSION "4.68" /* The header file cnumber.h contains a single line containing the |