summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorJohn Firebaugh <john.firebaugh@gmail.com>2015-06-17 16:56:37 -0700
committerJohn Firebaugh <john.firebaugh@gmail.com>2015-06-17 17:07:17 -0700
commite8aa6cd6ff4cf5f0f8b912ef5e15a07c1ec62739 (patch)
treea783c1017b3a7b77b3db44401960f973a8bf508d /scripts
parent66c415a267b52ced77d3953b5bbf3a36481c52e3 (diff)
downloadqtlocation-mapboxgl-e8aa6cd6ff4cf5f0f8b912ef5e15a07c1ec62739.tar.gz
Fix an order-of-operations issue with tileLoadingCompleteCallback
==7466== Invalid read of size 8 ==7466== at 0x5F1D0B: mbgl::TransformState::getAngle() const (transform_state.cpp:159) ==7466== by 0x700CD2: mbgl::Source::tileLoadingCompleteCallback(mbgl::TileID const&, mbgl::TransformState const&, bool) (source.cpp:574) ==7466== Address 0xf1d1508 is 56 bytes inside a block of size 120 free'd ==7466== at 0x4C2A4BC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==7466== by 0x70AD61: std::_Function_base::_Base_manager<std::_Bind<std::_Mem_fn<void (mbgl::Source::*)(mbgl::TileID const&, mbgl::TransformState const&, bool)> ()(mbgl::Source*, mbgl::TileID, mbgl::TransformState, bool)> >::_M_destroy(std::_Any_data&, std::integral_constant<bool, false>) (functional:1894) ==7466== by 0x7080EB: std::_Function_base::_Base_manager<std::_Bind<std::_Mem_fn<void (mbgl::Source::*)(mbgl::TileID const&, mbgl::TransformState const&, bool)> ()(mbgl::Source*, mbgl::TileID, mbgl::TransformState, bool)> >::_M_manager(std::_Any_data&, std::_Any_data const&, std::_Manager_operation) (functional:1918) ==7466== by 0x535033: _ZNSt8functionIFvvEEaSEDn (functional:2277) ==7466== by 0x56A3F5: mbgl::WorkTask::cancel() (work_task.cpp:34) ==7466== by 0x56146C: mbgl::WorkRequest::~WorkRequest() (work_request.cpp:13) ==7466== by 0x50C5E0: std::default_delete<mbgl::WorkRequest>::operator()(mbgl::WorkRequest*) const (unique_ptr.h:76) ==7466== by 0x50C411: std::unique_ptr<mbgl::WorkRequest, std::default_delete<mbgl::WorkRequest> >::reset(mbgl::WorkRequest*) (unique_ptr.h:344) ==7466== by 0x50C374: std::unique_ptr<mbgl::WorkRequest, std::default_delete<mbgl::WorkRequest> >::operator=(std::unique_ptr<mbgl::WorkRequest, std::default_delete<mbgl::WorkRequest> >&&) (unique_ptr.h:251) ==7466== by 0x743136: mbgl::TileData::reparse(mbgl::Worker&, std::function<void ()()>) (tile_data.cpp:89) ==7466== by 0x6FEA7C: mbgl::Source::handlePartialTile(mbgl::TileID const&, mbgl::Worker&) (source.cpp:250) ==7466== by 0x700338: mbgl::Source::update(mbgl::MapData&, mbgl::TransformState const&, mbgl::Style&, mbgl::GlyphAtlas&, mbgl::GlyphStore&, mbgl::SpriteAtlas&, mbgl::util::ptr<mbgl::Sprite>, mbgl::TexturePool&, bool) (source.cpp:438) ==7466== by 0x68C1A5: mbgl::Style::update(mbgl::MapData&, mbgl::TransformState const&, mbgl::TexturePool&) (style.cpp:82) ==7466== by 0x548F5C: (anonymous namespace)::MockMapContext::update() (resource_loading.cpp:51) ==7466== by 0x548FA3: (anonymous namespace)::MockMapContext::onTileDataChanged() (resource_loading.cpp:56) ==7466== by 0x68CDE4: mbgl::Style::emitTileDataChanged() (style.cpp:212) ==7466== by 0x68CBDB: mbgl::Style::onTileLoaded(bool) (style.cpp:191) ==7466== by 0x700F38: mbgl::Source::emitTileLoaded(bool) (source.cpp:595) ==7466== by 0x700CA2: mbgl::Source::tileLoadingCompleteCallback(mbgl::TileID const&, mbgl::TransformState const&, bool) (source.cpp:573) The invalid `TransformState::getAngle()` read comes from the following: the storage for `TransformState` is the [bound parameter in this callback](https://github.com/mapbox/mapbox-gl-native/blob/5e0775d276f9ea3652bae1 23c4e85cc05ae13bd5/src/mbgl/map/source.cpp#L292-292). The callback itself is copied into various lambda bindings and eventually winds up as the [after callback](https://github.com/mapbox/mapbox-gl-native/blob/5e0775d276f9ea3652bae1 23c4e85cc05ae13bd5/src/mbgl/map/tile_data.cpp#L89-89) for the worker task. On the way out, `tileLoadingCompleteCallback` gets called via this callback binding. It first does `emitTileLoaded`, which happens to cause [a _new_ work request to be queued](https://github.com/mapbox/mapbox-gl-native/blob/5e0775d276f9ea3652bae123 c4e85cc05ae13bd5/src/mbgl/map/source.cpp#L250-250). This cancels the in-progress work request, [by nulling-out the `after` callback](https://github.com/mapbox/mapbox-gl-native/blob/5e0775d276f9ea3652bae1 23c4e85cc05ae13bd5/src/mbgl/util/work_task.cpp#L34-34). But in fact, the after callback is still executing. The next thing it does is [call transformState.getAngle()](https://github.com/mapbox/mapbox-gl-native/blob/5e077 5d276f9ea3652bae123c4e85cc05ae13bd5/src/mbgl/map/source.cpp#L574), but the transformState is now gone.
Diffstat (limited to 'scripts')
0 files changed, 0 insertions, 0 deletions