1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-22 13:34:15 +03:00

ctdb-protocol: Avoid fgets in ctdb_connection_list_read

C library buffering API can behave in unexpected fashion if underlying
fd for stdin, stdout or stderr is closed and re-opened.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=13520

Signed-off-by: Amitay Isaacs <amitay@gmail.com>
Reviewed-by: Martin Schwenke <martin@meltin.net>
This commit is contained in:
Amitay Isaacs 2018-07-11 18:35:46 +10:00 committed by Martin Schwenke
parent c7041b0faf
commit c9b42d27e6
2 changed files with 51 additions and 39 deletions

View File

@ -22,6 +22,8 @@
#include <talloc.h>
#include "common/line.h"
#include "protocol.h"
#include "protocol_util.h"
@ -642,56 +644,66 @@ const char *ctdb_connection_list_to_string(
return out;
}
struct ctdb_connection_list_read_state {
struct ctdb_connection_list *list;
bool client_first;
};
static int ctdb_connection_list_read_line(char *line, void *private_data)
{
struct ctdb_connection_list_read_state *state =
(struct ctdb_connection_list_read_state *)private_data;
struct ctdb_connection conn;
int ret;
/* Skip empty lines */
if (line[0] == '\0') {
return 0;
}
/* Comment */
if (line[0] == '#') {
return 0;
}
ret = ctdb_connection_from_string(line, state->client_first, &conn);
if (ret != 0) {
return ret;
}
ret = ctdb_connection_list_add(state->list, &conn);
if (ret != 0) {
return ret;
}
return 0;
}
int ctdb_connection_list_read(TALLOC_CTX *mem_ctx, bool client_first,
struct ctdb_connection_list **conn_list)
{
struct ctdb_connection_list *list;
char line[128]; /* long enough for IPv6 */
struct ctdb_connection_list_read_state state;
int ret;
if (conn_list == NULL) {
return EINVAL;
}
list = talloc_zero(mem_ctx, struct ctdb_connection_list);
if (list == NULL) {
state.list = talloc_zero(mem_ctx, struct ctdb_connection_list);
if (state.list == NULL) {
return ENOMEM;
}
while (fgets(line, sizeof(line), stdin) != NULL) {
char *t;
struct ctdb_connection conn;
state.client_first = client_first;
/* Skip empty lines */
if (line[0] == '\n') {
continue;
}
ret = line_read(0,
128,
mem_ctx,
ctdb_connection_list_read_line,
&state,
NULL);
/* Comment */
if (line[0] == '#') {
continue;
}
*conn_list = state.list;
t = strtok(line, "\n");
if (t == NULL) {
goto fail;
}
ret = ctdb_connection_from_string(t, client_first, &conn);
if (ret != 0) {
goto fail;
}
ret = ctdb_connection_list_add(list, &conn);
if (ret != 0) {
goto fail;
}
}
*conn_list = list;
return 0;
fail:
talloc_free(list);
return EINVAL;
return ret;
}

View File

@ -434,7 +434,7 @@ def build(bld):
bld.SAMBA_SUBSYSTEM('ctdb-protocol-util',
source='protocol/protocol_util.c',
deps='replace talloc tdb')
deps='ctdb-util replace talloc tdb')
bld.SAMBA_SUBSYSTEM('ctdb-client',
source=bld.SUBDIR('client',
@ -938,7 +938,7 @@ def build(bld):
bld.SAMBA_BINARY(target,
source=src,
deps='''ctdb-protocol-tests-common
samba-util talloc tdb''',
samba-util ctdb-util talloc tdb''',
install_path='${CTDB_TEST_LIBEXECDIR}')
bld.SAMBA_BINARY('event_protocol_test',