From: kernel test robot <lkp@intel.com>
To: Tingmao Wang <m@maowtm.org>
Cc: llvm@lists.linux.dev, oe-kbuild-all@lists.linux.dev
Subject: Re: [RFC PATCH 9/9] Enhance the sandboxer example to support landlock-supervise
Date: Wed, 5 Mar 2025 11:36:52 +0800 [thread overview]
Message-ID: <202503051100.TdwYRUDj-lkp@intel.com> (raw)
In-Reply-To: <9dc2b112c4be1aadff612b226c603db66ef79955.1741047969.git.m@maowtm.org>
Hi Tingmao,
[This is a private test report for your RFC patch.]
kernel test robot noticed the following build warnings:
[auto build test WARNING on linus/master]
[also build test WARNING on v6.14-rc5 next-20250304]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Tingmao-Wang/Define-the-supervisor-and-event-structure/20250304-092354
base: linus/master
patch link: https://lore.kernel.org/r/9dc2b112c4be1aadff612b226c603db66ef79955.1741047969.git.m%40maowtm.org
patch subject: [RFC PATCH 9/9] Enhance the sandboxer example to support landlock-supervise
config: i386-buildonly-randconfig-004-20250305 (https://download.01.org/0day-ci/archive/20250305/202503051100.TdwYRUDj-lkp@intel.com/config)
compiler: clang version 19.1.7 (https://github.com/llvm/llvm-project cd708029e0b2869e80abe31ddb175f7c35361f90)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250305/202503051100.TdwYRUDj-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202503051100.TdwYRUDj-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> samples/landlock/sandboxer.c:1193:4: warning: label followed by a declaration is a C23 extension [-Wc23-extensions]
1193 | ssize_t count = read(supervisor_fd, io_buf, io_buf_len);
| ^
1 warning generated.
vim +1193 samples/landlock/sandboxer.c
1001
1002 int interactive_sandboxer(int supervisor_fd, int child_stdin, int child_stdout,
1003 int child_stderr, pid_t child_pid)
1004 {
1005 char *write_buf = NULL;
1006 size_t write_buf_len = 0;
1007
1008 size_t io_buf_len = 4096;
1009 char *io_buf = malloc(io_buf_len);
1010 if (!io_buf) {
1011 fprintf(stderr, "Failed to allocate I/O buffer");
1012 return -1;
1013 }
1014
1015 int status = 0;
1016
1017 struct pollfd pfds[5] = {
1018 { .fd = STDIN_FILENO, .events = POLLIN },
1019 { .fd = child_stdout, .events = POLLIN },
1020 { .fd = child_stderr, .events = POLLIN },
1021 { .fd = supervisor_fd, .events = POLLIN },
1022 { .fd = child_stdin, .events = POLLOUT },
1023 };
1024 const int pfd_idx_stdin = 0;
1025 const int pfd_idx_child_stdout = 1;
1026 const int pfd_idx_child_stderr = 2;
1027 const int pfd_idx_supervisor = 3;
1028 const int pfd_idx_child_stdin = 4;
1029 const int poll_len = 5;
1030
1031 struct context context = {
1032 .supervisor_fd = supervisor_fd,
1033 .allowed_paths = NULL,
1034 .num_allowed_paths = 0,
1035 };
1036
1037 bool child_stdin_closed = false;
1038
1039 /*
1040 * Don't deadlock by us trying to write to child, and child
1041 * waiting to write to us.
1042 */
1043 f_set_noblock(child_stdin);
1044
1045 /* Don't get killed by SIGPIPE when child closes stdout/err */
1046 signal(SIGPIPE, SIG_IGN);
1047
1048 while (1) {
1049 if (write_buf_len > 0 && !child_stdin_closed) {
1050 pfds[pfd_idx_child_stdin].fd = child_stdin;
1051 } else {
1052 pfds[pfd_idx_child_stdin].fd = -1;
1053 }
1054
1055 for (int i = 0; i < poll_len; i++) {
1056 pfds[i].revents = 0;
1057 }
1058
1059 if (ppoll(pfds, poll_len, NULL, NULL) < 0) {
1060 if (errno != EINTR) {
1061 perror("ppoll");
1062 goto err_kill_child;
1063 }
1064 }
1065
1066 if (pfds[0].revents & POLLIN) {
1067 /*
1068 * Our stdin -> temp buffer for child's stdin.
1069 * Need to do this before handling any supervisor
1070 * events so that inputs intended for the child is
1071 * not interperted as user decision.
1072 */
1073 const int read_len = 4096;
1074 write_buf =
1075 realloc(write_buf, write_buf_len + read_len);
1076 if (!write_buf) {
1077 fprintf(stderr,
1078 "Failed to realloc write buffer\n");
1079 goto err_kill_child;
1080 }
1081 ssize_t count = read(STDIN_FILENO,
1082 write_buf + write_buf_len,
1083 read_len);
1084 if (count > 0) {
1085 write_buf_len += count;
1086 } else if (count == 0) {
1087 /* Our stdin is closed. Don't read from it anymore. */
1088 pfds[pfd_idx_stdin].fd = -1;
1089 } else {
1090 perror("Failed to read from stdin");
1091 goto err_kill_child;
1092 }
1093 }
1094
1095 if (write_buf_len > 0) {
1096 /* Attempt to write any outstanding stdin to child */
1097 ssize_t written =
1098 write(child_stdin, write_buf, write_buf_len);
1099 if (written > 0) {
1100 if (written > write_buf_len) {
1101 abort();
1102 } else if (written == write_buf_len) {
1103 write_buf_len = 0;
1104 } else {
1105 memmove(write_buf, write_buf + written,
1106 write_buf_len - written);
1107 write_buf_len -= written;
1108 }
1109 } else {
1110 if (errno == EPIPE) {
1111 close(child_stdin);
1112 child_stdin_closed = true;
1113 pfds[pfd_idx_child_stdin].fd = -1;
1114 write_buf_len = 0;
1115 } else if (errno != EAGAIN) {
1116 perror("Failed to write to child stdin");
1117 goto err_kill_child;
1118 }
1119 }
1120 }
1121
1122 if (pfds[pfd_idx_stdin].fd == -1 && write_buf_len == 0) {
1123 /* We can safely close child's stdin now */
1124 close(child_stdin);
1125 child_stdin_closed = true;
1126 pfds[pfd_idx_child_stdin].fd = -1;
1127 }
1128
1129 if (pfds[pfd_idx_child_stdout].revents & POLLIN) {
1130 /* Child stdout -> our stdout */
1131 ssize_t count = read(child_stdout, io_buf, io_buf_len);
1132 if (count > 0) {
1133 if (write_all(STDOUT_FILENO, io_buf, count) <
1134 0) {
1135 perror("Failed to write to stdout");
1136 goto err_kill_child;
1137 }
1138 } else if (count == 0 ||
1139 (count < 0 && errno == EPIPE)) {
1140 close(child_stdout);
1141 pfds[pfd_idx_child_stdout].fd = -1;
1142 } else if (count < 0 && errno != EAGAIN) {
1143 perror("Failed to read from child stdout");
1144 goto err_kill_child;
1145 }
1146 }
1147
1148 if (pfds[2].revents & POLLIN) {
1149 /* Child stderr -> our stderr */
1150 ssize_t count = read(child_stderr, io_buf, io_buf_len);
1151 if (count > 0) {
1152 if (write_all(STDERR_FILENO, io_buf, count) <
1153 0) {
1154 perror("Failed to write to stderr");
1155 goto err_kill_child;
1156 }
1157 } else if (count == 0 ||
1158 (count < 0 && errno == EPIPE)) {
1159 close(child_stderr);
1160 pfds[pfd_idx_child_stderr].fd = -1;
1161 } else if (count < 0 && errno != EAGAIN) {
1162 perror("Failed to read from child stderr");
1163 goto err_kill_child;
1164 }
1165 }
1166
1167 if (waitpid(child_pid, &status, WNOHANG) == child_pid) {
1168 /*
1169 * Write out any remaining child stdout/stderr.
1170 * If child died, read would just return EOF.
1171 */
1172 while (1) {
1173 ssize_t count =
1174 read(child_stdout, io_buf, io_buf_len);
1175 if (count > 0)
1176 write_all(STDOUT_FILENO, io_buf, count);
1177 else
1178 break;
1179 }
1180 while (1) {
1181 ssize_t count =
1182 read(child_stderr, io_buf, io_buf_len);
1183 if (count > 0)
1184 write_all(STDERR_FILENO, io_buf, count);
1185 else
1186 break;
1187 }
1188 return WIFEXITED(status) ? WEXITSTATUS(status) : 1;
1189 }
1190
1191 if (pfds[pfd_idx_supervisor].revents) {
1192 retry:
> 1193 ssize_t count = read(supervisor_fd, io_buf, io_buf_len);
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
parent reply other threads:[~2025-03-05 3:37 UTC|newest]
Thread overview: expand[flat|nested] mbox.gz Atom feed
[parent not found: <9dc2b112c4be1aadff612b226c603db66ef79955.1741047969.git.m@maowtm.org>]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202503051100.TdwYRUDj-lkp@intel.com \
--to=lkp@intel.com \
--cc=llvm@lists.linux.dev \
--cc=m@maowtm.org \
--cc=oe-kbuild-all@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox