diff options
author | Volker Lendecke <vl@samba.org> | 2013-08-28 11:34:08 +0000 |
---|---|---|
committer | Karolin Seeger <kseeger@samba.org> | 2013-09-12 09:08:16 +0200 |
commit | c4166d04324ecf8d87c5afb5903f5ab41107e5e7 (patch) | |
tree | 16bdadf25ac89baccb2d74e73d9626e4ecc3ccf4 | |
parent | 7d791d5821fc50a5dcaa42b3cc63e2fea41f541e (diff) | |
download | samba-c4166d04324ecf8d87c5afb5903f5ab41107e5e7.tar.gz |
dbwrap_ctdb: Treat empty records as non-existing
This is a patch implementing the workaround Christian mentioned in
https://bugzilla.samba.org/show_bug.cgi?id=10008#c5
Bug: https://bugzilla.samba.org/show_bug.cgi?id=10008
Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Christian Ambach <ambi@samba.org>
(cherry picked from commit 1cae59ce112ccb51b45357a52b902f80fce1eef1)
-rw-r--r-- | source3/lib/ctdbd_conn.c | 8 | ||||
-rw-r--r-- | source3/lib/dbwrap/dbwrap_ctdb.c | 10 |
2 files changed, 18 insertions, 0 deletions
diff --git a/source3/lib/ctdbd_conn.c b/source3/lib/ctdbd_conn.c index 1481a9c1852..630b22e6c50 100644 --- a/source3/lib/ctdbd_conn.c +++ b/source3/lib/ctdbd_conn.c @@ -1475,6 +1475,14 @@ NTSTATUS ctdbd_parse(struct ctdbd_connection *conn, uint32_t db_id, goto fail; } + if (reply->datalen == 0) { + /* + * Treat an empty record as non-existing + */ + status = NT_STATUS_NOT_FOUND; + goto fail; + } + parser(key, make_tdb_data(&reply->data[0], reply->datalen), private_data); diff --git a/source3/lib/dbwrap/dbwrap_ctdb.c b/source3/lib/dbwrap/dbwrap_ctdb.c index f90e7b80f1e..5a473f98afe 100644 --- a/source3/lib/dbwrap/dbwrap_ctdb.c +++ b/source3/lib/dbwrap/dbwrap_ctdb.c @@ -103,6 +103,16 @@ static int db_ctdb_ltdb_parser(TDB_DATA key, TDB_DATA data, if (data.dsize < sizeof(struct ctdb_ltdb_header)) { return -1; } + if (data.dsize == sizeof(struct ctdb_ltdb_header)) { + /* + * Making this a separate case that needs fixing + * separately. This is an empty record. ctdbd does not + * distinguish between empty and deleted records. Samba right + * now can live without empty records, so lets treat zero-size + * (i.e. deleted) records as non-existing. + */ + return -1; + } state->parser( key, (struct ctdb_ltdb_header *)data.dptr, make_tdb_data(data.dptr + sizeof(struct ctdb_ltdb_header), |