stream_cli.c: Handle read / recvfrom error and close connection

If read or recvfrom fails or returns 0, the connection must be closed.
This is already done when a write / send fails. In both cases the
disconnect callback is called to notify the user's client.

Not handling the error may cause an infinite loop of read or recvfrom
failures.

Related: OS#6405
Change-Id: I55426de6b49cb4cb0797e50dfeae11f2efc29b15
This commit is contained in:
Andreas Eversberg 2024-03-15 14:14:46 +01:00 committed by laforge
parent ed62d190b6
commit 5fec34a9f2
1 changed files with 11 additions and 3 deletions

View File

@ -449,9 +449,13 @@ static void stream_cli_iofd_read_cb(struct osmo_io_fd *iofd, int res, struct msg
stream_cli_handle_connecting(cli, res);
break;
case STREAM_CLI_STATE_CONNECTED:
if (res == 0)
if (res <= 0) {
LOGSCLI(cli, LOGL_NOTICE, "received result %d in response to read\n", res);
osmo_stream_cli_reconnect(cli);
else if (cli->iofd_read_cb)
msgb_free(msg);
break;
}
if (cli->iofd_read_cb)
cli->iofd_read_cb(cli, msg);
else
msgb_free(msg);
@ -500,8 +504,12 @@ static void stream_cli_iofd_recvmsg_cb(struct osmo_io_fd *iofd, int res, struct
stream_cli_handle_connecting(cli, res);
break;
case STREAM_CLI_STATE_CONNECTED:
if (res == 0)
if (res <= 0) {
LOGSCLI(cli, LOGL_NOTICE, "received result %d in response to recvmsg\n", res);
osmo_stream_cli_reconnect(cli);
msgb_free(msg);
break;
}
/* Forward message to read callback, also if the connection failed. */
if (cli->iofd_read_cb)
cli->iofd_read_cb(cli, msg);