electron: 3.0 regression: crash on exit after https tunneling through a proxy requiring negotiate auth

  • Output of node_modules/.bin/electron --version: v3.0.0-beta.8 x86
  • Operating System (Platform and Version): win7 sp1 x64 & x86
  • Output of node_modules/.bin/electron --version on last known working Electron version (if applicable): v2.0.8

Expected Behavior no crash

Actual behavior crash after calling app.exit()

To Reproduce

required to repro:
  • a proxy
  • requiring negotiate auth (no auth and basic seem to be ok)
  • must tunnel https through it
run (substitute proxy host and creds in the command and script)
electron --proxy-server=proxyhost:8080 proxy-crash.js
proxy-crash.js
'use strict';

const {app, BrowserWindow, session} = require('electron'),
      OFFSCREEN = true;

let win;

if (OFFSCREEN)
  app.disableHardwareAcceleration();

app.on('ready', async () => {

  win = new BrowserWindow({
    width: 1440,
    height: 900,
    useContentSize: true,
    show: !OFFSCREEN,
    webPreferences: {
      nodeIntegration: false,
      partition: 'memory_partition_1',
      offscreen: OFFSCREEN
    },
  });

  if (OFFSCREEN) {
    win.webContents.setFrameRate(1);
    win.webContents.stopPainting();
  }


  win.webContents.on('did-start-navigation', (event, url, isInPlace, isMainFrame, frameProcessId, frameRoutingId) => {
    if (isMainFrame && !isInPlace)
      log('did-start-navigation: %s\n', url);
  });

  win.webContents.on('did-navigate', (event, url, httpResponseCode, httpStatusText) => {
    log('did-navigate: %i %s\n', httpResponseCode, url);
  });

  win.webContents.on('did-fail-load', (event, errorCode, errorDescription, validatedURL, isMainFrame, frameProcessId, frameRoutingId) => {
    if (isMainFrame)
      log('did-fail-load:\n%O\n', {errorCode, errorDescription, validatedURL});
  });

  win.webContents.on('did-finish-load', event => {
    log('did-finish-load: %s\n', win.webContents.getURL());
  });

  win.webContents.on('did-start-loading', event => {
    log('did-start-loading\n');
  });

  win.webContents.on('did-stop-loading', event => {
    log('did-stop-loading: %s\n', win.webContents.getURL());
    if (OFFSCREEN)
      setTimeout(closeWindow);
      //exit();
  });

  win.webContents.on('login', (event, request, authInfo, callback) => {
    log('webContents.login:\n%O\n,', {...request, ...authInfo});

    if (authInfo.isProxy)
      callback('proxy_user', 'proxy_pass');

  });

  win.on('closed', () => {
    log('win.closed\n');
  });

  win.loadURL('https://www.google.com/');

});

app.on('window-all-closed', () => {
  log('app.window-all-closed: scheduling exit\n');
  win = null;
  setTimeout(exit, 3000);
});



function closeWindow() {
  log('closing window\n');
  win.destroy();
  win = null;
}

function exit() {
  log('exiting\n');
  app.exit();
}

function log(msg, ...args) {
  console.log(`[${new Date().toISOString()}] ${msg}`, ...args);
}

Additional Information

console.log
[2018-08-31T21:42:25.059Z] did-start-loading

[2018-08-31T21:42:25.061Z] did-start-navigation: https://www.google.com/

[2018-08-31T21:42:25.659Z] webContents.login:
{ headers:
   { Accept:
      'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
     'Upgrade-Insecure-Requests': '1',
     'User-Agent':
      'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Electron/3.0.0-beta.8 Safari/537.36' },
  method: 'GET',
  referrer: '',
  url: 'https://www.google.com/',
  isProxy: true,
  scheme: 'negotiate',
  host: 'proxyhost',
  port: 8080,
  realm: '' }
,
[2018-08-31T21:42:25.911Z] did-navigate: 200 https://www.google.com/

[2018-08-31T21:42:26.331Z] did-finish-load: https://www.google.com/

[2018-08-31T21:42:26.333Z] did-stop-loading: https://www.google.com/

[2018-08-31T21:42:26.337Z] closing window

[2018-08-31T21:42:26.341Z] app.window-all-closed: scheduling exit

[2018-08-31T21:42:26.342Z] win.closed

[2018-08-31T21:42:29.343Z] exiting

crash happens after app.exit, not on window close

Unhandled exception at 0x00002928 in electron.exe: 0xC0000005: Access violation executing location 0x00002928
stack trace
wininet.dll!76457475()
[Inline Frame] electron.exe!std::default_delete<net::HttpAuthHandler>::operator()(net::HttpAuthHandler *) Line 1999
	at c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.11.25503\include\memory(1999)
[Inline Frame] electron.exe!std::unique_ptr<net::HttpAuthHandler,std::default_delete<net::HttpAuthHandler> >::{dtor}() Line 2203
	at c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.11.25503\include\memory(2203)
electron.exe!net::HttpAuthController::~HttpAuthController() Line 143
	at c:\projects\libchromiumcontent-wqq1s\src\net\http\http_auth_controller.cc(143)
electron.exe!net::HttpAuthController::`scalar deleting destructor'(unsigned int)
[Inline Frame] electron.exe!base::RefCounted<ppapi::Resource,base::DefaultRefCountedTraits<ppapi::Resource> >::DeleteInternal(const ppapi::Resource *) Line 334
	at c:\projects\libchromiumcontent-wqq1s\src\base\memory\ref_counted.h(334)
[Inline Frame] electron.exe!base::DefaultRefCountedTraits<ppapi::Resource>::Destruct(const ppapi::Resource *) Line 300
	at c:\projects\libchromiumcontent-wqq1s\src\base\memory\ref_counted.h(300)
[Inline Frame] electron.exe!base::RefCounted<ppapi::Resource,base::DefaultRefCountedTraits<ppapi::Resource> >::Release() Line 323
	at c:\projects\libchromiumcontent-wqq1s\src\base\memory\ref_counted.h(323)
electron.exe!scoped_refptr<ppapi::proxy::FileRefResource>::Release(ppapi::proxy::FileRefResource * ptr=0x09f07100) Line 281
	at c:\projects\libchromiumcontent-wqq1s\src\base\memory\scoped_refptr.h(281)
[Inline Frame] electron.exe!scoped_refptr<net::HttpAuthController>::{dtor}() Line 208
	at c:\projects\libchromiumcontent-wqq1s\src\base\memory\scoped_refptr.h(208)
electron.exe!net::HttpProxyClientSocket::~HttpProxyClientSocket() Line 62
	at c:\projects\libchromiumcontent-wqq1s\src\net\http\http_proxy_client_socket.cc(62)
electron.exe!net::HttpProxyClientSocket::`scalar deleting destructor'(unsigned int)
[Inline Frame] electron.exe!std::default_delete<net::ProxyClientSocket>::operator()(net::ProxyClientSocket *) Line 1999
	at c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.11.25503\include\memory(1999)
[Inline Frame] electron.exe!std::unique_ptr<net::ProxyClientSocket,std::default_delete<net::ProxyClientSocket> >::{dtor}() Line 2203
	at c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.11.25503\include\memory(2203)
electron.exe!net::HttpProxyClientSocketWrapper::~HttpProxyClientSocketWrapper() Line 102
	at c:\projects\libchromiumcontent-wqq1s\src\net\http\http_proxy_client_socket_wrapper.cc(102)
electron.exe!net::HttpProxyClientSocketWrapper::`scalar deleting destructor'(unsigned int)
[Inline Frame] electron.exe!std::default_delete<net::StreamSocket>::operator()(net::StreamSocket *) Line 1999
	at c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.11.25503\include\memory(1999)
[Inline Frame] electron.exe!std::unique_ptr<net::StreamSocket,std::default_delete<net::StreamSocket> >::reset(net::StreamSocket *) Line 2238
	at c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.11.25503\include\memory(2238)
electron.exe!net::internal::ClientSocketPoolBaseHelper::ReleaseSocket(const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & group_name={...}, std::unique_ptr<net::StreamSocket,std::default_delete<net::StreamSocket> > socket={...}, int id=0) Line 872
	at c:\projects\libchromiumcontent-wqq1s\src\net\socket\client_socket_pool_base.cc(872)
[Inline Frame] electron.exe!net::ClientSocketPoolBase<net::HttpProxySocketParams>::ReleaseSocket(const std::basic_string<char,std::char_traits<char>,std::allocator<char> > &) Line 829
	at c:\projects\libchromiumcontent-wqq1s\src\net\socket\client_socket_pool_base.h(829)
electron.exe!net::HttpProxyClientSocketPool::ReleaseSocket(const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & group_name={...}, std::unique_ptr<net::StreamSocket,std::default_delete<net::StreamSocket> > socket={...}, int id=0) Line 356
	at c:\projects\libchromiumcontent-wqq1s\src\net\http\http_proxy_client_socket_pool.cc(356)
electron.exe!net::ClientSocketHandle::ResetInternal(bool cancel=true) Line 65
	at c:\projects\libchromiumcontent-wqq1s\src\net\socket\client_socket_handle.cc(65)
electron.exe!net::ClientSocketHandle::Reset() Line 47
	at c:\projects\libchromiumcontent-wqq1s\src\net\socket\client_socket_handle.cc(47)
electron.exe!net::ClientSocketHandle::~ClientSocketHandle() Line 32
	at c:\projects\libchromiumcontent-wqq1s\src\net\socket\client_socket_handle.cc(32)
electron.exe!std::default_delete<net::ClientSocketHandle>::operator()(net::ClientSocketHandle * _Ptr=0x069613b0) Line 1999
	at c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.11.25503\include\memory(1999)
[Inline Frame] electron.exe!std::unique_ptr<net::ClientSocketHandle,std::default_delete<net::ClientSocketHandle> >::{dtor}() Line 2203
	at c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.11.25503\include\memory(2203)
electron.exe!net::SSLClientSocketImpl::~SSLClientSocketImpl() Line 473
	at c:\projects\libchromiumcontent-wqq1s\src\net\socket\ssl_client_socket_impl.cc(473)
electron.exe!net::SSLClientSocketImpl::`scalar deleting destructor'(unsigned int)
[Inline Frame] electron.exe!std::default_delete<net::StreamSocket>::operator()(net::StreamSocket *) Line 1999
	at c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.11.25503\include\memory(1999)
[Inline Frame] electron.exe!std::unique_ptr<net::StreamSocket,std::default_delete<net::StreamSocket> >::reset(net::StreamSocket *) Line 2238
	at c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.11.25503\include\memory(2238)
electron.exe!net::internal::ClientSocketPoolBaseHelper::ReleaseSocket(const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & group_name={...}, std::unique_ptr<net::StreamSocket,std::default_delete<net::StreamSocket> > socket={...}, int id=0) Line 872
	at c:\projects\libchromiumcontent-wqq1s\src\net\socket\client_socket_pool_base.cc(872)
[Inline Frame] electron.exe!net::ClientSocketPoolBase<net::SSLSocketParams>::ReleaseSocket(const std::basic_string<char,std::char_traits<char>,std::allocator<char> > &) Line 829
	at c:\projects\libchromiumcontent-wqq1s\src\net\socket\client_socket_pool_base.h(829)
electron.exe!net::SSLClientSocketPool::ReleaseSocket(const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & group_name={...}, std::unique_ptr<net::StreamSocket,std::default_delete<net::StreamSocket> > socket={...}, int id=0) Line 666
	at c:\projects\libchromiumcontent-wqq1s\src\net\socket\ssl_client_socket_pool.cc(666)
electron.exe!net::ClientSocketHandle::ResetInternal(bool cancel=true) Line 65
	at c:\projects\libchromiumcontent-wqq1s\src\net\socket\client_socket_handle.cc(65)
electron.exe!net::ClientSocketHandle::Reset() Line 47
	at c:\projects\libchromiumcontent-wqq1s\src\net\socket\client_socket_handle.cc(47)
electron.exe!net::ClientSocketHandle::~ClientSocketHandle() Line 32
	at c:\projects\libchromiumcontent-wqq1s\src\net\socket\client_socket_handle.cc(32)
electron.exe!std::default_delete<net::ClientSocketHandle>::operator()(net::ClientSocketHandle * _Ptr=0x06961060) Line 1999
	at c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.11.25503\include\memory(1999)
[Inline Frame] electron.exe!std::unique_ptr<net::ClientSocketHandle,std::default_delete<net::ClientSocketHandle> >::{dtor}() Line 2203
	at c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.11.25503\include\memory(2203)
electron.exe!net::SpdySession::~SpdySession() Line 848
	at c:\projects\libchromiumcontent-wqq1s\src\net\spdy\chromium\spdy_session.cc(848)
electron.exe!net::SpdySession::`scalar deleting destructor'(unsigned int)
[Inline Frame] electron.exe!std::default_delete<net::SpdySession>::operator()(net::SpdySession *) Line 1999
	at c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.11.25503\include\memory(1999)
[Inline Frame] electron.exe!std::unique_ptr<net::SpdySession,std::default_delete<net::SpdySession> >::{dtor}() Line 2203
	at c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.11.25503\include\memory(2203)
electron.exe!net::SpdySessionPool::RemoveUnavailableSession(const base::WeakPtr<net::SpdySession> & unavailable_session) Line 312
	at c:\projects\libchromiumcontent-wqq1s\src\net\spdy\chromium\spdy_session_pool.cc(312)
electron.exe!net::SpdySessionPool::~SpdySessionPool() Line 87
	at c:\projects\libchromiumcontent-wqq1s\src\net\spdy\chromium\spdy_session_pool.cc(87)
electron.exe!net::HttpNetworkSession::~HttpNetworkSession() Line 277
	at c:\projects\libchromiumcontent-wqq1s\src\net\http\http_network_session.cc(277)
electron.exe!net::HttpNetworkSession::`scalar deleting destructor'(unsigned int)
[Inline Frame] electron.exe!std::default_delete<net::HttpNetworkSession>::operator()(net::HttpNetworkSession *) Line 1999
	at c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.11.25503\include\memory(1999)
[Inline Frame] electron.exe!std::unique_ptr<net::HttpNetworkSession,std::default_delete<net::HttpNetworkSession> >::reset(net::HttpNetworkSession *) Line 2238
	at c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.11.25503\include\memory(2238)
electron.exe!brightray::URLRequestContextGetter::NotifyContextShuttingDown(std::unique_ptr<brightray::ResourceContext,std::default_delete<brightray::ResourceContext> > resource_context={...}) Line 192
	at c:\projects\electron-39ng6\brightray\browser\url_request_context_getter.cc(192)
[Inline Frame] electron.exe!base::internal::FunctorTraits<void (__thiscall brightray::URLRequestContextGetter::*)(std::unique_ptr<brightray::ResourceContext,std::default_delete<brightray::ResourceContext> >),void>::Invoke(void(brightray::URLRequestContextGetter::*)(std::unique_ptr<brightray::ResourceContext,std::default_delete<brightray::ResourceContext> >) method=0x00340aa0, brightray::URLRequestContextGetter * &&) Line 447
	at c:\projects\electron-39ng6\vendor\download\libchromiumcontent\src\base\bind_internal.h(447)
[Inline Frame] electron.exe!base::internal::InvokeHelper<0,void>::MakeItSo(void(brightray::URLRequestContextGetter::*)(std::unique_ptr<brightray::ResourceContext,std::default_delete<brightray::ResourceContext> >) &&) Line 530
	at c:\projects\electron-39ng6\vendor\download\libchromiumcontent\src\base\bind_internal.h(530)
[Inline Frame] electron.exe!base::internal::Invoker<base::internal::BindState<void (__thiscall brightray::URLRequestContextGetter::*)(std::unique_ptr<brightray::ResourceContext,std::default_delete<brightray::ResourceContext> >),base::internal::RetainedRefWrapper<brightray::URLRequestContextGetter>,std::unique_ptr<brightray::ResourceContext,std::default_delete<brightray::ResourceContext> > >,void __cdecl(void)>::RunImpl(void(brightray::URLRequestContextGetter::*)(std::unique_ptr<brightray::ResourceContext,std::default_delete<brightray::ResourceContext> >) &&) Line 604
	at c:\projects\electron-39ng6\vendor\download\libchromiumcontent\src\base\bind_internal.h(604)
electron.exe!base::internal::Invoker<base::internal::BindState<void (__thiscall brightray::URLRequestContextGetter::*)(std::unique_ptr<brightray::ResourceContext,std::default_delete<brightray::ResourceContext> >),base::internal::RetainedRefWrapper<brightray::URLRequestContextGetter>,std::unique_ptr<brightray::ResourceContext,std::default_delete<brightray::ResourceContext> > >,void __cdecl(void)>::RunOnce(base::internal::BindStateBase * base=0x09e93bf0) Line 576
	at c:\projects\electron-39ng6\vendor\download\libchromiumcontent\src\base\bind_internal.h(576)
[Inline Frame] electron.exe!base::OnceCallback<void __cdecl(void)>::Run() Line 95
	at c:\projects\electron-39ng6\vendor\download\libchromiumcontent\src\base\callback.h(95)
electron.exe!base::debug::TaskAnnotator::RunTask(const char * queue_function=0x02fda88c, base::PendingTask * pending_task=0x0728fa50) Line 61
	at c:\projects\libchromiumcontent-wqq1s\src\base\debug\task_annotator.cc(61)
[Inline Frame] electron.exe!base::internal::IncomingTaskQueue::RunTask(base::PendingTask *) Line 124
	at c:\projects\libchromiumcontent-wqq1s\src\base\message_loop\incoming_task_queue.cc(124)
electron.exe!base::MessageLoop::RunTask(base::PendingTask * pending_task=0x0728fa50) Line 396
	at c:\projects\libchromiumcontent-wqq1s\src\base\message_loop\message_loop.cc(396)
electron.exe!base::MessageLoop::DeferOrRunPendingTask(base::PendingTask pending_task={...}) Line 407
	at c:\projects\libchromiumcontent-wqq1s\src\base\message_loop\message_loop.cc(407)
electron.exe!base::MessageLoop::DoWork() Line 451
	at c:\projects\libchromiumcontent-wqq1s\src\base\message_loop\message_loop.cc(451)
electron.exe!base::MessagePumpForIO::DoRunLoop() Line 475
	at c:\projects\libchromiumcontent-wqq1s\src\base\message_loop\message_pump_win.cc(475)
electron.exe!base::MessagePumpWin::Run(base::MessagePump::Delegate * delegate=0x0374a520) Line 58
	at c:\projects\libchromiumcontent-wqq1s\src\base\message_loop\message_pump_win.cc(58)
electron.exe!base::RunLoop::Run() Line 139
	at c:\projects\libchromiumcontent-wqq1s\src\base\run_loop.cc(139)
electron.exe!base::Thread::Run(base::RunLoop * run_loop=0x0728fbcc) Line 256
	at c:\projects\libchromiumcontent-wqq1s\src\base\threading\thread.cc(256)
electron.exe!content::BrowserThreadImpl::IOThreadRun(base::RunLoop * run_loop=0x0728fbcc) Line 234
	at c:\projects\libchromiumcontent-wqq1s\src\content\browser\browser_thread_impl.cc(234)
electron.exe!content::BrowserThreadImpl::Run(base::RunLoop * run_loop=0x0728fbcc) Line 260
	at c:\projects\libchromiumcontent-wqq1s\src\content\browser\browser_thread_impl.cc(260)
electron.exe!base::Thread::ThreadMain() Line 341
	at c:\projects\libchromiumcontent-wqq1s\src\base\threading\thread.cc(341)
electron.exe!base::`anonymous namespace'::ThreadFunc(void * params=0x068f8ab8) Line 93
	at c:\projects\libchromiumcontent-wqq1s\src\base\threading\platform_thread_win.cc(93)
kernel32.dll!@BaseThreadInitThunk@12()
ntdll.dll!___RtlUserThreadStart@8()
ntdll.dll!__RtlUserThreadStart@8()

About this issue

  • Original URL
  • State: closed
  • Created 6 years ago
  • Reactions: 1
  • Comments: 22 (21 by maintainers)

Most upvoted comments

Thanks for confirming, backporting https://github.com/electron/electron/pull/14656 should fix in this case. I will do it sometime this week, if anyone wants to work on it before then, ping me. The entire PR is not needed only parts of it.

@zcbenz Would like to point out that negotiate authenticating proxy is the most common type in windows corporate environments (that have proxies) and https is the most likely content that would be loaded through it and one can’t just opt out of the proxy, so this would seem like a high severity issue that should block 3.0