Review Request: Fix read beyond stream end in rpp

Hamish Rodda rodda at kde.org
Thu Dec 3 07:13:25 UTC 2009


-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
http://reviewboard.kde.org/r/2315/
-----------------------------------------------------------

Review request for KDevelop.


Summary
-------

I encountered an invalid read whilst running kdevelop under valgrind.  The attached patch would seem to fix the issue, but I wanted to check if it was semantically correct before comitting (as we don't have an automated test for the preprocessor).

Valgrind error:
==25012== Thread 9:                                                                                                                                                                                                        
==25012== Invalid read of size 4                                                                                                                                                                                           
==25012==    at 0x2A0B8C17: rpp::Stream::operator==(char) const (pp-stream.h:103)                                                                                                                                          
==25012==    by 0x2A0B5FEC: rpp::pp_macro_expander::operator()(rpp::Stream&, rpp::Stream&) (pp-macro-expander.cpp:295)                                                                                                     
==25012==    by 0x2A0B7E9C: rpp::pp_macro_expander::operator()(rpp::Stream&, rpp::Stream&) (pp-macro-expander.cpp:568)                                                                                                     
==25012==    by 0x2A0B7E9C: rpp::pp_macro_expander::operator()(rpp::Stream&, rpp::Stream&) (pp-macro-expander.cpp:568)                                                                                                     
==25012==    by 0x2A0BFD53: rpp::pp::operator()(rpp::Stream&, rpp::Stream&) (pp-engine.cpp:261)                                                                                                                            
==25012==    by 0x2A0BF134: rpp::pp::processFileInternal(QString const&, QByteArray const&, QVector<unsigned int>&) (pp-engine.cpp:98)                                                                                     
==25012==    by 0x2A0BEFE5: rpp::pp::processFile(QString const&, QByteArray const&) (pp-engine.cpp:85)                                                                                                                     
==25012==    by 0x29E0EC89: PreprocessJob::run() (preprocessjob.cpp:233)                                                                                                                                                   
==25012==    by 0x29DFFC1C: CPPParseJob::parseForeground() (cppparsejob.cpp:203)                                                                                                                                           
==25012==    by 0x29E11385: PreprocessJob::sourceNeeded(QString&, rpp::Preprocessor::IncludeType, int, bool) (preprocessjob.cpp:565)                                                                                       
==25012==    by 0x2A0BF92D: rpp::pp::handle_include(bool, rpp::Stream&, rpp::Stream&) (pp-engine.cpp:193)                                                                                                                  
==25012==    by 0x2A0BF294: rpp::pp::handle_directive(unsigned int, rpp::Stream&, rpp::Stream&) (pp-engine.cpp:131)                                                                                                        
==25012==  Address 0x2e692ed8 is 0 bytes after a block of size 24 alloc'd                                                                                                                                                  
==25012==    at 0x4C25153: malloc (vg_replace_malloc.c:195)                                                                                                                                                                
==25012==    by 0x2A0B4820: QVector<unsigned int>::malloc(int) (qvector.h:382)                                                                                                                                             
==25012==    by 0x2A0B42FD: QVector<unsigned int>::QVector(int) (qvector.h:388)                                                                                                                                            
==25012==    by 0x2A0B302A: rpp::Stream::Stream(unsigned int const*, unsigned int, rpp::Anchor const&, rpp::LocationTable*) (pp-stream.cpp:92)                                                                             
==25012==    by 0x2A0B7E4D: rpp::pp_macro_expander::operator()(rpp::Stream&, rpp::Stream&) (pp-macro-expander.cpp:566)                                                                                                     
==25012==    by 0x2A0B7E9C: rpp::pp_macro_expander::operator()(rpp::Stream&, rpp::Stream&) (pp-macro-expander.cpp:568)                                                                                                     
==25012==    by 0x2A0BFD53: rpp::pp::operator()(rpp::Stream&, rpp::Stream&) (pp-engine.cpp:261)                                                                                                                            
==25012==    by 0x2A0BF134: rpp::pp::processFileInternal(QString const&, QByteArray const&, QVector<unsigned int>&) (pp-engine.cpp:98)                                                                                     
==25012==    by 0x2A0BEFE5: rpp::pp::processFile(QString const&, QByteArray const&) (pp-engine.cpp:85)                                                                                                                     
==25012==    by 0x29E0EC89: PreprocessJob::run() (preprocessjob.cpp:233)                                                                                                                                                   
==25012==    by 0x29DFFC1C: CPPParseJob::parseForeground() (cppparsejob.cpp:203)                                                                                                                                           
==25012==    by 0x29E11385: PreprocessJob::sourceNeeded(QString&, rpp::Preprocessor::IncludeType, int, bool) (preprocessjob.cpp:565)


This addresses bugs 214298 and potentially.
    https://bugs.kde.org/show_bug.cgi?id=214298
    https://bugs.kde.org/show_bug.cgi?id=potentially


Diffs
-----

  trunk/extragear/sdk/kdevelop/languages/cpp/parser/rpp/pp-macro-expander.cpp 1056447 

Diff: http://reviewboard.kde.org/r/2315/diff


Testing
-------

I executed 'pp' on each test file, which appeared to work.  I haven't yet run the same full execution of kdevelop under valgrind with the change to confirm that it works.


Thanks,

Hamish





More information about the KDevelop-devel mailing list