Commit db21620a authored by Kathleen Brade's avatar Kathleen Brade
Browse files

Bug 19733: GETINFO response parser doesn't handle AF_UNIX entries.

When performing the local Tor check (which compares the configured
Firefox SOCKS proxy to the one reported by GETINFO net/listeners/socks),
correctly handle UNIX domain sockets as well as IPv6 addresses.
parent 808ed83b
Loading
Loading
Loading
Loading
+45 −13
Original line number Diff line number Diff line
@@ -2111,9 +2111,17 @@ function torbutton_local_tor_check()
    }
  }

  function removeBrackets(aStr)
  {
    // Remove enclosing square brackets if present.
    if (aStr.startsWith('[') && aStr.endsWith(']'))
      return aStr.substr(1, aStr.length - 2);

    return aStr;
  }

  // Sample response: net/listeners/socks="127.0.0.1:9149" "127.0.0.1:9150"
  // First, check for command argument prefix.
  resp = resp.toLowerCase();
  if (0 != resp.indexOf(kCmdArg + '=')) {
    logUnexpectedResponse();
    return false;
@@ -2122,6 +2130,11 @@ function torbutton_local_tor_check()
  // Retrieve configured proxy settings and check each listener against them.
  let socksAddr = m_tb_prefs.getCharPref("network.proxy.socks");
  let socksPort = m_tb_prefs.getIntPref("network.proxy.socks_port");
  let isSocket = socksAddr && (socksAddr.length > 2) &&
                 ('/' == socksAddr.charAt(0));
  if (!isSocket)
    socksAddr = removeBrackets(socksAddr);

  let addrArray = resp.substr(kCmdArg.length + 1).split(' ');
  let foundSocksListener = false;
  for (let i = 0; !foundSocksListener && (i < addrArray.length); ++i)
@@ -2133,14 +2146,32 @@ function torbutton_local_tor_check()
    if ((len > 2) && ('"' == addr.charAt(0)) && ('"' == addr.charAt(len - 1)))
      addr = addr.substring(1, len - 1);

    // Check against the configured proxy.
    let tokens = addr.split(':');
    if (tokens.length < 2)
    if (addr.startsWith("unix:"))
    {
      if (!isSocket)
        continue;

      // Check against the configured UNIX domain socket proxy. We expect to
      // find "/path" in socksAddr and we ignore socksPort. This matches what
      // is proposed for Firefox; see:
      // https://bugzilla.mozilla.org/show_bug.cgi?id=1211567
      let path = addr.substring(5);
      torbutton_log(2, "Tor socks listener (socket): " + path);
      foundSocksListener = (socksAddr == path);
    }
    else if (!isSocket)
    {
      // Check against the configured TCP proxy. We expect addr:port where addr
      // may be an IPv6 address; that is, it may contain colon characters.  Also,
      // we remove enclosing square brackets before comparing addresses because
      // tor requires them but Firefox does not.
      let idx = addr.lastIndexOf(':');
      if (idx < 0)
        logUnexpectedResponse();
      else
      {
      let torSocksAddr = tokens[0];
      let torSocksPort = parseInt(tokens[1], 10);
        let torSocksAddr = removeBrackets(addr.substring(0, idx));
        let torSocksPort = parseInt(addr.substring(idx + 1), 10);
        if ((torSocksAddr.length < 1) || isNaN(torSocksPort))
          logUnexpectedResponse();
        else
@@ -2152,6 +2183,7 @@ function torbutton_local_tor_check()
        }
      }
    }
  }

  return foundSocksListener;
} // torbutton_local_tor_check