@@ -153,13 +153,33 @@ __asm__(
153153 " mov (%r13,%rcx), %rsi\n"
154154 " mov fspy_recursive_slot_rdx(%rip), %rcx\n"
155155 " mov (%r13,%rcx), %rdx\n"
156+ " mov 40(%rsi), %r8\n" /* preserve msghdr.msg_controllen */
157+ " xor %r10d, %r10d\n" /* one zero-length record may be skipped */
158+ ".Lfspy_recvmsg_retry:\n"
156159 " mov fspy_recursive_slot_magic(%rip), %r9\n"
157160 " mov $47, %eax\n" /* __NR_recvmsg */
158161 " syscall\n"
159162 " mov %rax, %r15\n"
160163 " test %rax, %rax\n"
161164 " js .Lfspy_recvmsg_error\n"
162- " jz .Lfspy_recvmsg_eof\n"
165+ " jnz .Lfspy_recvmsg_positive\n"
166+ " test %r10d, %r10d\n"
167+ " jnz .Lfspy_recvmsg_eof\n"
168+ " mov $1, %r10d\n"
169+ " mov %r8, 40(%rsi)\n"
170+ " lea .Lfspy_recvmsg_retry_message(%rip), %rsi\n"
171+ " mov $34, %edx\n"
172+ " mov $2, %edi\n"
173+ " mov $1, %eax\n" /* __NR_write */
174+ " syscall\n"
175+ " mov fspy_recursive_slot_rsi(%rip), %rcx\n"
176+ " mov (%r13,%rcx), %rsi\n"
177+ " mov fspy_recursive_slot_rdi(%rip), %rcx\n"
178+ " mov (%r13,%rcx), %rdi\n"
179+ " mov fspy_recursive_slot_rdx(%rip), %rcx\n"
180+ " mov (%r13,%rcx), %rdx\n"
181+ " jmp .Lfspy_recvmsg_retry\n"
182+ ".Lfspy_recvmsg_positive:\n"
163183 " lea .Lfspy_recvmsg_positive_message(%rip), %rsi\n"
164184 " mov $32, %edx\n"
165185 " jmp .Lfspy_recvmsg_log\n"
@@ -390,6 +410,7 @@ __asm__(
390410 ".Lfspy_recvmsg_error_message: .ascii \"fspy: recvmsg returned error\\n\"\n"
391411 ".Lfspy_recvmsg_eintr_message: .ascii \"fspy: recvmsg returned EINTR\\n\"\n"
392412 ".Lfspy_recvmsg_enoent_message: .ascii \"fspy: recvmsg returned ENOENT\\n\"\n"
413+ ".Lfspy_recvmsg_retry_message: .ascii \"fspy: recvmsg skipped zero record\\n\"\n"
393414 ".balign 8\n"
394415 "fspy_recursive_slot_rax: .quad 0\n"
395416 "fspy_recursive_slot_rdi: .quad 0\n"
@@ -589,6 +610,7 @@ static void install_filter(void)
589610 FILTER_GATEWAY_BLOCK (SYS_execve , FILTER_TAG ),
590611 FILTER_GATEWAY_BLOCK (SYS_execveat , FILTER_TAG ),
591612 FILTER_GATEWAY_BLOCK (SYS_rt_sigaction , FILTER_TAG ),
613+ FILTER_GATEWAY_BLOCK (SYS_rt_sigprocmask , FILTER_TAG ),
592614 BPF_STMT (BPF_RET | BPF_K , SECCOMP_RET_ALLOW ),
593615 };
594616 const bool minimal = getenv ("FSPY_MINIMAL_FILTER" ) != NULL ;
0 commit comments