Thank your very much for your answer! The result of GOOGLE_PROTOBUF_VERIFY_VERSION; FeedMessage fm; LOG(INFO) << fm.GetDescriptor()->DebugString();
in both applications is ==13935== Invalid read of size 8 ==13935== at 0x510EFF2: google::protobuf::DescriptorPool::FindFileByName(std::string const&) const (in /usr/lib/x86_64-linux-gnu/libprotobuf.so.8.0.0) ==13935== by 0x47F3F4: transit_realtime::protobuf_AssignDesc_gtfs_2drealtime_2eproto() (in /home/patrick/secure/repo/trajserver-internal2/build/trajhttpserv) ==13935== by 0x50E22CF: google::protobuf::internal::FunctionClosure0::Run() (in /usr/lib/x86_64-linux-gnu/libprotobuf.so.8.0.0) ==13935== by 0x50E24F0: google::protobuf::GoogleOnceInitImpl(long*, google::protobuf::Closure*) (in /usr/lib/x86_64-linux-gnu/libprotobuf.so.8.0.0) ==13935== by 0x474464: transit_realtime::FeedMessage::GetMetadata() const (in /home/patrick/secure/repo/trajserver-internal2/build/trajhttpserv) ==13935== by 0x442D40: GtfsRealTimeReader::getTripUpdates() (in /home/patrick/secure/repo/trajserver-internal2/build/trajhttpserv) ==13935== by 0x4824AB: updateRealtimeReaders(std::vector<GtfsRealTimeReader, std::allocator<GtfsRealTimeReader> >*, unsigned int) (in /home/patrick/secure/repo/trajserver-internal2/build/trajhttpserv) ==13935== Address 0x0 is not stack'd, malloc'd or (recently) free'd ==13935== [22/05/2014 19:55:47,646579] FATAL: CRASH HANDLED; Application has crashed due to [SIGSEGV] signal Am Donnerstag, 22. Mai 2014 19:47:21 UTC+2 schrieb Feng Xiao: > > Can you try if the following code can produce any meaningful results? I > suggest you try this once in your original binary and then create a simple > program calling the following code only (and only linking the .proto file > without anything else in your project). If both fail (segfault), it might > be a bug in protobuf generated code. If only the former fails, the problem > should be somewhere else in your project (memory corruption bugs most > likely). > > LOG(INFO) << fm.GetDescriptor()->DebugString(); > > Note that you shouldn't change the generated code. It won't work. > > > On Thu, May 22, 2014 at 9:28 AM, <[email protected] > <javascript:>>wrote: > >> I am still experiencing this problem. Any help is highly appreciated, I >> tried everything. >> >> The problem only occurs if bad data is fed to the parseFromString() >> function. The following code crashes with a segmentation fault if >> readBuffer contains bad data (currently, the content of >> http://www.google.com). If readBuffer contains well-formed GTFS-realtime >> data, everything works as expected: >> >> if (!(fm.ParseFromString(readBuffer))) { >> LOG(WARNING) << "Failed to parse realtime GTFS."; >> return; >> } >> >> This is the line in the gtfs-realtime.pb.cc (in method >> protobuf_AssignDesc_headers_2fprotobuf_2fgtfs_2drealtime_2eproto()) that >> causes the crash: >> >> const ::google::protobuf::FileDescriptor* file = >> ::google::protobuf::DescriptorPool::generated_pool()->FindFileByName( >> "headers/protobuf/gtfs-realtime.proto"); >> >> For some reason, it tries to read the original .proto file if bad data is >> received. I tried changing this line to an absolute path, but the problem >> persists. The gtfs-realtime.proto file resides in headers/protobuf. protoc >> is called like this: >> >> protoc -I=headers/protobuf --cpp_out=. >> headers/protobuf/gtfs-realtime.proto >> >> I tried several locations for -cpp_out, but it didnt help. >> >> This is the valgrind output after the crash: >> >> ==4015== Invalid read of size 8 >> ==4015== at 0x5108FF2: >> google::protobuf::DescriptorPool::FindFileByName(std::string const&) const >> (in /usr/lib/x86_64-linux-gnu/libprotobuf.so.8.0.0) >> ==4015== by 0x47F3F4: >> transit_realtime::protobuf_AssignDesc_gtfs_2drealtime_2eproto() (in >> /home/patrick/repos/trajserver/trajhttpserv) >> ==4015== by 0x50DC2CF: >> google::protobuf::internal::FunctionClosure0::Run() (in >> /usr/lib/x86_64-linux-gnu/libprotobuf.so.8.0.0) >> ==4015== by 0x50DC4F0: google::protobuf::GoogleOnceInitImpl(long*, >> google::protobuf::Closure*) (in >> /usr/lib/x86_64-linux-gnu/libprotobuf.so.8.0.0) >> ==4015== by 0x474444: transit_realtime::FeedMessage::GetMetadata() >> const (in /home/patrick/repos/trajserver/trajhttpserv) >> ==4015== by 0x513FF6F: google::protobuf::Message::GetTypeName() const >> (in /usr/lib/x86_64-linux-gnu/libprotobuf.so.8.0.0) >> ==4015== by 0x50EB090: ??? (in >> /usr/lib/x86_64-linux-gnu/libprotobuf.so.8.0.0) >> ==4015== by 0x50EB891: >> google::protobuf::MessageLite::ParseFromString(std::string const&) (in >> /usr/lib/x86_64-linux-gnu/libprotobuf.so.8.0.0) >> ==4015== by 0x442E83: GtfsRealTimeReader::getTripUpdates() (in >> /home/patrick/repos/trajserver/trajhttpserv) >> ==4015== by 0x4824AB: >> updateRealtimeReaders(std::vector<GtfsRealTimeReader, >> std::allocator<GtfsRealTimeReader> >*, unsigned int) (in >> /home/patrick/repos/trajserver/trajhttpserv) >> ==4015== Address 0x0 is not stack'd, malloc'd or (recently) free'd >> ==4015== >> [22/05/2014 15:21:02,241645] FATAL: CRASH HANDLED; Application has >> crashed due to [SIGSEGV] signal >> >> >> Again, this crash happens every time I try to parse some random string as >> a GTFS-realtime protobuf feed. >> >> I reproduced the segfault on three different machines: a Ubuntu 13.10 >> machine with libprotoc 2.4.1, a Ubuntu 14.04 machine with libprotoc 2.5.0 >> and a Debian machine with libprotoc 2.4.1. I tried different c++ version, >> Ii tried -O1, -O2, -O3, I tried fixing the gtfs-realtime.pb.cc line by >> hand, I played around with the protoc parameters, I compiled and installed >> libprotoc 2.5.0 by hand on all 3 machines, I tried parsing the feed from a >> stream and from a string, I created an application that only reads >> http://www.google.com and feeds it to parseFromString() function - the >> behaviour is always exactly the same: no problem on well-formed data, >> segfault on bad data. >> >> I am using the original gtfs-realtime.proto file from the GTFS realtime >> page. >> >> Anyone? >> >> >> Am Freitag, 2. Mai 2014 15:29:48 UTC+2 schrieb [email protected]: >> >>> Hi, >>> >>> I am using a straightforward C++ client to fetch GTFS-realtime feeds. >>> Feeds are read into a string with libcurl and than parsed: >>> >>> GOOGLE_PROTOBUF_VERIFY_VERSION; >>> FeedMessage fm; >>> >>> /** fetching realtime feed with libcurl into readBuffer **/ >>> >>> if (!fm.ParseFromString(readBuffer)) { // this line crashes >>> LOG(ERROR) << "Failed to parse realtime GTFS."; >>> return; >>> } >>> >>> I experience random segfault crashes during parsing. All of them oocure >>> while parsing a very specific feed. The segfault is caused by >>> >>> google::protobuf::DescriptorPool::FindFileByName >>> >>> Backtrace: >>> >>> Program received signal SIGSEGV, Segmentation fault. >>> #0 0x00007ffff7901f3e in >>> google::protobuf::DescriptorPool::FindFileByName(std::string >>> const&) const () from /usr/lib/libprotobuf.so.7 >>> #1 0x000000000047e045 in transit_realtime::protobuf_ >>> AssignDesc_headers_2fprotobuf_2fgtfs_2drealtime_2eproto() () at >>> headers/protobuf/gtfs-realtime.pb.cc:80 >>> #2 0x00007ffff7683400 in pthread_once () >>> at ../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_once.S:104 >>> #3 0x0000000000471593 in transit_realtime::FeedMessage::GetMetadata() >>> const >>> () at /usr/include/google/protobuf/stubs/once.h:115 >>> #4 0x00007ffff7932274 in google::protobuf::Message::GetTypeName() >>> const () >>> from /usr/lib/libprotobuf.so.7 >>> #5 0x00007ffff78e2f17 in ?? () from /usr/lib/libprotobuf.so.7 >>> #6 0x00007ffff78e3714 in >>> google::protobuf::MessageLite::ParseFromString(std::string >>> const&) () from /usr/lib/libprotobuf.so.7 >>> >>> >>> Since the segfaults are _always_ caused by the same feed, I strongly >>> suspect that it is bad data that causes the crash. The random nature of the >>> crashes could be explained by the feed returning a bad message every few >>> few hours. Nevertheless, for bad data, ParseFromString() should return >>> false, and not crash completely. >>> >>> I am using g++ 4.8.1 with -O3 -g -std=c++0x >>> protoc --version returns "libprotoc 2.4.1" >>> >>> Thanks for any help :) >>> >>> >>> >>> >>> >>> >>> -- >> You received this message because you are subscribed to the Google Groups >> "Protocol Buffers" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected] <javascript:>. >> To post to this group, send email to [email protected]<javascript:> >> . >> Visit this group at http://groups.google.com/group/protobuf. >> For more options, visit https://groups.google.com/d/optout. >> > > -- You received this message because you are subscribed to the Google Groups "Protocol Buffers" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/protobuf. For more options, visit https://groups.google.com/d/optout.
