phacility/phabricator · error · Exception

%s subprocess exited before emitting a protocol frame.

Error message

%s subprocess exited before emitting a protocol frame.

What it means

identifyRepository() launches 'svnserve -t' (sudo'd to the daemon user) just to capture the server greeting frame; if the exec channel closes before any frame arrives, the subprocess died instantly. This is almost always environmental: svnserve is not installed, not on the PATH the SSH session exposes, or crashes immediately as the executing user.

Source

Thrown at src/applications/diffusion/ssh/DiffusionSubversionServeSSHWorkflow.php:84

      $exec_message = $exec_channel->read();
      if ($exec_message !== null) {
        $messages = $exec_protocol->writeData($exec_message);
        if ($messages) {
          $message = head($messages);
          $raw = $message['raw'];

          // Write the greeting frame to the client.
          $io_channel->write($raw);

          // Kill the subprocess.
          $future->resolveKill();
          break;
        }
      }

      if (!$exec_channel->isOpenForReading()) {
        throw new Exception(
          pht(
            '%s subprocess exited before emitting a protocol frame.',
            'svnserve'));
      }
    }

    $io_protocol = new DiffusionSubversionWireProtocol();
    while (true) {
      PhutilChannel::waitForAny(array($io_channel));
      $io_channel->update();

      $in_message = $io_channel->read();
      if ($in_message !== null) {
        $this->peekBuffer .= $in_message;
        if (strlen($this->peekBuffer) > (1024 * 1024)) {
          throw new Exception(
            pht(
              'Client transmitted more than 1MB of data without transmitting '.

View on GitHub (pinned to 5720a38cfe)

Solutions

  1. Install the subversion server package and confirm 'svnserve --version' runs
  2. Add the svnserve binary's directory to the 'environment.append-paths' Phabricator config so SSH sessions can resolve it
  3. Reproduce as the executing user (sudo -u <daemon user> svnserve --version) and fix permissions or PATH based on what fails
  4. Check the sudo rule PhabricatorDaemon::sudoCommandAsDaemonUser relies on when the workflow is not running as root

Example fix

# before: sshd starts sessions with a minimal PATH; svnserve lives in /usr/local/bin
$ which svnserve
(empty)

# after: extend the search path Phabricator uses for subprocesses
$ ./bin/config set environment.append-paths '["/usr/local/bin"]'
$ which svnserve
/usr/local/bin/svnserve
Defensive patterns

Strategy: validation

Validate before calling

$svnserve = Filesystem::resolveBinary('svnserve');
if (!$svnserve) {
  throw new Exception(
    pht('svnserve not found; install it and extend environment.append-paths.'));
}

Prevention

When it happens

Trigger: phabricator-user or daemon-user environment cannot find the svnserve binary; the subversion server package is missing on the application host; svnserve exists but is not executable by the sudo target user.

Common situations: Fresh installs where subversion tools were never installed; non-interactive sshd sessions with a minimal PATH requiring 'environment.append-paths'; OS upgrades that removed or relocated the binary.

Related errors


AI-assisted analysis of phacility/phabricator@5720a38cfe (2026-08-21). Data as JSON: /api/errors/ff470fd25b98a930. Report an issue: GitHub.