From a853f21633693f9eefc4949660253a5328d2d2f3 Mon Sep 17 00:00:00 2001 From: "Yann E. MORIN" Date: Sun, 13 Aug 2017 23:21:54 +0200 Subject: [PATCH] communicate: check return status of msgrcv() msgrcv can return with -1 to indicate an error condition. One such error is to have been interrupted by a signal. Being interrupted by a signal is very rare in this code, except in a very special condition: a highly-parallel (1000 jobs!) mksquashfs on a filesystem with extended attributes, where we see errors like (those are mksquashfs errors): llistxattr for titi/603/883 failed in read_attrs, because Unknown error 1716527536 See: https://bugs.busybox.net/show_bug.cgi?id=10141 In this case, we just have to retry the call to msgrcv(). Signed-off-by: "Yann E. MORIN" --- communicate.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/communicate.c b/communicate.c index 293f404..787bb63 100644 --- a/communicate.c +++ b/communicate.c @@ -553,10 +553,13 @@ void send_get_fakem(struct fake_msg *buf) l=msgrcv(msg_get, (struct my_msgbuf*)buf, sizeof(*buf)-sizeof(buf->mtype),0,0); - while((buf->serial!=serial)||buf->pid!=pid); + while(((l==-1)&&(errno==EINTR))||(buf->serial!=serial)||buf->pid!=pid); semaphore_down(); + if(l==-1) + buf->xattr.flags_rc=errno; + /* (nah, may be wrong, due to allignment) -- 2.11.0