xref: /aosp_15_r20/external/minijail/test_util.cc (revision 4b9c6d91573e8b3a96609339b46361b5476dd0f9)
1*4b9c6d91SCole Faust /* Copyright 2021 The ChromiumOS Authors
2*4b9c6d91SCole Faust  * Use of this source code is governed by a BSD-style license that can be
3*4b9c6d91SCole Faust  * found in the LICENSE file.
4*4b9c6d91SCole Faust  */
5*4b9c6d91SCole Faust 
6*4b9c6d91SCole Faust #include "test_util.h"
7*4b9c6d91SCole Faust 
8*4b9c6d91SCole Faust #include <stdio.h>
9*4b9c6d91SCole Faust #include <stdlib.h>
10*4b9c6d91SCole Faust #include <string.h>
11*4b9c6d91SCole Faust #include <unistd.h>
12*4b9c6d91SCole Faust 
13*4b9c6d91SCole Faust #include "util.h"
14*4b9c6d91SCole Faust 
15*4b9c6d91SCole Faust #define MAX_PIPE_CAPACITY (4096)
16*4b9c6d91SCole Faust 
write_to_pipe(const std::string & content)17*4b9c6d91SCole Faust FILE *write_to_pipe(const std::string& content)
18*4b9c6d91SCole Faust {
19*4b9c6d91SCole Faust 	int pipefd[2];
20*4b9c6d91SCole Faust 	if (pipe(pipefd) == -1) {
21*4b9c6d91SCole Faust 		die("pipe(pipefd) failed");
22*4b9c6d91SCole Faust 	}
23*4b9c6d91SCole Faust 
24*4b9c6d91SCole Faust 	size_t len = content.length();
25*4b9c6d91SCole Faust 	if (len > MAX_PIPE_CAPACITY)
26*4b9c6d91SCole Faust 		die("write_to_pipe cannot handle >4KB content.");
27*4b9c6d91SCole Faust 	size_t i = 0;
28*4b9c6d91SCole Faust 	unsigned int attempts = 0;
29*4b9c6d91SCole Faust 	ssize_t ret;
30*4b9c6d91SCole Faust 	while (i < len) {
31*4b9c6d91SCole Faust 		ret = write(pipefd[1], content.c_str() + i, len - i);
32*4b9c6d91SCole Faust 		if (ret == -1) {
33*4b9c6d91SCole Faust 			close(pipefd[0]);
34*4b9c6d91SCole Faust 			close(pipefd[1]);
35*4b9c6d91SCole Faust 			return NULL;
36*4b9c6d91SCole Faust 		}
37*4b9c6d91SCole Faust 
38*4b9c6d91SCole Faust 		/* If we write 0 bytes three times in a row, fail. */
39*4b9c6d91SCole Faust 		if (ret == 0) {
40*4b9c6d91SCole Faust 			if (++attempts >= 3) {
41*4b9c6d91SCole Faust 				close(pipefd[0]);
42*4b9c6d91SCole Faust 				close(pipefd[1]);
43*4b9c6d91SCole Faust 				warn("write() returned 0 three times in a row");
44*4b9c6d91SCole Faust 				return NULL;
45*4b9c6d91SCole Faust 			}
46*4b9c6d91SCole Faust 			continue;
47*4b9c6d91SCole Faust 		}
48*4b9c6d91SCole Faust 
49*4b9c6d91SCole Faust 		attempts = 0;
50*4b9c6d91SCole Faust 		i += (size_t)ret;
51*4b9c6d91SCole Faust 	}
52*4b9c6d91SCole Faust 
53*4b9c6d91SCole Faust 	close(pipefd[1]);
54*4b9c6d91SCole Faust 	return fdopen(pipefd[0], "r");
55*4b9c6d91SCole Faust }
56*4b9c6d91SCole Faust 
source_path(const std::string & file)57*4b9c6d91SCole Faust std::string source_path(const std::string& file) {
58*4b9c6d91SCole Faust 	std::string srcdir = getenv("SRC") ? : ".";
59*4b9c6d91SCole Faust 	return srcdir + "/" + file;
60*4b9c6d91SCole Faust }
61