mirror of
https://repo.or.cz/socat.git
synced 2025-07-15 15:43:24 +00:00
fixed sporadic data loss on pid reuse
This commit is contained in:
parent
976d6f0b75
commit
49c0505298
4 changed files with 25 additions and 23 deletions
25
xiosigchld.c
25
xiosigchld.c
|
@ -1,5 +1,5 @@
|
|||
/* source: xiosigchld.c */
|
||||
/* Copyright Gerhard Rieger 2001-2008 */
|
||||
/* Copyright Gerhard Rieger 2001-2011 */
|
||||
/* Published under the GNU General Public License V.2, see file COPYING */
|
||||
|
||||
/* this is the source of the extended child signal handler */
|
||||
|
@ -10,10 +10,8 @@
|
|||
|
||||
|
||||
/*!! with socat, at most 4 exec children exist */
|
||||
pid_t diedunknown1; /* child died before it is registered */
|
||||
pid_t diedunknown2;
|
||||
pid_t diedunknown3;
|
||||
pid_t diedunknown4;
|
||||
pid_t diedunknown[NUMUNKNOWN]; /* children that died before they were registered */
|
||||
size_t nextunknown;
|
||||
|
||||
|
||||
/* register for a xio filedescriptor a callback (handler).
|
||||
|
@ -114,19 +112,12 @@ void childdied(int signum) {
|
|||
}
|
||||
if (i == XIO_MAXSOCK) {
|
||||
Info2("childdied(%d): cannot identify child %d", signum, pid);
|
||||
if (diedunknown1 == 0) {
|
||||
diedunknown1 = pid;
|
||||
Debug("saving pid in diedunknown1");
|
||||
} else if (diedunknown2 == 0) {
|
||||
diedunknown2 = pid;
|
||||
Debug("saving pid in diedunknown2");
|
||||
} else if (diedunknown3 == 0) {
|
||||
diedunknown3 = pid;
|
||||
Debug("saving pid in diedunknown3");
|
||||
} else {
|
||||
diedunknown4 = pid;
|
||||
Debug("saving pid in diedunknown4");
|
||||
if (nextunknown == NUMUNKNOWN) {
|
||||
nextunknown = 0;
|
||||
}
|
||||
diedunknown[nextunknown++] = pid;
|
||||
Debug1("saving pid in diedunknown%u",
|
||||
nextunknown/*sic, for compatibility*/);
|
||||
}
|
||||
|
||||
if (WIFEXITED(status)) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue