Tor 0.5.0.0-alpha-dev
Loading...
Searching...
No Matches
process_unix.c
Go to the documentation of this file.
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_unix.c
8 * \brief Module for working with Unix processes.
9 **/
10
11#define PROCESS_UNIX_PRIVATE
12#include "lib/intmath/cmp.h"
13#include "lib/buf/buffers.h"
14#include "lib/net/buffers_net.h"
17#include "lib/log/log.h"
18#include "lib/log/util_bug.h"
19#include "lib/process/process.h"
21#include "lib/process/waitpid.h"
22#include "lib/process/env.h"
23
24#include <stdio.h>
25
26#ifdef HAVE_STRING_H
27#include <string.h>
28#endif
29
30#ifdef HAVE_ERRNO_H
31#include <errno.h>
32#endif
33
34#ifdef HAVE_UNISTD_H
35#include <unistd.h>
36#endif
37
38#ifdef HAVE_FCNTL_H
39#include <fcntl.h>
40#endif
41
42#if defined(HAVE_SYS_PRCTL_H) && defined(__linux__)
43#include <sys/prctl.h>
44#endif
45
46#if HAVE_SIGNAL_H
47#include <signal.h>
48#endif
49
50#ifndef _WIN32
51
52#include "lib/fdio/fdio.h"
53
54/** Internal state for Unix handles. */
56 /** Unix File Descriptor. */
57 int fd;
58
59 /** Have we reached end of file? */
61
62 /** Event structure for libevent. */
63 struct event *event;
64
65 /** Are we writing? */
67};
68
69/** Internal state for our Unix process. */
71 /** Standard in handle. */
73
74 /** Standard out handle. */
76
77 /** Standard error handle. */
79
80 /** The process identifier of our process. */
81 pid_t pid;
82
83 /** Waitpid Callback structure. */
85};
86
87/** Returns a newly allocated <b>process_unix_t</b>. */
90{
91 process_unix_t *unix_process;
92 unix_process = tor_malloc_zero(sizeof(process_unix_t));
93
94 unix_process->stdin_handle.fd = -1;
95 unix_process->stderr_handle.fd = -1;
96 unix_process->stdout_handle.fd = -1;
97
98 return unix_process;
99}
100
101/** Deallocates the given <b>unix_process</b>. */
102void
104{
105 if (! unix_process)
106 return;
107
108 /* Clean up our waitpid callback. */
109 clear_waitpid_callback(unix_process->waitpid);
110
111 /* FIXME(ahf): Refactor waitpid code? */
112 unix_process->waitpid = NULL;
113
114 /* Close all our file descriptors. */
116
117 tor_event_free(unix_process->stdout_handle.event);
118 tor_event_free(unix_process->stderr_handle.event);
119 tor_event_free(unix_process->stdin_handle.event);
120
121 tor_free(unix_process);
122}
123
124/** Executes the given process as a child process of Tor. This function is
125 * responsible for setting up the child process and run it. This includes
126 * setting up pipes for interprocess communication, initialize the waitpid
127 * callbacks, and finally run fork() followed by execve(). Returns
128 * <b>PROCESS_STATUS_RUNNING</b> upon success. */
131{
132 process_unix_t *unix_process;
133 pid_t pid;
134 int stdin_pipe[2];
135 int stdout_pipe[2];
136 int stderr_pipe[2];
137 int retval;
138
139 unix_process = process_get_unix_process(process);
140
141 /* Create standard in pipe. */
142 retval = tor_pipe_cloexec(stdin_pipe);
143
144 if (-1 == retval) {
145 log_warn(LD_PROCESS,
146 "Unable to create pipe for stdin "
147 "communication with process: %s",
148 strerror(errno));
149
151 }
152
153 /* Create standard out pipe. */
154 retval = tor_pipe_cloexec(stdout_pipe);
155
156 if (-1 == retval) {
157 log_warn(LD_PROCESS,
158 "Unable to create pipe for stdout "
159 "communication with process: %s",
160 strerror(errno));
161
162 /** Cleanup standard in pipe. */
163 close(stdin_pipe[0]);
164 close(stdin_pipe[1]);
165
167 }
168
169 /* Create standard error pipe. */
170 retval = tor_pipe_cloexec(stderr_pipe);
171
172 if (-1 == retval) {
173 log_warn(LD_PROCESS,
174 "Unable to create pipe for stderr "
175 "communication with process: %s",
176 strerror(errno));
177
178 /** Cleanup standard in pipe. */
179 close(stdin_pipe[0]);
180 close(stdin_pipe[1]);
181
182 /** Cleanup standard out pipe. */
183 close(stdout_pipe[0]);
184 close(stdout_pipe[1]);
185
187 }
188
189 pid = fork();
190
191 if (0 == pid) {
192 /* This code is running in the child process context. */
193
194#if defined(HAVE_SYS_PRCTL_H) && defined(__linux__)
195 /* Attempt to have the kernel issue a SIGTERM if the parent
196 * goes away. Certain attributes of the binary being execve()ed
197 * will clear this during the execve() call, but it's better
198 * than nothing.
199 */
200 prctl(PR_SET_PDEATHSIG, SIGTERM);
201#endif /* defined(HAVE_SYS_PRCTL_H) && defined(__linux__) */
202
203 /* Link process stdout to the write end of the pipe. */
204 retval = dup2(stdout_pipe[1], STDOUT_FILENO);
205 if (-1 == retval)
206 goto error;
207
208 /* Link process stderr to the write end of the pipe. */
209 retval = dup2(stderr_pipe[1], STDERR_FILENO);
210 if (-1 == retval)
211 goto error;
212
213 /* Link process stdin to the read end of the pipe */
214 retval = dup2(stdin_pipe[0], STDIN_FILENO);
215 if (-1 == retval)
216 goto error;
217
218 /* Close our pipes now after they have been dup2()'ed. */
219 close(stderr_pipe[0]);
220 close(stderr_pipe[1]);
221 close(stdout_pipe[0]);
222 close(stdout_pipe[1]);
223 close(stdin_pipe[0]);
224 close(stdin_pipe[1]);
225
226 /* Note that we don't close all FDs from here, which we used to do, because
227 * all our open are CLOEXEC. With a very large maximum number of FDs, the
228 * loop was taking a long time: #40990 */
229
230 /* Create the argv value for our new process. */
231 char **argv = process_get_argv(process);
232
233 /* Create the env value for our new process. */
235
236 /* Call the requested program. */
237 execve(argv[0], argv, env->unixoid_environment_block);
238
239 /* If we made it here it is because execve failed :-( */
240 tor_free(argv);
241 process_environment_free(env);
242
243 error:
244 fprintf(stderr, "Error from child process: %s", strerror(errno));
245 _exit(1);
246 }
247
248 /* We are in the parent process. */
249 if (-1 == pid) {
250 log_warn(LD_PROCESS,
251 "Failed to create child process: %s", strerror(errno));
252
253 /** Cleanup standard in pipe. */
254 close(stdin_pipe[0]);
255 close(stdin_pipe[1]);
256
257 /** Cleanup standard out pipe. */
258 close(stdout_pipe[0]);
259 close(stdout_pipe[1]);
260
261 /** Cleanup standard error pipe. */
262 close(stderr_pipe[0]);
263 close(stderr_pipe[1]);
264
266 }
267
268 /* Register our PID. */
269 unix_process->pid = pid;
270
271 /* Setup waitpid callbacks. */
272 unix_process->waitpid = set_waitpid_callback(pid,
274 process);
275
276 /* Handle standard out. */
277 unix_process->stdout_handle.fd = stdout_pipe[0];
278 retval = close(stdout_pipe[1]);
279
280 if (-1 == retval) {
281 log_warn(LD_PROCESS, "Failed to close write end of standard out pipe: %s",
282 strerror(errno));
283 }
284
285 /* Handle standard error. */
286 unix_process->stderr_handle.fd = stderr_pipe[0];
287 retval = close(stderr_pipe[1]);
288
289 if (-1 == retval) {
290 log_warn(LD_PROCESS,
291 "Failed to close write end of standard error pipe: %s",
292 strerror(errno));
293 }
294
295 /* Handle standard in. */
296 unix_process->stdin_handle.fd = stdin_pipe[1];
297 retval = close(stdin_pipe[0]);
298
299 if (-1 == retval) {
300 log_warn(LD_PROCESS, "Failed to close read end of standard in pipe: %s",
301 strerror(errno));
302 }
303
304 /* Setup our handles. */
306 &unix_process->stdout_handle,
307 EV_READ|EV_PERSIST,
309
311 &unix_process->stderr_handle,
312 EV_READ|EV_PERSIST,
314
316 &unix_process->stdin_handle,
317 EV_WRITE|EV_PERSIST,
319
320 /* Start reading from standard out and standard error. */
323
325}
326
327/** Terminate the given process. Returns true on success, otherwise false. */
328bool
330{
331 tor_assert(process);
332
333 process_unix_t *unix_process = process_get_unix_process(process);
334
335 /* All running processes should have a waitpid. */
336 if (BUG(unix_process->waitpid == NULL))
337 return false;
338
339 bool success = true;
340
341 /* Send a SIGTERM to our child process. */
342 int ret;
343
344 ret = kill(unix_process->pid, SIGTERM);
345
346 if (ret == -1) {
347 log_warn(LD_PROCESS, "Unable to terminate process: %s",
348 strerror(errno));
349 success = false;
350 }
351
352 /* Close all our FD's. */
353 if (! process_unix_close_file_descriptors(unix_process))
354 success = false;
355
356 return success;
357}
358
359/** Returns the unique process identifier for the given <b>process</b>. */
360process_pid_t
362{
363 tor_assert(process);
364
365 process_unix_t *unix_process = process_get_unix_process(process);
366 return (process_pid_t)unix_process->pid;
367}
368
369/** Write the given <b>buffer</b> as input to the given <b>process</b>'s
370 * standard input. Returns the number of bytes written. */
371int
372process_unix_write(process_t *process, buf_t *buffer)
373{
374 tor_assert(process);
375 tor_assert(buffer);
376
377 process_unix_t *unix_process = process_get_unix_process(process);
378
379 size_t buffer_flush_len = buf_datalen(buffer);
380 const size_t max_to_write = MIN(PROCESS_MAX_WRITE, buffer_flush_len);
381
382 /* If we have data to write (when buffer_flush_len > 0) and we are not
383 * currently getting file descriptor events from the kernel, we tell the
384 * kernel to start notifying us about when we can write to our file
385 * descriptor and return. */
386 if (buffer_flush_len > 0 && ! unix_process->stdin_handle.is_writing) {
388 return 0;
389 }
390
391 /* We don't have any data to write, but the kernel is currently notifying us
392 * about whether we are able to write or not. Tell the kernel to stop
393 * notifying us until we have data to write. */
394 if (buffer_flush_len == 0 && unix_process->stdin_handle.is_writing) {
396 return 0;
397 }
398
399 /* We have data to write and the kernel have told us to write it. */
400 return buf_flush_to_pipe(buffer,
401 process_get_unix_process(process)->stdin_handle.fd,
402 max_to_write);
403}
404
405/** Read data from the given process's standard output and put it into
406 * <b>buffer</b>. Returns the number of bytes read. */
407int
408process_unix_read_stdout(process_t *process, buf_t *buffer)
409{
410 tor_assert(process);
411 tor_assert(buffer);
412
413 process_unix_t *unix_process = process_get_unix_process(process);
414
415 return process_unix_read_handle(process,
416 &unix_process->stdout_handle,
417 buffer);
418}
419
420/** Read data from the given process's standard error and put it into
421 * <b>buffer</b>. Returns the number of bytes read. */
422int
423process_unix_read_stderr(process_t *process, buf_t *buffer)
424{
425 tor_assert(process);
426 tor_assert(buffer);
427
428 process_unix_t *unix_process = process_get_unix_process(process);
429
430 return process_unix_read_handle(process,
431 &unix_process->stderr_handle,
432 buffer);
433}
434
435/** This function is called whenever libevent thinks we have data that could be
436 * read from the child process's standard output. We notify the Process
437 * subsystem, which is then responsible for calling back to us for doing the
438 * actual reading of the data. */
439STATIC void
440stdout_read_callback(evutil_socket_t fd, short event, void *data)
441{
442 (void)fd;
443 (void)event;
444
445 process_t *process = data;
446 tor_assert(process);
447
449}
450
451/** This function is called whenever libevent thinks we have data that could be
452 * read from the child process's standard error. We notify the Process
453 * subsystem, which is then responsible for calling back to us for doing the
454 * actual reading of the data. */
455STATIC void
456stderr_read_callback(evutil_socket_t fd, short event, void *data)
457{
458 (void)fd;
459 (void)event;
460
461 process_t *process = data;
462 tor_assert(process);
463
465}
466
467/** This function is called whenever libevent thinks we have data that could be
468 * written the child process's standard input. We notify the Process subsystem,
469 * which is then responsible for calling back to us for doing the actual write
470 * of the data. */
471STATIC void
472stdin_write_callback(evutil_socket_t fd, short event, void *data)
473{
474 (void)fd;
475 (void)event;
476
477 process_t *process = data;
478 tor_assert(process);
479
481}
482
483/** This function tells libevent that we are interested in receiving read
484 * events from the given <b>handle</b>. */
485STATIC void
487{
488 tor_assert(handle);
489
490 if (event_add(handle->event, NULL))
491 log_warn(LD_PROCESS,
492 "Unable to add libevent event for handle.");
493}
494
495/** This function tells libevent that we are no longer interested in receiving
496 * read events from the given <b>handle</b>. */
497STATIC void
499{
500 tor_assert(handle);
501
502 if (handle->event == NULL)
503 return;
504
505 if (event_del(handle->event))
506 log_warn(LD_PROCESS,
507 "Unable to delete libevent event for handle.");
508}
509
510/** This function tells libevent that we are interested in receiving write
511 * events from the given <b>handle</b>. */
512STATIC void
514{
515 tor_assert(handle);
516
517 if (event_add(handle->event, NULL))
518 log_warn(LD_PROCESS,
519 "Unable to add libevent event for handle.");
520
521 handle->is_writing = true;
522}
523
524/** This function tells libevent that we are no longer interested in receiving
525 * write events from the given <b>handle</b>. */
526STATIC void
528{
529 tor_assert(handle);
530
531 if (handle->event == NULL)
532 return;
533
534 if (event_del(handle->event))
535 log_warn(LD_PROCESS,
536 "Unable to delete libevent event for handle.");
537
538 handle->is_writing = false;
539}
540
541/** This function is called when the waitpid system have detected that our
542 * process have terminated. We disable the waitpid system and notify the
543 * Process subsystem that we have terminated. */
544STATIC void
545process_unix_waitpid_callback(int status, void *data)
546{
547 tor_assert(data);
548
549 process_t *process = data;
550 process_unix_t *unix_process = process_get_unix_process(process);
551
552 /* Remove our waitpid callback. */
553 clear_waitpid_callback(unix_process->waitpid);
554 unix_process->waitpid = NULL;
555
556 /* Notify our process. */
557 process_notify_event_exit(process, status);
558
559 /* Make sure you don't modify the process after we have called
560 * process_notify_event_exit() on it, to allow users to process_free() it in
561 * the exit callback. */
562}
563
564/** This function sets the file descriptor in the <b>handle</b> as non-blocking
565 * and configures the libevent event structure based on the given <b>flags</b>
566 * to ensure that <b>callback</b> is called whenever we have events on the
567 * given <b>handle</b>. */
568STATIC void
570 process_unix_handle_t *handle,
571 short flags,
572 event_callback_fn callback)
573{
574 tor_assert(process);
575 tor_assert(handle);
576 tor_assert(callback);
577
578 /* Put our file descriptor into non-blocking mode. */
579 if (fcntl(handle->fd, F_SETFL, O_NONBLOCK) < 0) {
580 log_warn(LD_PROCESS, "Unable mark Unix handle as non-blocking: %s",
581 strerror(errno));
582 }
583
584 /* Setup libevent event. */
585 handle->event = tor_event_new(tor_libevent_get_base(),
586 handle->fd,
587 flags,
588 callback,
589 process);
590}
591
592/** This function reads data from the given <b>handle</b> and puts it into
593 * <b>buffer</b>. Returns the number of bytes read this way. */
594STATIC int
596 process_unix_handle_t *handle,
597 buf_t *buffer)
598{
599 tor_assert(process);
600 tor_assert(handle);
601 tor_assert(buffer);
602
603 int ret = 0;
604 int eof = 0;
605 int error = 0;
606
607 ret = buf_read_from_pipe(buffer,
608 handle->fd,
610 &eof,
611 &error);
612
613 if (error)
614 log_warn(LD_PROCESS,
615 "Unable to read data: %s", strerror(error));
616
617 if (eof) {
618 handle->reached_eof = true;
620 }
621
622 return ret;
623}
624
625/** Close the standard in, out, and error handles of the given
626 * <b>unix_process</b>. */
627STATIC bool
629{
630 tor_assert(unix_process);
631
632 int ret;
633 bool success = true;
634
635 /* Stop reading and writing before we close() our
636 * file descriptors. */
637 if (! unix_process->stdout_handle.reached_eof)
639
640 if (! unix_process->stderr_handle.reached_eof)
642
643 if (unix_process->stdin_handle.is_writing)
645
646 if (unix_process->stdin_handle.fd != -1) {
647 ret = close(unix_process->stdin_handle.fd);
648 if (ret == -1) {
649 log_warn(LD_PROCESS, "Unable to close standard in");
650 success = false;
651 }
652
653 unix_process->stdin_handle.fd = -1;
654 }
655
656 if (unix_process->stdout_handle.fd != -1) {
657 ret = close(unix_process->stdout_handle.fd);
658 if (ret == -1) {
659 log_warn(LD_PROCESS, "Unable to close standard out");
660 success = false;
661 }
662
663 unix_process->stdout_handle.fd = -1;
664 }
665
666 if (unix_process->stderr_handle.fd != -1) {
667 ret = close(unix_process->stderr_handle.fd);
668 if (ret == -1) {
669 log_warn(LD_PROCESS, "Unable to close standard error");
670 success = false;
671 }
672
673 unix_process->stderr_handle.fd = -1;
674 }
675
676 return success;
677}
678
679#endif /* !defined(_WIN32) */
size_t buf_datalen(const buf_t *buf)
Definition buffers.c:394
Header file for buffers.c.
int buf_read_from_pipe(buf_t *buf, int fd, size_t at_most, int *reached_eof, int *socket_error)
int buf_flush_to_pipe(buf_t *buf, int fd, size_t sz)
Header file for buffers_net.c.
Macro definitions for MIN, MAX, and CLAMP.
struct event_base * tor_libevent_get_base(void)
Header for compat_libevent.c.
Header for env.c.
Header for fdio.c.
Headers for log.c.
#define LD_PROCESS
Definition log.h:115
#define tor_free(p)
Definition malloc.h:56
void process_notify_event_stdout(process_t *process)
Definition process.c:577
void process_notify_event_exit(process_t *process, process_exit_code_t exit_code)
Definition process.c:623
void process_notify_event_stderr(process_t *process)
Definition process.c:594
process_environment_t * process_get_environment(const process_t *process)
Definition process.c:501
void process_notify_event_stdin(process_t *process)
Definition process.c:610
char ** process_get_argv(const process_t *process)
Definition process.c:439
process_unix_t * process_get_unix_process(const process_t *process)
Definition process.c:510
Header for process.c.
#define PROCESS_MAX_WRITE
Definition process.h:21
#define PROCESS_MAX_READ
Definition process.h:24
process_status_t
Definition process.h:26
@ PROCESS_STATUS_RUNNING
Definition process.h:31
@ PROCESS_STATUS_ERROR
Definition process.h:34
STATIC void stdin_write_callback(evutil_socket_t fd, short event, void *data)
int process_unix_write(process_t *process, buf_t *buffer)
bool process_unix_terminate(process_t *process)
STATIC void process_unix_setup_handle(process_t *process, process_unix_handle_t *handle, short flags, event_callback_fn callback)
int process_unix_read_stderr(process_t *process, buf_t *buffer)
process_pid_t process_unix_get_pid(process_t *process)
int process_unix_read_stdout(process_t *process, buf_t *buffer)
STATIC void stdout_read_callback(evutil_socket_t fd, short event, void *data)
STATIC void process_unix_start_writing(process_unix_handle_t *handle)
void process_unix_free_(process_unix_t *unix_process)
STATIC void process_unix_stop_reading(process_unix_handle_t *handle)
STATIC void stderr_read_callback(evutil_socket_t fd, short event, void *data)
STATIC void process_unix_waitpid_callback(int status, void *data)
STATIC void process_unix_start_reading(process_unix_handle_t *handle)
STATIC int process_unix_read_handle(process_t *process, process_unix_handle_t *handle, buf_t *buffer)
STATIC void process_unix_stop_writing(process_unix_handle_t *handle)
process_status_t process_unix_exec(process_t *process)
STATIC bool process_unix_close_file_descriptors(process_unix_t *unix_process)
process_unix_t * process_unix_new(void)
Header for process_unix.c.
Header for smartlist.c.
char ** unixoid_environment_block
Definition env.h:27
struct event * event
process_unix_handle_t stdin_handle
waitpid_callback_t * waitpid
process_unix_handle_t stderr_handle
process_unix_handle_t stdout_handle
#define STATIC
Definition testsupport.h:32
Macros to manage assertions, fatal and non-fatal.
#define tor_assert(expr)
Definition util_bug.h:103
void clear_waitpid_callback(waitpid_callback_t *ent)
Definition waitpid.c:98
Headers for waitpid.c.