Per request of Mike Frysinger, I resend this patch. The patch itself is  the same, but the explanation is extended. Hope it's better this time.
Hello,
I'm sorry to say this, but some changes in the "Fix Warnings and Badness v2" patch[1] from October actually create bugs in the ltp tests. I think they should be reverted by applying the attached patch. The problems are of those types:
1) Calling:
pthread_create(&th, &newattr, (void *)&new_thread, (void *)&newsockfd)
is wrong if eg. newsockfd is a variable subsequently modified by the parent thread, not protected by locking. This is because there is a data race between the read in the new thread and the write in the parent thread. Moreover, it is quite often meant to pass different values to more threads in the ltp tests, which results in the different threads actually sharing the variable, which leads to unpredictable results.
2) Calling
pthread_exit((void *)&exit_val);
is wrong if exit_val is a local or thread-local variable, incl. errno. These variables cease to exist when the thread finishes, so subsequent dereferencing & read in the joining thread would read nonexistent variable. I think they should be reverted, because the warning (conversion pointer/integer) doesn't mean anything bad in this context (provided you use the same type on both sides, eg. the calling thread and the created thread) and other solutions just add unnecessary complexity.
The patch goes a little further, while I was searching for related problems, I've found one typo and changed the signatures of some thread functions (they really should be (void* (*)(void*)), not (void* (*)(int))).
I've discovered this when I debugged a deadlock in test_1_to_1_threads. BTW, shouldn't the first (or last) thread in this test call t_recv instead of t_send (see the relay function). Signed-Of-By: Jiří Paleček <jpalecek@web.de>.
9 files changed