Changeset 141727 in webkit
- Timestamp:
- Feb 3, 2013 6:16:45 PM (11 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r141721 r141727 1 2013-02-03 Gustavo Noronha Silva <gns@gnome.org> 2 3 [Soup] Do not use local variables for the client 4 https://bugs.webkit.org/show_bug.cgi?id=108714 5 6 Reviewed by Martin Robinson. 7 8 Covered by existing tests, refactoring code only. 9 10 We have had problems in the past with the client being destroyed or 11 changed inside a method or function, and we ended up with a stale 12 pointer, leading to crashes. This refactoring is an effort to minimize 13 the possibility of hitting that same issue in the future. 14 15 * platform/network/soup/ResourceHandleSoup.cpp: 16 (WebCore::redirectSkipCallback): no longer use a local variable to hold 17 the client. 18 (WebCore::wroteBodyDataCallback): ditto. 19 (WebCore::nextMultipartResponsePartCallback): ditto. 20 (WebCore::sendRequestCallback): ditto. 21 (WebCore::closeCallback): ditto. 22 (WebCore::readCallback): ditto. 23 1 24 2013-02-03 Kentaro Hara <haraken@chromium.org> 2 25 -
trunk/Source/WebCore/platform/network/soup/ResourceHandleSoup.cpp
r140836 r141727 525 525 gssize bytesSkipped = g_input_stream_read_finish(d->m_inputStream.get(), asyncResult, &error.outPtr()); 526 526 if (error) { 527 ResourceHandleClient* client = handle->client(); 528 client->didFail(handle.get(), ResourceError::genericIOError(error.get(), d->m_soupRequest.get())); 527 handle->client()->didFail(handle.get(), ResourceError::genericIOError(error.get(), d->m_soupRequest.get())); 529 528 cleanupSoupRequestOperation(handle.get()); 530 529 return; … … 553 552 return; 554 553 555 ResourceHandleClient* client = handle->client(); 556 client->didSendData(handle.get(), d->m_bodyDataSent, d->m_bodySize); 554 handle->client()->didSendData(handle.get(), d->m_bodyDataSent, d->m_bodySize); 557 555 } 558 556 … … 623 621 d->m_inputStream = adoptGRef(soup_multipart_input_stream_next_part_finish(d->m_multipartInputStream.get(), result, &error.outPtr())); 624 622 625 ResourceHandleClient* client = handle->client();626 623 if (error) { 627 client->didFail(handle.get(), ResourceError::httpError(d->m_soupMessage.get(), error.get(), d->m_soupRequest.get()));624 handle->client()->didFail(handle.get(), ResourceError::httpError(d->m_soupMessage.get(), error.get(), d->m_soupRequest.get())); 628 625 cleanupSoupRequestOperation(handle.get()); 629 626 return; … … 631 628 632 629 if (!d->m_inputStream) { 633 client->didFinishLoading(handle.get(), 0);630 handle->client()->didFinishLoading(handle.get(), 0); 634 631 cleanupSoupRequestOperation(handle.get()); 635 632 return; … … 640 637 d->m_response.updateFromSoupMessageHeaders(soup_multipart_input_stream_get_headers(d->m_multipartInputStream.get())); 641 638 642 client->didReceiveResponse(handle.get(), d->m_response);639 handle->client()->didReceiveResponse(handle.get(), d->m_response); 643 640 644 641 if (handle->cancelledOrClientless()) { … … 661 658 662 659 ResourceHandleInternal* d = handle->getInternal(); 663 ResourceHandleClient* client = handle->client();664 660 SoupMessage* soupMessage = d->m_soupMessage.get(); 665 661 … … 673 669 GRefPtr<GInputStream> inputStream = adoptGRef(soup_request_send_finish(d->m_soupRequest.get(), result, &error.outPtr())); 674 670 if (error) { 675 client->didFail(handle.get(), ResourceError::httpError(soupMessage, error.get(), d->m_soupRequest.get()));671 handle->client()->didFail(handle.get(), ResourceError::httpError(soupMessage, error.get(), d->m_soupRequest.get())); 676 672 cleanupSoupRequestOperation(handle.get()); 677 673 return; … … 710 706 } 711 707 712 client->didReceiveResponse(handle.get(), d->m_response);708 handle->client()->didReceiveResponse(handle.get(), d->m_response); 713 709 714 710 if (handle->cancelledOrClientless()) { … … 1319 1315 g_input_stream_close_finish(d->m_inputStream.get(), res, 0); 1320 1316 1321 ResourceHandleClient* client = handle->client(); 1322 if (client && loadingSynchronousRequest) 1323 client->didFinishLoading(handle.get(), 0); 1317 if (handle->client() && loadingSynchronousRequest) 1318 handle->client()->didFinishLoading(handle.get(), 0); 1324 1319 1325 1320 cleanupSoupRequestOperation(handle.get()); … … 1344 1339 gssize bytesRead = g_input_stream_read_finish(d->m_inputStream.get(), asyncResult, &error.outPtr()); 1345 1340 1346 ResourceHandleClient* client = handle->client();1347 1341 if (error) { 1348 client->didFail(handle.get(), ResourceError::genericIOError(error.get(), d->m_soupRequest.get()));1342 handle->client()->didFail(handle.get(), ResourceError::genericIOError(error.get(), d->m_soupRequest.get())); 1349 1343 cleanupSoupRequestOperation(handle.get()); 1350 1344 return; … … 1364 1358 // is a synchronous request, we wait until the closeCallback, because we don't 1365 1359 // want to halt the internal main loop before the input stream closes. 1366 if ( client&& !loadingSynchronousRequest) {1367 client->didFinishLoading(handle.get(), 0);1360 if (handle->client() && !loadingSynchronousRequest) { 1361 handle->client()->didFinishLoading(handle.get(), 0); 1368 1362 handle->setClient(0); // Unset the client so that we do not try to access th 1369 1363 // client in the closeCallback. … … 1376 1370 ASSERT(!d->m_response.isNull()); 1377 1371 1378 client->didReceiveData(handle.get(), d->m_buffer, bytesRead, bytesRead);1372 handle->client()->didReceiveData(handle.get(), d->m_buffer, bytesRead, bytesRead); 1379 1373 1380 1374 // didReceiveData may cancel the load, which may release the last reference.
Note: See TracChangeset
for help on using the changeset viewer.