Hi!
> +static int timed_read_kmsg(int fd, int timeout_sec)
> +{
> +     int child, status, ret = 0;
> +     int pipefd[2];
> +     char msg[MAX_MSGSIZE];
> +
> +     if (pipe(pipefd) != 0)
> +             tst_brkm(TBROK|TERRNO, cleanup, "pipe failed");
> +
> +     child = fork();
> +     switch (child) {
> +     case -1:
> +             tst_brkm(TBROK|TERRNO, cleanup, "failed to fork");
> +     case 0:
> +             /* child does all the reading and keeps writing to
> +              * pipe to let parent know that it didn't block */
> +             SAFE_CLOSE(NULL, pipefd[0]);

There is a problem with calling the SAFE_ macros from child processes.
The SAFE_ macros use tst_brkm() interface to halt program execution (in
case of failure) which is not supposed to be used from child and may
lead to unexpected results.

> +static void test_seek(void)
> +{
> +     int k, j = NUM_READ_RETRY, fd;
> +     char msg[MAX_MSGSIZE];
> +     unsigned long seqno[2];
> +
> +     /* 1. read() after SEEK_SET 0 returns same (first) message */
> +     tst_resm(TINFO, "TEST: seek SEEK_SET 0");
> +
> +     fd = open("/dev/kmsg", O_RDONLY | O_NONBLOCK);
> +     if (fd < 0)
> +             tst_brkm(TBROK|TERRNO, cleanup, "failed to open /dev/kmsg");
> +
> +     while (j) {
> +             for (k = 0; k < 2; k++) {
> +                     TEST(read(fd, msg, sizeof(msg)));
> +                     if (TEST_RETURN == -1) {
> +                             if (errno == EPIPE)
> +                                     break;
> +                             else
> +                                     tst_brkm(TBROK|TTERRNO, cleanup,
> +                                             "failed to read /dev/kmsg");
> +                     }
> +                     if (get_msg_fields(msg, NULL, &seqno[k]) != 0)
> +                             tst_resm(TFAIL, "failed to parse seqid: %s",
> +                                     msg);
> +                     if (k == 0)
> +                             if (lseek(fd, 0, SEEK_SET) == -1)
> +                                     tst_resm(TFAIL|TERRNO,
> +                                             "SEEK_SET 0 failed");
> +             }
> +
> +             if (TEST_RETURN != -1)
> +                     break;
> +
> +             /* give a second to whoever overwrote first message to finish */
> +             sleep(1);
> +             j--;
> +
> +             /* read returned EPIPE, reopen fd and try again */
> +             SAFE_CLOSE(cleanup, fd);
> +             fd = open("/dev/kmsg", O_RDONLY | O_NONBLOCK);
> +             if (fd < 0)
> +                     tst_brkm(TBROK|TERRNO, cleanup,
> +                             "failed to open /dev/kmsg");

I guess that the comment says something different than the code, there
is no read involved here.


Acked with change from SAFE_CLOSE() to close() in the child process.

-- 
Cyril Hrubis
[email protected]

------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:

Build for Windows Store.

http://p.sf.net/sfu/windows-dev2dev
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to