tor

The Tor anonymity network
git clone https://git.dasho.dev/tor.git
Log | Files | Refs | README | LICENSE

process_win32.c (37114B)


      1 /* Copyright (c) 2003, Roger Dingledine
      2 * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
      3 * Copyright (c) 2007-2021, The Tor Project, Inc. */
      4 /* See LICENSE for licensing information */
      5 
      6 /**
      7 * \file process_win32.c
      8 * \brief Module for working with Windows processes.
      9 **/
     10 
     11 #define PROCESS_WIN32_PRIVATE
     12 #include "lib/intmath/cmp.h"
     13 #include "lib/buf/buffers.h"
     14 #include "lib/net/buffers_net.h"
     15 #include "lib/container/smartlist.h"
     16 #include "lib/log/log.h"
     17 #include "lib/log/util_bug.h"
     18 #include "lib/log/win32err.h"
     19 #include "lib/process/process.h"
     20 #include "lib/process/process_win32.h"
     21 #include "lib/process/env.h"
     22 
     23 #ifdef HAVE_SYS_TIME_H
     24 #include <sys/time.h>
     25 #endif
     26 
     27 #ifdef HAVE_STRING_H
     28 #include <string.h>
     29 #endif
     30 
     31 #ifdef _WIN32
     32 
     33 /** The size of our intermediate buffers. */
     34 #define BUFFER_SIZE (1024)
     35 
     36 /** Timer that ticks once a second and calls the process_win32_timer_callback()
     37 * function. */
     38 static periodic_timer_t *periodic_timer;
     39 
     40 /** Structure to represent the state around the pipe HANDLE.
     41 *
     42 * This structure is used to store state about a given HANDLE, including
     43 * whether we have reached end of file, its intermediate buffers, and how much
     44 * data that is available in the intermediate buffer. */
     45 struct process_win32_handle_t {
     46  /** Standard out pipe handle. */
     47  HANDLE pipe;
     48 
     49  /** True iff we have reached EOF from the pipe. */
     50  bool reached_eof;
     51 
     52  /** How much data is available in buffer. */
     53  size_t data_available;
     54 
     55  /** Intermediate buffer for ReadFileEx() and WriteFileEx(). */
     56  char buffer[BUFFER_SIZE];
     57 
     58  /** Overlapped structure for ReadFileEx() and WriteFileEx(). */
     59  OVERLAPPED overlapped;
     60 
     61  /** Are we waiting for another I/O operation to complete? */
     62  bool busy;
     63 };
     64 
     65 /** Structure to represent the Windows specific implementation details of this
     66 * Process backend.
     67 *
     68 * This structure is attached to <b>process_t</b> (see process.h) and is
     69 * reachable from <b>process_t</b> via the <b>process_get_win32_process()</b>
     70 * method. */
     71 struct process_win32_t {
     72  /** Standard in state. */
     73  process_win32_handle_t stdin_handle;
     74 
     75  /** Standard out state. */
     76  process_win32_handle_t stdout_handle;
     77 
     78  /** Standard error state. */
     79  process_win32_handle_t stderr_handle;
     80 
     81  /** Process Information. */
     82  PROCESS_INFORMATION process_information;
     83 };
     84 
     85 /** Create a new <b>process_win32_t</b>.
     86 *
     87 * This function constructs a new <b>process_win32_t</b> and initializes the
     88 * default values. */
     89 process_win32_t *
     90 process_win32_new(void)
     91 {
     92  process_win32_t *win32_process;
     93  win32_process = tor_malloc_zero(sizeof(process_win32_t));
     94 
     95  win32_process->stdin_handle.pipe = INVALID_HANDLE_VALUE;
     96  win32_process->stdout_handle.pipe = INVALID_HANDLE_VALUE;
     97  win32_process->stderr_handle.pipe = INVALID_HANDLE_VALUE;
     98 
     99  return win32_process;
    100 }
    101 
    102 /** Free a given <b>process_win32_t</b>.
    103 *
    104 * This function deinitializes and frees up the resources allocated for the
    105 * given <b>process_win32_t</b>. */
    106 void
    107 process_win32_free_(process_win32_t *win32_process)
    108 {
    109  if (! win32_process)
    110    return;
    111 
    112  /* Cleanup our handles. */
    113  process_win32_cleanup_handle(&win32_process->stdin_handle);
    114  process_win32_cleanup_handle(&win32_process->stdout_handle);
    115  process_win32_cleanup_handle(&win32_process->stderr_handle);
    116 
    117  tor_free(win32_process);
    118 }
    119 
    120 /** Initialize the Windows backend of the Process subsystem. */
    121 void
    122 process_win32_init(void)
    123 {
    124  /* We don't start the periodic timer here because it makes no sense to have
    125   * the timer running until we have some processes that benefits from the
    126   * timer timer ticks. */
    127 }
    128 
    129 /** Deinitialize the Windows backend of the Process subsystem. */
    130 void
    131 process_win32_deinit(void)
    132 {
    133  /* Stop our timer, but only if it's running. */
    134  if (process_win32_timer_running())
    135    process_win32_timer_stop();
    136 }
    137 
    138 /** Execute the given process. This function is responsible for setting up
    139 * named pipes for I/O between the child process and the Tor process. Returns
    140 * <b>PROCESS_STATUS_RUNNING</b> upon success. */
    141 process_status_t
    142 process_win32_exec(process_t *process)
    143 {
    144  tor_assert(process);
    145 
    146  process_win32_t *win32_process = process_get_win32_process(process);
    147 
    148  HANDLE stdout_pipe_read = NULL;
    149  HANDLE stdout_pipe_write = NULL;
    150  HANDLE stderr_pipe_read = NULL;
    151  HANDLE stderr_pipe_write = NULL;
    152  HANDLE stdin_pipe_read = NULL;
    153  HANDLE stdin_pipe_write = NULL;
    154  BOOL ret = FALSE;
    155 
    156  /* Setup our security attributes. */
    157  SECURITY_ATTRIBUTES security_attributes;
    158  security_attributes.nLength = sizeof(security_attributes);
    159  security_attributes.bInheritHandle = TRUE;
    160  /* FIXME: should we set explicit security attributes?
    161   * (See Ticket #2046, comment 5) */
    162  security_attributes.lpSecurityDescriptor = NULL;
    163 
    164  /* Create our standard out pipe. */
    165  if (! process_win32_create_pipe(&stdout_pipe_read,
    166                                  &stdout_pipe_write,
    167                                  &security_attributes,
    168                                  PROCESS_WIN32_PIPE_TYPE_READER)) {
    169    return PROCESS_STATUS_ERROR;
    170  }
    171 
    172  /* Create our standard error pipe. */
    173  if (! process_win32_create_pipe(&stderr_pipe_read,
    174                                  &stderr_pipe_write,
    175                                  &security_attributes,
    176                                  PROCESS_WIN32_PIPE_TYPE_READER)) {
    177    return PROCESS_STATUS_ERROR;
    178  }
    179 
    180  /* Create out standard in pipe. */
    181  if (! process_win32_create_pipe(&stdin_pipe_read,
    182                                  &stdin_pipe_write,
    183                                  &security_attributes,
    184                                  PROCESS_WIN32_PIPE_TYPE_WRITER)) {
    185    return PROCESS_STATUS_ERROR;
    186  }
    187 
    188  /* Configure startup info for our child process. */
    189  STARTUPINFOA startup_info;
    190 
    191  memset(&startup_info, 0, sizeof(startup_info));
    192  startup_info.cb = sizeof(startup_info);
    193  startup_info.hStdError = stderr_pipe_write;
    194  startup_info.hStdOutput = stdout_pipe_write;
    195  startup_info.hStdInput = stdin_pipe_read;
    196  startup_info.dwFlags |= STARTF_USESTDHANDLES;
    197 
    198  /* Create the env value for our new process. */
    199  process_environment_t *env = process_get_environment(process);
    200 
    201  /* Create the argv value for our new process. */
    202  char **argv = process_get_argv(process);
    203 
    204  /* Windows expects argv to be a whitespace delimited string, so join argv up
    205   */
    206  char *joined_argv = tor_join_win_cmdline((const char **)argv);
    207 
    208  /* Create the child process */
    209  ret = CreateProcessA(NULL,
    210                       joined_argv,
    211                       NULL,
    212                       NULL,
    213                       TRUE,
    214                       CREATE_NO_WINDOW,
    215                       env->windows_environment_block[0] == '\0' ?
    216                         NULL : env->windows_environment_block,
    217                       NULL,
    218                       &startup_info,
    219                       &win32_process->process_information);
    220 
    221  tor_free(argv);
    222  tor_free(joined_argv);
    223  process_environment_free(env);
    224 
    225  if (! ret) {
    226    log_warn(LD_PROCESS, "CreateProcessA() failed: %s",
    227      format_win32_error(GetLastError()));
    228 
    229    /* Cleanup our handles. */
    230    CloseHandle(stdout_pipe_read);
    231    CloseHandle(stdout_pipe_write);
    232    CloseHandle(stderr_pipe_read);
    233    CloseHandle(stderr_pipe_write);
    234    CloseHandle(stdin_pipe_read);
    235    CloseHandle(stdin_pipe_write);
    236 
    237    /* In the Unix backend, we do not get an error in the Tor process when a
    238     * child process fails to spawn its target executable since we need to
    239     * first do the fork() call in the Tor process and then the child process
    240     * is responsible for doing the call to execve().
    241     *
    242     * This means that the user of the process_exec() API must check for
    243     * whether it returns PROCESS_STATUS_ERROR, which will rarely happen on
    244     * Unix, but will happen for error cases on Windows where it does not
    245     * happen on Unix. For example: when the target executable does not exist
    246     * on the file system.
    247     *
    248     * To have somewhat feature compatibility between the Unix and the Windows
    249     * backend, we here notify the process_t owner that the process have exited
    250     * (even though it never managed to run) to ensure that the exit callback
    251     * is executed.
    252     */
    253    process_notify_event_exit(process, 0);
    254 
    255    return PROCESS_STATUS_ERROR;
    256  }
    257 
    258  /* TODO: Should we close hProcess and hThread in
    259   * process_handle->process_information? */
    260  win32_process->stdout_handle.pipe = stdout_pipe_read;
    261  win32_process->stderr_handle.pipe = stderr_pipe_read;
    262  win32_process->stdin_handle.pipe = stdin_pipe_write;
    263 
    264  /* Close our ends of the pipes that is now owned by the child process. */
    265  CloseHandle(stdout_pipe_write);
    266  CloseHandle(stderr_pipe_write);
    267  CloseHandle(stdin_pipe_read);
    268 
    269  /* Used by the callback functions from ReadFileEx() and WriteFileEx() such
    270   * that we can figure out which process_t that was responsible for the event.
    271   *
    272   * Warning, here be dragons:
    273   *
    274   *   MSDN says that the hEvent member of the overlapped structure is unused
    275   *   for ReadFileEx() and WriteFileEx, which allows us to store a pointer to
    276   *   our process state there.
    277   */
    278  win32_process->stdout_handle.overlapped.hEvent = (HANDLE)process;
    279  win32_process->stderr_handle.overlapped.hEvent = (HANDLE)process;
    280  win32_process->stdin_handle.overlapped.hEvent = (HANDLE)process;
    281 
    282  /* Start our timer if it is not already running. */
    283  if (! process_win32_timer_running())
    284    process_win32_timer_start();
    285 
    286  /* We use Windows Extended I/O functions, so our completion callbacks are
    287   * called automatically for us when there is data to read. Because of this
    288   * we start the read of standard out and error right away. */
    289  process_notify_event_stdout(process);
    290  process_notify_event_stderr(process);
    291 
    292  return PROCESS_STATUS_RUNNING;
    293 }
    294 
    295 /** Terminate the given process. Returns true on success, otherwise false. */
    296 bool
    297 process_win32_terminate(process_t *process)
    298 {
    299  tor_assert(process);
    300 
    301  process_win32_t *win32_process = process_get_win32_process(process);
    302 
    303  /* Terminate our process. */
    304  BOOL ret;
    305 
    306  ret = TerminateProcess(win32_process->process_information.hProcess, 0);
    307 
    308  if (! ret) {
    309    log_warn(LD_PROCESS, "TerminateProcess() failed: %s",
    310             format_win32_error(GetLastError()));
    311    return false;
    312  }
    313 
    314  /* Cleanup our handles. */
    315  process_win32_cleanup_handle(&win32_process->stdin_handle);
    316  process_win32_cleanup_handle(&win32_process->stdout_handle);
    317  process_win32_cleanup_handle(&win32_process->stderr_handle);
    318 
    319  return true;
    320 }
    321 
    322 /** Returns the unique process identifier for the given <b>process</b>. */
    323 process_pid_t
    324 process_win32_get_pid(process_t *process)
    325 {
    326  tor_assert(process);
    327 
    328  process_win32_t *win32_process = process_get_win32_process(process);
    329  return (process_pid_t)win32_process->process_information.dwProcessId;
    330 }
    331 
    332 /** Schedule an async write of the data found in <b>buffer</b> for the given
    333 * process.  This function runs an async write operation of the content of
    334 * buffer, if we are not already waiting for a pending I/O request. Returns the
    335 * number of bytes that Windows will hopefully write for us in the background.
    336 * */
    337 int
    338 process_win32_write(struct process_t *process, buf_t *buffer)
    339 {
    340  tor_assert(process);
    341  tor_assert(buffer);
    342 
    343  process_win32_t *win32_process = process_get_win32_process(process);
    344  BOOL ret = FALSE;
    345  DWORD error_code = 0;
    346  const size_t buffer_size = buf_datalen(buffer);
    347 
    348  /* Windows is still writing our buffer. */
    349  if (win32_process->stdin_handle.busy)
    350    return 0;
    351 
    352  /* Nothing for us to do right now. */
    353  if (buffer_size == 0)
    354    return 0;
    355 
    356  /* We have reached end of file already? */
    357  if (BUG(win32_process->stdin_handle.reached_eof))
    358    return 0;
    359 
    360  /* Figure out how much data we should read. */
    361  const size_t write_size = MIN(buffer_size,
    362                                sizeof(win32_process->stdin_handle.buffer));
    363 
    364  /* Read data from the process_t buffer into our intermediate buffer. */
    365  buf_get_bytes(buffer, win32_process->stdin_handle.buffer, write_size);
    366 
    367  /* Because of the slightly weird API for WriteFileEx() we must set this to 0
    368   * before we call WriteFileEx() because WriteFileEx() does not reset the last
    369   * error itself when it's successful. See comment below after the call to
    370   * GetLastError(). */
    371  SetLastError(0);
    372 
    373  /* Schedule our write. */
    374  ret = WriteFileEx(win32_process->stdin_handle.pipe,
    375                    win32_process->stdin_handle.buffer,
    376                    write_size,
    377                    &win32_process->stdin_handle.overlapped,
    378                    process_win32_stdin_write_done);
    379 
    380  if (! ret) {
    381    error_code = GetLastError();
    382 
    383    /* No need to log at warning level for these two. */
    384    if (error_code == ERROR_HANDLE_EOF || error_code == ERROR_BROKEN_PIPE) {
    385      log_debug(LD_PROCESS, "WriteFileEx() returned EOF from pipe: %s",
    386                format_win32_error(error_code));
    387    } else {
    388      log_warn(LD_PROCESS, "WriteFileEx() failed: %s",
    389               format_win32_error(error_code));
    390    }
    391 
    392    win32_process->stdin_handle.reached_eof = true;
    393    return 0;
    394  }
    395 
    396  /* Here be dragons: According to MSDN's documentation for WriteFileEx() we
    397   * should check GetLastError() after a call to WriteFileEx() even though the
    398   * `ret` return value was successful. If everything is good, GetLastError()
    399   * returns `ERROR_SUCCESS` and nothing happens.
    400   *
    401   * XXX(ahf): I have not managed to trigger this code while stress-testing
    402   * this code. */
    403  error_code = GetLastError();
    404 
    405  if (error_code != ERROR_SUCCESS) {
    406    /* LCOV_EXCL_START */
    407    log_warn(LD_PROCESS, "WriteFileEx() failed after returning success: %s",
    408             format_win32_error(error_code));
    409    win32_process->stdin_handle.reached_eof = true;
    410    return 0;
    411    /* LCOV_EXCL_STOP */
    412  }
    413 
    414  /* This cast should be safe since our buffer can maximum be BUFFER_SIZE
    415   * large. */
    416  return (int)write_size;
    417 }
    418 
    419 /** This function is called from the Process subsystem whenever the Windows
    420 * backend says it has data ready. This function also ensures that we are
    421 * starting a new background read from the standard output of the child process
    422 * and asks Windows to call process_win32_stdout_read_done() when that
    423 * operation is finished. Returns the number of bytes moved into <b>buffer</b>.
    424 * */
    425 int
    426 process_win32_read_stdout(struct process_t *process, buf_t *buffer)
    427 {
    428  tor_assert(process);
    429  tor_assert(buffer);
    430 
    431  process_win32_t *win32_process = process_get_win32_process(process);
    432 
    433  return process_win32_read_from_handle(&win32_process->stdout_handle,
    434                                        buffer,
    435                                        process_win32_stdout_read_done);
    436 }
    437 
    438 /** This function is called from the Process subsystem whenever the Windows
    439 * backend says it has data ready. This function also ensures that we are
    440 * starting a new background read from the standard error of the child process
    441 * and asks Windows to call process_win32_stderr_read_done() when that
    442 * operation is finished. Returns the number of bytes moved into <b>buffer</b>.
    443 * */
    444 int
    445 process_win32_read_stderr(struct process_t *process, buf_t *buffer)
    446 {
    447  tor_assert(process);
    448  tor_assert(buffer);
    449 
    450  process_win32_t *win32_process = process_get_win32_process(process);
    451 
    452  return process_win32_read_from_handle(&win32_process->stderr_handle,
    453                                        buffer,
    454                                        process_win32_stderr_read_done);
    455 }
    456 
    457 /** This function is responsible for moving the Tor process into what Microsoft
    458 * calls an "alertable" state. Once the process is in an alertable state the
    459 * Windows kernel will notify us when our background I/O requests have finished
    460 * and the callbacks will be executed. */
    461 void
    462 process_win32_trigger_completion_callbacks(void)
    463 {
    464  DWORD ret;
    465 
    466  /* The call to SleepEx(dwMilliseconds, dwAlertable) makes the process sleep
    467   * for dwMilliseconds and if dwAlertable is set to TRUE it will also cause
    468   * the process to enter alertable state, where the Windows kernel will notify
    469   * us about completed I/O requests from ReadFileEx() and WriteFileEX(), which
    470   * will cause our completion callbacks to be executed.
    471   *
    472   * This function returns 0 if the time interval expired or WAIT_IO_COMPLETION
    473   * if one or more I/O callbacks were executed. */
    474  ret = SleepEx(0, TRUE);
    475 
    476  /* Warn us if the function returned something we did not anticipate. */
    477  if (ret != 0 && ret != WAIT_IO_COMPLETION) {
    478    log_warn(LD_PROCESS, "SleepEx() returned %lu", ret);
    479  }
    480 }
    481 
    482 /** Start the periodic timer which is responsible for checking whether
    483 * processes are still alive and to make sure that the Tor process is
    484 * periodically being moved into an alertable state. */
    485 void
    486 process_win32_timer_start(void)
    487 {
    488  /* Make sure we never start our timer if it's already running. */
    489  if (BUG(process_win32_timer_running()))
    490    return;
    491 
    492  /* Wake up once a second. */
    493  static const struct timeval interval = {1, 0};
    494 
    495  log_info(LD_PROCESS, "Starting Windows Process I/O timer");
    496  periodic_timer = periodic_timer_new(tor_libevent_get_base(),
    497                                      &interval,
    498                                      process_win32_timer_callback,
    499                                      NULL);
    500 }
    501 
    502 /** Stops the periodic timer. */
    503 void
    504 process_win32_timer_stop(void)
    505 {
    506  if (BUG(periodic_timer == NULL))
    507    return;
    508 
    509  log_info(LD_PROCESS, "Stopping Windows Process I/O timer");
    510  periodic_timer_free(periodic_timer);
    511 }
    512 
    513 /** Returns true iff the periodic timer is running. */
    514 bool
    515 process_win32_timer_running(void)
    516 {
    517  return periodic_timer != NULL;
    518 }
    519 
    520 /** This function is called whenever the periodic_timer ticks. The function is
    521 * responsible for moving the Tor process into an alertable state once a second
    522 * and checking for whether our child processes have terminated since the last
    523 * tick. */
    524 STATIC void
    525 process_win32_timer_callback(periodic_timer_t *timer, void *data)
    526 {
    527  tor_assert(timer == periodic_timer);
    528  tor_assert(data == NULL);
    529 
    530  /* Move the process into an alertable state. */
    531  process_win32_trigger_completion_callbacks();
    532 
    533  /* Check if our processes are still alive. */
    534 
    535  /* Since the call to process_win32_timer_test_process() might call
    536   * process_notify_event_exit() which again might call process_free() which
    537   * updates the list of processes returned by process_get_all_processes() it
    538   * is important here that we make sure to not touch the list of processes if
    539   * the call to process_win32_timer_test_process() returns true. */
    540  bool done;
    541 
    542  do {
    543    const smartlist_t *processes = process_get_all_processes();
    544    done = true;
    545 
    546    SMARTLIST_FOREACH_BEGIN(processes, process_t *, process) {
    547      /* If process_win32_timer_test_process() returns true, it means that
    548       * smartlist_remove() might have been called on the list returned by
    549       * process_get_all_processes(). We start the loop over again until we
    550       * have a successful run over the entire list where the list was not
    551       * modified. */
    552      if (process_win32_timer_test_process(process)) {
    553        done = false;
    554        break;
    555      }
    556    } SMARTLIST_FOREACH_END(process);
    557  } while (! done);
    558 }
    559 
    560 /** Test whether a given process is still alive. Notify the Process subsystem
    561 * if our process have died. Returns true iff the given process have
    562 * terminated. */
    563 STATIC bool
    564 process_win32_timer_test_process(process_t *process)
    565 {
    566  tor_assert(process);
    567 
    568  /* No need to look at processes that don't claim they are running. */
    569  if (process_get_status(process) != PROCESS_STATUS_RUNNING)
    570    return false;
    571 
    572  process_win32_t *win32_process = process_get_win32_process(process);
    573  BOOL ret = FALSE;
    574  DWORD exit_code = 0;
    575 
    576  /* Sometimes the Windows kernel won't give us the EOF/Broken Pipe error
    577   * message until some time after the process have actually terminated. We
    578   * make sure that our ReadFileEx() calls for the process have *all* returned
    579   * and both standard out and error have been marked as EOF before we try to
    580   * see if the process terminated.
    581   *
    582   * This ensures that we *never* call the exit callback of the `process_t`,
    583   * which potentially ends up calling `process_free()` on our `process_t`,
    584   * before all data have been received from the process.
    585   *
    586   * We do NOT have a check here for whether standard in reached EOF since
    587   * standard in's WriteFileEx() function is only called on-demand when we have
    588   * something to write and is thus usually not awaiting to finish any
    589   * operations. If we WriteFileEx() to a file that has terminated we'll simply
    590   * get an error from ReadFileEx() or its completion routine and move on with
    591   * life.  */
    592  if (! win32_process->stdout_handle.reached_eof)
    593    return false;
    594 
    595  if (! win32_process->stderr_handle.reached_eof)
    596    return false;
    597 
    598  /* We start by testing whether our process is still running. */
    599  ret = GetExitCodeProcess(win32_process->process_information.hProcess,
    600                           &exit_code);
    601 
    602  if (! ret) {
    603    log_warn(LD_PROCESS, "GetExitCodeProcess() failed: %s",
    604             format_win32_error(GetLastError()));
    605    return false;
    606  }
    607 
    608  /* Notify our process_t that our process have terminated. Since our
    609   * exit_callback might decide to process_free() our process handle it is very
    610   * important that we do not touch the process_t after the call to
    611   * process_notify_event_exit(). */
    612  if (exit_code != STILL_ACTIVE) {
    613    process_notify_event_exit(process, exit_code);
    614    return true;
    615  }
    616 
    617  return false;
    618 }
    619 
    620 /** Create a new overlapped named pipe. This function creates a new connected,
    621 * named, pipe in <b>*read_pipe</b> and <b>*write_pipe</b> if the function is
    622 * successful. Returns true on success, false on failure. */
    623 STATIC bool
    624 process_win32_create_pipe(HANDLE *read_pipe,
    625                          HANDLE *write_pipe,
    626                          SECURITY_ATTRIBUTES *attributes,
    627                          process_win32_pipe_type_t pipe_type)
    628 {
    629  tor_assert(read_pipe);
    630  tor_assert(write_pipe);
    631  tor_assert(attributes);
    632 
    633  BOOL ret = FALSE;
    634 
    635  /* Buffer size. */
    636  const size_t size = 4096;
    637 
    638  /* Our additional read/write modes that depends on which pipe type we are
    639   * creating. */
    640  DWORD read_mode = 0;
    641  DWORD write_mode = 0;
    642 
    643  /* Generate the unique pipe name. */
    644  char pipe_name[MAX_PATH];
    645  static DWORD process_id = 0;
    646  static DWORD counter = 0;
    647 
    648  if (process_id == 0)
    649    process_id = GetCurrentProcessId();
    650 
    651  tor_snprintf(pipe_name, sizeof(pipe_name),
    652               "\\\\.\\Pipe\\Tor-Process-Pipe-%lu-%lu",
    653               process_id, counter++);
    654 
    655  /* Only one of our handles can be overlapped. */
    656  switch (pipe_type) {
    657  case PROCESS_WIN32_PIPE_TYPE_READER:
    658    read_mode = FILE_FLAG_OVERLAPPED;
    659    break;
    660  case PROCESS_WIN32_PIPE_TYPE_WRITER:
    661    write_mode = FILE_FLAG_OVERLAPPED;
    662    break;
    663  default:
    664    /* LCOV_EXCL_START */
    665    tor_assert_nonfatal_unreached_once();
    666    /* LCOV_EXCL_STOP */
    667  }
    668 
    669  /* Setup our read and write handles. */
    670  HANDLE read_handle;
    671  HANDLE write_handle;
    672 
    673  /* Create our named pipe. */
    674  read_handle = CreateNamedPipeA(pipe_name,
    675                                 (PIPE_ACCESS_INBOUND|read_mode),
    676                                 (PIPE_TYPE_BYTE|PIPE_WAIT),
    677                                 1,
    678                                 size,
    679                                 size,
    680                                 1000,
    681                                 attributes);
    682 
    683  if (read_handle == INVALID_HANDLE_VALUE) {
    684    log_warn(LD_PROCESS, "CreateNamedPipeA() failed: %s",
    685             format_win32_error(GetLastError()));
    686    return false;
    687  }
    688 
    689  /* Create our file in the pipe namespace. */
    690  write_handle = CreateFileA(pipe_name,
    691                             GENERIC_WRITE,
    692                             0,
    693                             attributes,
    694                             OPEN_EXISTING,
    695                             (FILE_ATTRIBUTE_NORMAL|write_mode),
    696                             NULL);
    697 
    698  if (write_handle == INVALID_HANDLE_VALUE) {
    699    log_warn(LD_PROCESS, "CreateFileA() failed: %s",
    700             format_win32_error(GetLastError()));
    701 
    702    CloseHandle(read_handle);
    703 
    704    return false;
    705  }
    706 
    707  /* Set the inherit flag for our pipe. */
    708  switch (pipe_type) {
    709  case PROCESS_WIN32_PIPE_TYPE_READER:
    710    ret = SetHandleInformation(read_handle, HANDLE_FLAG_INHERIT, 0);
    711    break;
    712  case PROCESS_WIN32_PIPE_TYPE_WRITER:
    713    ret = SetHandleInformation(write_handle, HANDLE_FLAG_INHERIT, 0);
    714    break;
    715  default:
    716    /* LCOV_EXCL_START */
    717    tor_assert_nonfatal_unreached_once();
    718    /* LCOV_EXCL_STOP */
    719  }
    720 
    721  if (! ret) {
    722    log_warn(LD_PROCESS, "SetHandleInformation() failed: %s",
    723             format_win32_error(GetLastError()));
    724 
    725    CloseHandle(read_handle);
    726    CloseHandle(write_handle);
    727 
    728    return false;
    729  }
    730 
    731  /* Everything is good. */
    732  *read_pipe = read_handle;
    733  *write_pipe = write_handle;
    734 
    735  return true;
    736 }
    737 
    738 /** Cleanup a given <b>handle</b>. */
    739 STATIC void
    740 process_win32_cleanup_handle(process_win32_handle_t *handle)
    741 {
    742  tor_assert(handle);
    743 
    744 #if 0
    745  BOOL ret;
    746  DWORD error_code;
    747 
    748  /* Cancel any pending I/O requests: This means that instead of getting
    749   * ERROR_BROKEN_PIPE we get ERROR_OPERATION_ABORTED, but it doesn't seem
    750   * like this is needed. */
    751  ret = CancelIo(handle->pipe);
    752 
    753  if (! ret) {
    754    error_code = GetLastError();
    755 
    756    /* There was no pending I/O requests for our handle. */
    757    if (error_code != ERROR_NOT_FOUND) {
    758      log_warn(LD_PROCESS, "CancelIo() failed: %s",
    759               format_win32_error(error_code));
    760    }
    761  }
    762 #endif /* 0 */
    763 
    764  /* Close our handle. */
    765  if (handle->pipe != INVALID_HANDLE_VALUE) {
    766    CloseHandle(handle->pipe);
    767    handle->pipe = INVALID_HANDLE_VALUE;
    768    handle->reached_eof = true;
    769  }
    770 }
    771 
    772 /** This function is called when ReadFileEx() completes its background read
    773 * from the child process's standard output. We notify the Process subsystem if
    774 * there is data available for it to read from us. */
    775 STATIC VOID WINAPI
    776 process_win32_stdout_read_done(DWORD error_code,
    777                               DWORD byte_count,
    778                               LPOVERLAPPED overlapped)
    779 {
    780  tor_assert(overlapped);
    781  tor_assert(overlapped->hEvent);
    782 
    783  /* Extract our process_t from the hEvent member of OVERLAPPED. */
    784  process_t *process = (process_t *)overlapped->hEvent;
    785  process_win32_t *win32_process = process_get_win32_process(process);
    786 
    787  if (process_win32_handle_read_completion(&win32_process->stdout_handle,
    788                                           error_code,
    789                                           byte_count)) {
    790    /* Schedule our next read. */
    791    process_notify_event_stdout(process);
    792  }
    793 }
    794 
    795 /** This function is called when ReadFileEx() completes its background read
    796 * from the child process's standard error. We notify the Process subsystem if
    797 * there is data available for it to read from us. */
    798 STATIC VOID WINAPI
    799 process_win32_stderr_read_done(DWORD error_code,
    800                               DWORD byte_count,
    801                               LPOVERLAPPED overlapped)
    802 {
    803  tor_assert(overlapped);
    804  tor_assert(overlapped->hEvent);
    805 
    806  /* Extract our process_t from the hEvent member of OVERLAPPED. */
    807  process_t *process = (process_t *)overlapped->hEvent;
    808  process_win32_t *win32_process = process_get_win32_process(process);
    809 
    810  if (process_win32_handle_read_completion(&win32_process->stderr_handle,
    811                                           error_code,
    812                                           byte_count)) {
    813    /* Schedule our next read. */
    814    process_notify_event_stderr(process);
    815  }
    816 }
    817 
    818 /** This function is called when WriteFileEx() completes its background write
    819 * to the child process's standard input. We notify the Process subsystem that
    820 * it can write data to us again. */
    821 STATIC VOID WINAPI
    822 process_win32_stdin_write_done(DWORD error_code,
    823                               DWORD byte_count,
    824                               LPOVERLAPPED overlapped)
    825 {
    826  tor_assert(overlapped);
    827  tor_assert(overlapped->hEvent);
    828 
    829  (void)byte_count;
    830 
    831  process_t *process = (process_t *)overlapped->hEvent;
    832  process_win32_t *win32_process = process_get_win32_process(process);
    833 
    834  /* Mark our handle as not having any outstanding I/O requests. */
    835  win32_process->stdin_handle.busy = false;
    836 
    837  /* Check if we have been asked to write to the handle that have been marked
    838   * as having reached EOF. */
    839  if (BUG(win32_process->stdin_handle.reached_eof))
    840    return;
    841 
    842  if (error_code == 0) {
    843    /** Our data have been successfully written. Clear our state and schedule
    844     * the next write. */
    845    win32_process->stdin_handle.data_available = 0;
    846    memset(win32_process->stdin_handle.buffer, 0,
    847           sizeof(win32_process->stdin_handle.buffer));
    848 
    849    /* Schedule the next write. */
    850    process_notify_event_stdin(process);
    851  } else if (error_code == ERROR_HANDLE_EOF ||
    852             error_code == ERROR_BROKEN_PIPE) {
    853    /* Our WriteFileEx() call was successful, but we reached the end of our
    854     * file.  We mark our handle as having reached EOF and returns. */
    855    tor_assert(byte_count == 0);
    856 
    857    win32_process->stdin_handle.reached_eof = true;
    858  } else {
    859    /* An error happened: We warn the user and mark our handle as having
    860     * reached EOF */
    861    log_warn(LD_PROCESS,
    862             "Error in I/O completion routine from WriteFileEx(): %s",
    863             format_win32_error(error_code));
    864    win32_process->stdin_handle.reached_eof = true;
    865  }
    866 }
    867 
    868 /** This function reads data from the given <b>handle</b>'s internal buffer and
    869 * moves it into the given <b>buffer</b>. Additionally, we start the next
    870 * ReadFileEx() background operation with the given <b>callback</b> as
    871 * completion callback. Returns the number of bytes written to the buffer. */
    872 STATIC int
    873 process_win32_read_from_handle(process_win32_handle_t *handle,
    874                               buf_t *buffer,
    875                               LPOVERLAPPED_COMPLETION_ROUTINE callback)
    876 {
    877  tor_assert(handle);
    878  tor_assert(buffer);
    879  tor_assert(callback);
    880 
    881  BOOL ret = FALSE;
    882  int bytes_available = 0;
    883  DWORD error_code = 0;
    884 
    885  /* We already have a request to read data that isn't complete yet. */
    886  if (BUG(handle->busy))
    887    return 0;
    888 
    889  /* Check if we have been asked to read from a handle that have already told
    890   * us that we have reached the end of the file. */
    891  if (handle->reached_eof)
    892    return 0;
    893 
    894  /* This cast should be safe since our buffer can be at maximum up to
    895   * BUFFER_SIZE in size. */
    896  bytes_available = (int)handle->data_available;
    897 
    898  if (handle->data_available > 0) {
    899    /* Read data from our intermediate buffer into the process_t buffer. */
    900    buf_add(buffer, handle->buffer, handle->data_available);
    901 
    902    /* Reset our read state. */
    903    handle->data_available = 0;
    904    memset(handle->buffer, 0, sizeof(handle->buffer));
    905  }
    906 
    907  /* Because of the slightly weird API for ReadFileEx() we must set this to 0
    908   * before we call ReadFileEx() because ReadFileEx() does not reset the last
    909   * error itself when it's successful. See comment below after the call to
    910   * GetLastError(). */
    911  SetLastError(0);
    912 
    913  /* Ask the Windows kernel to read data from our pipe into our buffer and call
    914   * the callback function when it is done. */
    915  ret = ReadFileEx(handle->pipe,
    916                   handle->buffer,
    917                   sizeof(handle->buffer),
    918                   &handle->overlapped,
    919                   callback);
    920 
    921  if (! ret) {
    922    error_code = GetLastError();
    923 
    924    /* No need to log at warning level for these two. */
    925    if (error_code == ERROR_HANDLE_EOF || error_code == ERROR_BROKEN_PIPE) {
    926      log_debug(LD_PROCESS, "ReadFileEx() returned EOF from pipe: %s",
    927                format_win32_error(error_code));
    928    } else {
    929      log_warn(LD_PROCESS, "ReadFileEx() failed: %s",
    930               format_win32_error(error_code));
    931    }
    932 
    933    handle->reached_eof = true;
    934    return bytes_available;
    935  }
    936 
    937  /* Here be dragons: According to MSDN's documentation for ReadFileEx() we
    938   * should check GetLastError() after a call to ReadFileEx() even though the
    939   * `ret` return value was successful. If everything is good, GetLastError()
    940   * returns `ERROR_SUCCESS` and nothing happens.
    941   *
    942   * XXX(ahf): I have not managed to trigger this code while stress-testing
    943   * this code. */
    944  error_code = GetLastError();
    945 
    946  if (error_code != ERROR_SUCCESS) {
    947    /* LCOV_EXCL_START */
    948    log_warn(LD_PROCESS, "ReadFileEx() failed after returning success: %s",
    949             format_win32_error(error_code));
    950    handle->reached_eof = true;
    951    return bytes_available;
    952    /* LCOV_EXCL_STOP */
    953  }
    954 
    955  /* We mark our handle as having a pending I/O request. */
    956  handle->busy = true;
    957 
    958  return bytes_available;
    959 }
    960 
    961 /** This function checks the callback values from ReadFileEx() in
    962 * <b>error_code</b> and <b>byte_count</b> if we have read data. Returns true
    963 * iff our caller should request more data from ReadFileEx(). */
    964 STATIC bool
    965 process_win32_handle_read_completion(process_win32_handle_t *handle,
    966                                     DWORD error_code,
    967                                     DWORD byte_count)
    968 {
    969  tor_assert(handle);
    970 
    971  /* Mark our handle as not having any outstanding I/O requests. */
    972  handle->busy = false;
    973 
    974  if (error_code == 0) {
    975    /* Our ReadFileEx() call was successful and there is data for us. */
    976 
    977    /* This cast should be safe since byte_count should never be larger than
    978     * BUFFER_SIZE. */
    979    tor_assert(byte_count <= BUFFER_SIZE);
    980    handle->data_available = (size_t)byte_count;
    981 
    982    /* Tell our caller to schedule the next read. */
    983    return true;
    984  } else if (error_code == ERROR_HANDLE_EOF ||
    985             error_code == ERROR_BROKEN_PIPE) {
    986    /* Our ReadFileEx() finished, but we reached the end of our file.  We mark
    987     * our handle as having reached EOF and returns. */
    988    tor_assert(byte_count == 0);
    989 
    990    handle->reached_eof = true;
    991  } else {
    992    /* An error happened: We warn the user and mark our handle as having
    993     * reached EOF */
    994    log_warn(LD_PROCESS,
    995             "Error in I/O completion routine from ReadFileEx(): %s",
    996             format_win32_error(error_code));
    997 
    998    handle->reached_eof = true;
    999  }
   1000 
   1001  /* Our caller should NOT schedule the next read. */
   1002  return false;
   1003 }
   1004 
   1005 /** Format a single argument for being put on a Windows command line.
   1006 * Returns a newly allocated string */
   1007 STATIC char *
   1008 format_win_cmdline_argument(const char *arg)
   1009 {
   1010  char *formatted_arg;
   1011  char need_quotes;
   1012  const char *c;
   1013  int i;
   1014  int bs_counter = 0;
   1015  /* Backslash we can point to when one is inserted into the string */
   1016  const char backslash = '\\';
   1017 
   1018  /* Smartlist of *char */
   1019  smartlist_t *arg_chars;
   1020  arg_chars = smartlist_new();
   1021 
   1022  /* Quote string if it contains whitespace or is empty */
   1023  need_quotes = (strchr(arg, ' ') || strchr(arg, '\t') || '\0' == arg[0]);
   1024 
   1025  /* Build up smartlist of *chars */
   1026  for (c=arg; *c != '\0'; c++) {
   1027    if ('"' == *c) {
   1028      /* Double up backslashes preceding a quote */
   1029      for (i=0; i<(bs_counter*2); i++)
   1030        smartlist_add(arg_chars, (void*)&backslash);
   1031      bs_counter = 0;
   1032      /* Escape the quote */
   1033      smartlist_add(arg_chars, (void*)&backslash);
   1034      smartlist_add(arg_chars, (void*)c);
   1035    } else if ('\\' == *c) {
   1036      /* Count backslashes until we know whether to double up */
   1037      bs_counter++;
   1038    } else {
   1039      /* Don't double up slashes preceding a non-quote */
   1040      for (i=0; i<bs_counter; i++)
   1041        smartlist_add(arg_chars, (void*)&backslash);
   1042      bs_counter = 0;
   1043      smartlist_add(arg_chars, (void*)c);
   1044    }
   1045  }
   1046  /* Don't double up trailing backslashes */
   1047  for (i=0; i<bs_counter; i++)
   1048    smartlist_add(arg_chars, (void*)&backslash);
   1049 
   1050  /* Allocate space for argument, quotes (if needed), and terminator */
   1051  const size_t formatted_arg_len = smartlist_len(arg_chars) +
   1052    (need_quotes ? 2 : 0) + 1;
   1053  formatted_arg = tor_malloc_zero(formatted_arg_len);
   1054 
   1055  /* Add leading quote */
   1056  i=0;
   1057  if (need_quotes)
   1058    formatted_arg[i++] = '"';
   1059 
   1060  /* Add characters */
   1061  SMARTLIST_FOREACH(arg_chars, char*, ch,
   1062  {
   1063    formatted_arg[i++] = *ch;
   1064  });
   1065 
   1066  /* Add trailing quote */
   1067  if (need_quotes)
   1068    formatted_arg[i++] = '"';
   1069  formatted_arg[i] = '\0';
   1070 
   1071  smartlist_free(arg_chars);
   1072  return formatted_arg;
   1073 }
   1074 
   1075 /** Format a command line for use on Windows, which takes the command as a
   1076 * string rather than string array. Follows the rules from "Parsing C++
   1077 * Command-Line Arguments" in MSDN. Algorithm based on list2cmdline in the
   1078 * Python subprocess module. Returns a newly allocated string */
   1079 STATIC char *
   1080 tor_join_win_cmdline(const char *argv[])
   1081 {
   1082  smartlist_t *argv_list;
   1083  char *joined_argv;
   1084  int i;
   1085 
   1086  /* Format each argument and put the result in a smartlist */
   1087  argv_list = smartlist_new();
   1088  for (i=0; argv[i] != NULL; i++) {
   1089    smartlist_add(argv_list, (void *)format_win_cmdline_argument(argv[i]));
   1090  }
   1091 
   1092  /* Join the arguments with whitespace */
   1093  joined_argv = smartlist_join_strings(argv_list, " ", 0, NULL);
   1094 
   1095  /* Free the newly allocated arguments, and the smartlist */
   1096  SMARTLIST_FOREACH(argv_list, char *, arg,
   1097  {
   1098    tor_free(arg);
   1099  });
   1100  smartlist_free(argv_list);
   1101 
   1102  return joined_argv;
   1103 }
   1104 
   1105 #endif /* defined(_WIN32) */