Currently, if we see an error when writing to a client, we free the
client immediately. This means that any pending reads will be discarded.
Additionally, if a client disconnects before we have finished the writes in
discover_server_process_connection, we won't register the waiter to read
from the socket.
Instead of freeing the client on write failure, this change sets a flag
(se we don't continue to write), and we rely on the read EOF to free the
client. This means we don't drop incoming messages.
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
struct list_item list;
struct waiter *waiter;
int fd;
+ bool remote_closed;
};
{
int rc;
+ if (client->remote_closed)
+ return -1;
+
rc = pb_protocol_write_message(client->fd, message);
if (rc)
- talloc_free(client);
+ client->remote_closed = true;
return rc;
}
client->fd = fd;
client->server = server;
+ client->waiter = waiter_register_io(server->waitset, client->fd,
+ WAIT_IN, discover_server_process_message,
+ client);
/* send sysinfo to client */
rc = write_system_info_message(server, client, system_info_get());
}
}
- client->waiter = waiter_register_io(server->waitset, client->fd,
- WAIT_IN, discover_server_process_message,
- client);
-
return 0;
}