On 07/07/2020 09:56, Jason Wang wrote:
>
> On 2020/7/2 上午3:39, Laurent Vivier wrote:
>> +void qemu_set_nonblock(int fd)
>> +{
>> + int f;
>> + f = qemu_try_set_nonblock(fd);
>> + assert(f == 0);
>> }
>
>
> So we keep this assert which means it can still be triggered from monitor?
>
> I don't check all the callers, but I got:
>
> in tap_init_one() we had:
>
> if (vhostfdname) {
> vhostfd = monitor_fd_param(cur_mon, vhostfdname, &err);
> if (vhostfd == -1) {
> if (tap->has_vhostforce && tap->vhostforce) {
> error_propagate(errp, err);
> } else {
> warn_report_err(err);
> }
> return;
> }
> qemu_set_nonblock(vhostfd);
> } else {
>
> and in net_init_socket() we had:
>
> if (sock->has_fd) {
> int fd;
>
> fd = monitor_fd_param(cur_mon, sock->fd, errp);
> if (fd == -1) {
> return -1;
> }
> qemu_set_nonblock(fd);
> if (!net_socket_fd_init(peer, "socket", name, fd, 1, sock->mcast,
> errp)) {
> return -1;
> }
> return 0;
> }
>
Yes, I think you're right, all fd that come from monitor and passed to
qemu_set_nonblock() before any other use should use
qemu_try_set_nonblock() and report an error.
I update my patch accordingly.
Thanks,
Laurent