ptest-runner: update from 2.3.1 to 2.3.2

All local patches are now upstream so they have been dropped.
Other upstream commits make ptest-runner build using: clang -Weverything

$ git log --oneline b73bd54..7015e91
7015e91 (HEAD -> oe-core-master, tag: v2.3.2, origin/master, origin/HEAD, master) Fix additional warnings when using clang
dd1daa8 tests: fix clang warnings.
15fd131 main code: fix clang warnings
59381a6 utils: ensure child can be session leader
5fe2c0a utils: Ensure pipes are read after exit
79a9c27 use process groups when spawning
b73bd54 utils: Ensure stdout/stderr are flushed

(From OE-Core rev: 9a80a352a9d0c4ea09de7bb370267672c32771f2)

Signed-off-by: Randy MacLeod <Randy.MacLeod@windriver.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Randy MacLeod
2019-08-01 16:36:48 -04:00
committed by Richard Purdie
parent f2a951f479
commit 640c59a706
5 changed files with 2 additions and 374 deletions

View File

@@ -1,45 +0,0 @@
From 9b36993794c1de733c521b2477370c874c07b617 Mon Sep 17 00:00:00 2001
From: Richard Purdie <richard.purdie@linuxfoundation.org>
Date: Thu, 4 Apr 2019 14:18:55 +0100
Subject: [PATCH 1/3] utils: Ensure stdout/stderr are flushed
There is no guarantee that the data written with fwrite will be flushed to the
buffer. If stdout and stderr are the same thing, this could lead to interleaved
writes. The common case is stdout output so flush the output pipes when writing to
stderr. Also flush stdout before the function returns.
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Upstream-Status: Pending [code being tested]
---
utils.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/utils.c b/utils.c
index 504df0b..3ceb342 100644
--- a/utils.c
+++ b/utils.c
@@ -295,8 +295,11 @@ wait_child(const char *ptest_dir, const char *run_ptest, pid_t pid,
}
if (pfds[1].revents != 0) {
- while ((n = read(fds[1], buf, WAIT_CHILD_BUF_MAX_SIZE)) > 0)
+ while ((n = read(fds[1], buf, WAIT_CHILD_BUF_MAX_SIZE)) > 0) {
+ fflush(fps[0]);
fwrite(buf, n, 1, fps[1]);
+ fflush(fps[1]);
+ }
}
clock_gettime(clock, &sentinel);
@@ -315,7 +318,7 @@ wait_child(const char *ptest_dir, const char *run_ptest, pid_t pid,
break;
}
-
+ fflush(fps[0]);
return status;
}
--
2.17.1

View File

@@ -1,35 +0,0 @@
From f0c42a65633341ad048718c7a6dbd035818e9eaf Mon Sep 17 00:00:00 2001
From: Richard Purdie <richard.purdie@linuxfoundation.org>
Date: Thu, 4 Apr 2019 14:20:31 +0100
Subject: [PATCH 2/3] use process groups when spawning
Rather than just killing the process we've swawned, set the process group
for spawned children and then kill the group of processes.
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Upstream-Status: Pending [code being tested]
---
utils.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/utils.c b/utils.c
index 3ceb342..c5b3b8d 100644
--- a/utils.c
+++ b/utils.c
@@ -309,7 +309,7 @@ wait_child(const char *ptest_dir, const char *run_ptest, pid_t pid,
clock_gettime(clock, &time);
if ((time.tv_sec - sentinel.tv_sec) > timeout) {
*timeouted = 1;
- kill(pid, SIGKILL);
+ kill(-pid, SIGKILL);
waitflags = 0;
}
}
@@ -371,6 +371,7 @@ run_ptests(struct ptest_list *head, const struct ptest_options opts,
rc = -1;
break;
} else if (child == 0) {
+ setsid();
run_child(p->run_ptest, pipefd_stdout[1], pipefd_stderr[1]);
} else {
int status;

View File

@@ -1,76 +0,0 @@
From e58e4e1a7f854953f823dc5135d35f728f253f31 Mon Sep 17 00:00:00 2001
From: Richard Purdie <richard.purdie@linuxfoundation.org>
Date: Thu, 4 Apr 2019 14:24:14 +0100
Subject: [PATCH 3/3] utils: Ensure pipes are read after exit
There was a race in the code where the pipes may not be read after the process has exited
and data may be left behind in them. This change to ordering ensures the pipes are read
after the exit code has been read meaning no data can be left behind and the logs should
be complete.
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Upstream-Status: Pending [code being tested]
---
utils.c | 29 ++++++++++++++++-------------
1 file changed, 16 insertions(+), 13 deletions(-)
diff --git a/utils.c b/utils.c
index c5b3b8d..37e88ab 100644
--- a/utils.c
+++ b/utils.c
@@ -264,6 +264,7 @@ wait_child(const char *ptest_dir, const char *run_ptest, pid_t pid, pid_t group,
struct pollfd pfds[2];
struct timespec sentinel;
clockid_t clock = CLOCK_MONOTONIC;
+ int looping = 1;
int r;
int status;
@@ -281,9 +282,23 @@ wait_child(const char *ptest_dir, const char *run_ptest, pid_t pid, pid_t group,
*timeouted = 0;
- while (1) {
+ while (looping) {
waitflags = WNOHANG;
+ if (timeout >= 0) {
+ struct timespec time;
+
+ clock_gettime(clock, &time);
+ if ((time.tv_sec - sentinel.tv_sec) > timeout) {
+ *timeouted = 1;
+ kill(-pid, SIGKILL);
+ waitflags = 0;
+ }
+ }
+
+ if (waitpid(pid, &status, waitflags) == pid)
+ looping = 0;
+
r = poll(pfds, 2, WAIT_CHILD_POLL_TIMEOUT_MS);
if (r > 0) {
char buf[WAIT_CHILD_BUF_MAX_SIZE];
@@ -303,19 +318,7 @@ wait_child(const char *ptest_dir, const char *run_ptest, pid_t pid, pid_t group,
}
clock_gettime(clock, &sentinel);
- } else if (timeout >= 0) {
- struct timespec time;
-
- clock_gettime(clock, &time);
- if ((time.tv_sec - sentinel.tv_sec) > timeout) {
- *timeouted = 1;
- kill(-pid, SIGKILL);
- waitflags = 0;
- }
}
-
- if (waitpid(pid, &status, waitflags) == pid)
- break;
}
fflush(fps[0]);
--
2.17.1

View File

@@ -1,212 +0,0 @@
From 79698d3205dedba887e0d2492de945d3079de029 Mon Sep 17 00:00:00 2001
From: Randy MacLeod <Randy.MacLeod@windriver.com>
Date: Thu, 6 Jun 2019 17:03:50 -0400
Subject: [PATCH] utils: ensure child can be session leader
When running the run-execscript bash ptest as a user rather than root, a warning:
bash: cannot set terminal process group (16036): Inappropriate ioctl for device
bash: no job control in this shell
contaminates the bash log files causing the test to fail. This happens only
when run under ptest-runner and not when interactively testing!
The changes made to fix this include:
1. Get the process group id (pgid) before forking,
2. Set the pgid in both the parent and child to avoid a race,
3. Find, open and set permission on the child tty, and
4. Allow the child to attach to controlling tty.
Also add '-lutil' to Makefile. This lib is from libc and provides openpty.
Upstream-Status: Submitted [yocto@yoctoproject.org]
Signed-off-by: Sakib Sajal <sakib.sajal@windriver.com>
Signed-off-by: Randy MacLeod <Randy.MacLeod@windriver.com>
---
Makefile | 2 +-
utils.c | 102 +++++++++++++++++++++++++++++++++++++++++++++++++------
2 files changed, 92 insertions(+), 12 deletions(-)
diff --git a/Makefile b/Makefile
index 1bde7be..439eb79 100644
--- a/Makefile
+++ b/Makefile
@@ -29,7 +29,7 @@ TEST_DATA=$(shell echo `pwd`/tests/data)
all: $(SOURCES) $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
- $(CC) $(LDFLAGS) $(OBJECTS) -o $@
+ $(CC) $(LDFLAGS) $(OBJECTS) -lutil -o $@
tests: $(TEST_SOURCES) $(TEST_EXECUTABLE)
diff --git a/utils.c b/utils.c
index ad737c2..f11ce39 100644
--- a/utils.c
+++ b/utils.c
@@ -1,5 +1,6 @@
/**
* Copyright (c) 2016 Intel Corporation
+ * Copyright (C) 2019 Wind River Systems, Inc.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -22,23 +23,27 @@
*/
#define _GNU_SOURCE
+
#include <stdio.h>
+#include <dirent.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <grp.h>
#include <libgen.h>
-#include <signal.h>
#include <poll.h>
-#include <fcntl.h>
+#include <pty.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <string.h>
#include <time.h>
-#include <dirent.h>
+#include <unistd.h>
+
+#include <sys/ioctl.h>
#include <sys/resource.h>
+#include <sys/stat.h>
#include <sys/types.h>
#include <sys/wait.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include <errno.h>
#include "ptest_list.h"
#include "utils.h"
@@ -346,6 +351,53 @@ wait_child(const char *ptest_dir, const char *run_ptest, pid_t pid,
return status;
}
+/* Returns an integer file descriptor.
+ * If it returns < 0, an error has occurred.
+ * Otherwise, it has returned the slave pty file descriptor.
+ * fp should be writable, likely stdout/err.
+ */
+static int
+setup_slave_pty(FILE *fp) {
+ int pty_master = -1;
+ int pty_slave = -1;
+ char pty_name[256];
+ struct group *gptr;
+ gid_t gid;
+ int slave = -1;
+
+ if (openpty(&pty_master, &pty_slave, pty_name, NULL, NULL) < 0) {
+ fprintf(fp, "ERROR: openpty() failed with: %s.\n", strerror(errno));
+ return -1;
+ }
+
+ if ((gptr = getgrnam(pty_name)) != 0) {
+ gid = gptr->gr_gid;
+ } else {
+ /* If the tty group does not exist, don't change the
+ * group on the slave pty, only the owner
+ */
+ gid = -1;
+ }
+
+ /* chown/chmod the corresponding pty, if possible.
+ * This will only work if the process has root permissions.
+ */
+ if (chown(pty_name, getuid(), gid) != 0) {
+ fprintf(fp, "ERROR; chown() failed with: %s.\n", strerror(errno));
+ }
+
+ /* Makes the slave read/writeable for the user. */
+ if (chmod(pty_name, S_IRUSR|S_IWUSR) != 0) {
+ fprintf(fp, "ERROR: chmod() failed with: %s.\n", strerror(errno));
+ }
+
+ if ((slave = open(pty_name, O_RDWR)) == -1) {
+ fprintf(fp, "ERROR: open() failed with: %s.\n", strerror(errno));
+ }
+ return (slave);
+}
+
+
int
run_ptests(struct ptest_list *head, const struct ptest_options opts,
const char *progname, FILE *fp, FILE *fp_stderr)
@@ -362,6 +414,8 @@ run_ptests(struct ptest_list *head, const struct ptest_options opts,
int timeouted;
time_t sttime, entime;
int duration;
+ int slave;
+ int pgid = -1;
if (opts.xml_filename) {
xh = xml_create(ptest_list_length(head), opts.xml_filename);
@@ -379,7 +433,6 @@ run_ptests(struct ptest_list *head, const struct ptest_options opts,
close(pipefd_stdout[1]);
break;
}
-
fprintf(fp, "START: %s\n", progname);
PTEST_LIST_ITERATE_START(head, p);
char *ptest_dir = strdup(p->run_ptest);
@@ -388,6 +441,13 @@ run_ptests(struct ptest_list *head, const struct ptest_options opts,
break;
}
dirname(ptest_dir);
+ if (ioctl(0, TIOCNOTTY) == -1) {
+ fprintf(fp, "ERROR: Unable to detach from controlling tty, %s\n", strerror(errno));
+ }
+
+ if ((pgid = getpgid(0)) == -1) {
+ fprintf(fp, "ERROR: getpgid() failed, %s\n", strerror(errno));
+ }
child = fork();
if (child == -1) {
@@ -395,13 +455,33 @@ run_ptests(struct ptest_list *head, const struct ptest_options opts,
rc = -1;
break;
} else if (child == 0) {
- setsid();
+ close(0);
+ if ((slave = setup_slave_pty(fp)) < 0) {
+ fprintf(fp, "ERROR: could not setup pty (%d).", slave);
+ }
+ if (setpgid(0,pgid) == -1) {
+ fprintf(fp, "ERROR: setpgid() failed, %s\n", strerror(errno));
+ }
+
+ if (setsid() == -1) {
+ fprintf(fp, "ERROR: setsid() failed, %s\n", strerror(errno));
+ }
+
+ if (ioctl(0, TIOCSCTTY, NULL) == -1) {
+ fprintf(fp, "ERROR: Unable to attach to controlling tty, %s\n", strerror(errno));
+ }
+
run_child(p->run_ptest, pipefd_stdout[1], pipefd_stderr[1]);
+
} else {
int status;
int fds[2]; fds[0] = pipefd_stdout[0]; fds[1] = pipefd_stderr[0];
FILE *fps[2]; fps[0] = fp; fps[1] = fp_stderr;
+ if (setpgid(child, pgid) == -1) {
+ fprintf(fp, "ERROR: setpgid() failed, %s\n", strerror(errno));
+ }
+
sttime = time(NULL);
fprintf(fp, "%s\n", get_stime(stime, GET_STIME_BUF_SIZE, sttime));
fprintf(fp, "BEGIN: %s\n", ptest_dir);
--
2.17.0

View File

@@ -7,14 +7,10 @@ HOMEPAGE = "http://git.yoctoproject.org/cgit/cgit.cgi/ptest-runner2/about/"
LICENSE = "GPLv2"
LIC_FILES_CHKSUM = "file://LICENSE;md5=751419260aa954499f7abaabaa882bbe"
SRCREV = "63d097cc46142157931682fed076b5407757a0bd"
PV = "2.3.1+git${SRCPV}"
SRCREV = "7015e9199ce748c0717addeebe7a8c47448bab03"
PV = "2.3.2+git${SRCPV}"
SRC_URI = "git://git.yoctoproject.org/ptest-runner2 \
file://0001-utils-Ensure-stdout-stderr-are-flushed.patch \
file://0002-use-process-groups-when-spawning.patch \
file://0003-utils-Ensure-pipes-are-read-after-exit.patch \
file://0004-utils-ensure-child-can-be-session-leader.patch \
"
S = "${WORKDIR}/git"