|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v14 15/17] net: stream: move to QIO to enable additional parameters
Laurent Vivier <lvivier@xxxxxxxxxx> writes:
> On 10/21/22 12:35, Markus Armbruster wrote:
>> Philippe Mathieu-Daudé <philmd@xxxxxxxxxx> writes:
>>
>>> On 21/10/22 11:09, Laurent Vivier wrote:
>>>> Use QIOChannel, QIOChannelSocket and QIONetListener.
>>>> This allows net/stream to use all the available parameters provided by
>>>> SocketAddress.
>>>> Signed-off-by: Laurent Vivier <lvivier@xxxxxxxxxx>
>>>> Acked-by: Michael S. Tsirkin <mst@xxxxxxxxxx>
>>>> ---
>>>> net/stream.c | 492 +++++++++++++++++-------------------------------
>>>> qemu-options.hx | 4 +-
>>>> 2 files changed, 178 insertions(+), 318 deletions(-)
>>>
>>>> -static void net_stream_accept(void *opaque)
>>>> +static void net_stream_server_listening(QIOTask *task, gpointer opaque)
>>>> {
>>>> NetStreamState *s = opaque;
>>>> - struct sockaddr_storage saddr;
>>>> - socklen_t len;
>>>> - int fd;
>>>> -
>>>> - for (;;) {
>>>> - len = sizeof(saddr);
>>>> - fd = qemu_accept(s->listen_fd, (struct sockaddr *)&saddr, &len);
>>>> - if (fd < 0 && errno != EINTR) {
>>>> - return;
>>>> - } else if (fd >= 0) {
>>>> - qemu_set_fd_handler(s->listen_fd, NULL, NULL, NULL);
>>>> - break;
>>>> - }
>>>> - }
>>>> + QIOChannelSocket *listen_sioc = QIO_CHANNEL_SOCKET(s->listen_ioc);
>>>> + SocketAddress *addr;
>>>> + int ret;
>>>> - s->fd = fd;
>>>> - s->nc.link_down = false;
>>>> - net_stream_connect(s);
>>>> - switch (saddr.ss_family) {
>>>> - case AF_INET: {
>>>> - struct sockaddr_in *saddr_in = (struct sockaddr_in *)&saddr;
>>>> -
>>>> - qemu_set_info_str(&s->nc, "connection from %s:%d",
>>>> - inet_ntoa(saddr_in->sin_addr),
>>>> - ntohs(saddr_in->sin_port));
>>>> - break;
>>>> + if (listen_sioc->fd < 0) {
>>>> + qemu_set_info_str(&s->nc, "connection error");
>>>> + return;
>>>> }
>>>> - case AF_UNIX: {
>>>> - struct sockaddr_un saddr_un;
>>>> - len = sizeof(saddr_un);
>>>> - getsockname(s->listen_fd, (struct sockaddr *)&saddr_un, &len);
>>>> - qemu_set_info_str(&s->nc, "connect from %s", saddr_un.sun_path);
>>>> - break;
>>>> - }
>>>> - default:
>>>> - g_assert_not_reached();
>>>> + addr = qio_channel_socket_get_local_address(listen_sioc, NULL);
>>>> + g_assert(addr != NULL);
>>>
>>> Missing propagating Error* (observed in v12).
>>
>> *If* this is really a programming error: what about &error_abort?
>
> assert() informs the compiler that following code will not use addr with a
> NULL value, I
> don't think &error_abort does that. This could avoid an error report in code
> static analyzer.
I'd expect Coverity to see right through it.
Static analyzers with a less global view won't, of course.
For what it's worth, there are about a thousand uses of &error_abort
outside tests/. I'm not aware of them confusing static analyzers we
care about.
I like &error_abort, because it makes the program crash when we try to
put the error into &error_abort, with an informative message. This is
often right where things go wrong[*]. I personally don't care much
about the better message, but others do. The better stack backtrace has
been quite useful to me.
Let's use &error_abort, and throw in the assert when a static analyzer
we care about needs it.
[*] error_propagate() messes this up. That's why the comments in
error.h ask you to do without when practical.
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |