X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=src%2Fsrc%2Fsieve.c;h=e243f653c3433792358e00f1b88a3301d67840e3;hb=7b3a77e5b3464fa2533bd82f644c9145c1f11f71;hp=56b00027222ec9ec5e8f3c7238edf54cff3ecd01;hpb=a43a27c5e355a06131c36e68a63a0609b1da8307;p=exim.git 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='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='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='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=0 ) @@ -1369,7 +1367,7 @@ while (srcpc,id,idlen)==0) + if (strncmpic(US filter->pc,US id,idlen)==0) { uschar next=filter->pc[idlen];