From kmail-devel Thu Oct 30 14:16:19 2003 From: Stephan Kulow Date: Thu, 30 Oct 2003 14:16:19 +0000 To: kmail-devel Subject: [Bug 65615] kmail crashes with message: kmail: FATAL: q codec lies X-MARC-Message: https://marc.info/?l=kmail-devel&m=106752343805446 ------- You are receiving this mail because: ------- You are the assignee for the bug, or are watching the assignee. http://bugs.kde.org/show_bug.cgi?id=65615 coolo@kde.org changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |RESOLVED Resolution| |FIXED ------- Additional Comments From coolo@kde.org 2003-10-30 15:16 ------- Subject: kdepim/libkdenetwork CVS commit by coolo: I think, I found the reason for "FATAL: q codec lies about it's maxDecodedSizeFor" - well, the q coded lied about it's maxDecodedSizeFor. It took a diploma to figure that factories - but I managed to :) CCMAIL: 65615-done@bugs.kde.org CCMAIL: mutz@kde.org Marc: I think, the real bug (and the fact it happened that often on ppc) was in kmime_util.cpp, where one too many assumption about the signedness of char happens ;( M +29 -5 kmime_codec_qp.cpp 1.13 M +4 -20 kmime_codec_qp.h 1.5 --- kdepim/libkdenetwork/kmime_codec_qp.cpp #1.12:1.13 @@ -190,4 +190,18 @@ public: }; +// this doesn't access any member variables, so it can be defined static +// but then we can't call it from virtual functions +static int QuotedPrintableDecoder_maxDecodedSizeFor( int insize, bool withCRLF ) { + // all chars unencoded: + int result = insize; + // but maybe all of them are \n and we need to make them \r\n :-o + if ( withCRLF ) + result += insize; + + // there might be an accu plus escape + result += 2; + + return result; +} Encoder * QuotedPrintableCodec::makeEncoder( bool withCRLF ) const { @@ -199,4 +213,8 @@ Decoder * QuotedPrintableCodec::makeDeco } +int QuotedPrintableCodec::maxDecodedSizeFor( int insize, bool withCRLF ) const { + return QuotedPrintableDecoder_maxDecodedSizeFor(insize, withCRLF); +} + Encoder * Rfc2047QEncodingCodec::makeEncoder( bool withCRLF ) const { return new Rfc2047QEncodingEncoder( withCRLF ); @@ -207,4 +225,8 @@ Decoder * Rfc2047QEncodingCodec::makeDec } +int Rfc2047QEncodingCodec::maxDecodedSizeFor( int insize, bool withCRLF ) const { + return QuotedPrintableDecoder_maxDecodedSizeFor(insize, withCRLF); +} + Encoder * Rfc2231EncodingCodec::makeEncoder( bool withCRLF ) const { return new Rfc2047QEncodingEncoder( withCRLF, '%' ); @@ -215,4 +237,7 @@ Decoder * Rfc2231EncodingCodec::makeDeco } +int Rfc2231EncodingCodec::maxDecodedSizeFor( int insize, bool withCRLF ) const { + return QuotedPrintableDecoder_maxDecodedSizeFor(insize, withCRLF); +} /********************************************************/ --- kdepim/libkdenetwork/kmime_codec_qp.h #1.4:1.5 @@ -59,13 +59,5 @@ public: } - int maxDecodedSizeFor( int insize, bool withCRLF=false ) const { - // all chars unencoded: - int result = insize; - // but maybe all of them are \n and we need to make them \r\n :-o - if ( withCRLF ) - result += insize; - - return result; - } + int maxDecodedSizeFor( int insize, bool withCRLF=false ) const; Encoder * makeEncoder( bool withCRLF=false ) const; @@ -93,9 +85,5 @@ public: } - int maxDecodedSizeFor( int insize, bool withCRLF=false ) const { - (void)withCRLF; // keep compiler happy - // equally simple: nothing is encoded at all, so: - return insize; - } + int maxDecodedSizeFor( int insize, bool withCRLF=false ) const; Encoder * makeEncoder( bool withCRLF=false ) const; @@ -122,9 +110,5 @@ public: } - int maxDecodedSizeFor( int insize, bool withCRLF=false ) const { - (void)withCRLF; // keep compiler happy - // same as for "q" encoding: - return insize; - } + int maxDecodedSizeFor( int insize, bool withCRLF=false ) const; Encoder * makeEncoder( bool withCRLF=false ) const; _______________________________________________ KMail Developers mailing list kmail@mail.kde.org http://mail.kde.org/mailman/listinfo/kmail