summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregor Beck <gbeck@sernet.de>2013-03-12 13:43:30 +0100
committerMichael Adam <obnox@samba.org>2013-04-18 13:15:11 +0200
commit9d47dc8958f7fcab77460495bd1ae940122dddd8 (patch)
treecdfc6d184a773007677b1774668cedcfd1a03317
parent49cd31e39d70c090c448df5a9b6c50ca83e06f9b (diff)
downloadsamba-9d47dc8958f7fcab77460495bd1ae940122dddd8.tar.gz
samba-9d47dc8958f7fcab77460495bd1ae940122dddd8.tar.bz2
samba-9d47dc8958f7fcab77460495bd1ae940122dddd8.zip
s3:smbXsrv_open: factor out smbXsrv_open_global_parse_record
Signed-off-by: Gregor Beck <gbeck@sernet.de> Reviewed-by: Michael Adam <obnox@samba.org> Reviewed-by: Stefan Metzmacher <metze@samba.org>
-rw-r--r--source3/smbd/smbXsrv_open.c50
1 files changed, 36 insertions, 14 deletions
diff --git a/source3/smbd/smbXsrv_open.c b/source3/smbd/smbXsrv_open.c
index 2c2798b5c8..97d6cd48eb 100644
--- a/source3/smbd/smbXsrv_open.c
+++ b/source3/smbd/smbXsrv_open.c
@@ -1279,21 +1279,16 @@ NTSTATUS smb2srv_open_recreate(struct smbXsrv_connection *conn,
}
-struct smbXsrv_open_global_traverse_state {
- int (*fn)(struct smbXsrv_open_global0 *, void *);
- void *private_data;
-};
-
-static int smbXsrv_open_global_traverse_fn(struct db_record *rec, void *data)
+static NTSTATUS smbXsrv_open_global_parse_record(TALLOC_CTX *mem_ctx,
+ struct db_record *rec,
+ struct smbXsrv_open_global0 **global)
{
- int ret = -1;
- struct smbXsrv_open_global_traverse_state *state =
- (struct smbXsrv_open_global_traverse_state*)data;
TDB_DATA key = dbwrap_record_get_key(rec);
TDB_DATA val = dbwrap_record_get_value(rec);
DATA_BLOB blob = data_blob_const(val.dptr, val.dsize);
struct smbXsrv_open_globalB global_blob;
enum ndr_err_code ndr_err;
+ NTSTATUS status;
TALLOC_CTX *frame = talloc_stackframe();
ndr_err = ndr_pull_struct_blob(&blob, frame, &global_blob,
@@ -1303,21 +1298,48 @@ static int smbXsrv_open_global_traverse_fn(struct db_record *rec, void *data)
"key '%s' ndr_pull_struct_blob - %s\n",
hex_encode_talloc(frame, key.dptr, key.dsize),
ndr_errstr(ndr_err)));
+ status = ndr_map_error2ntstatus(ndr_err);
goto done;
}
if (global_blob.version != SMBXSRV_VERSION_0) {
+ status = NT_STATUS_INTERNAL_DB_CORRUPTION;
DEBUG(1,("Invalid record in smbXsrv_open_global.tdb:"
- "key '%s' unsuported version - %d\n",
+ "key '%s' unsuported version - %d - %s\n",
hex_encode_talloc(frame, key.dptr, key.dsize),
- (int)global_blob.version));
+ (int)global_blob.version,
+ nt_errstr(status)));
goto done;
}
- global_blob.info.info0->db_rec = rec;
- ret = state->fn(global_blob.info.info0, state->private_data);
+ *global = talloc_move(mem_ctx, &global_blob.info.info0);
+ status = NT_STATUS_OK;
done:
- TALLOC_FREE(frame);
+ talloc_free(frame);
+ return status;
+}
+
+struct smbXsrv_open_global_traverse_state {
+ int (*fn)(struct smbXsrv_open_global0 *, void *);
+ void *private_data;
+};
+
+static int smbXsrv_open_global_traverse_fn(struct db_record *rec, void *data)
+{
+ struct smbXsrv_open_global_traverse_state *state =
+ (struct smbXsrv_open_global_traverse_state*)data;
+ struct smbXsrv_open_global0 *global = NULL;
+ NTSTATUS status;
+ int ret = -1;
+
+ status = smbXsrv_open_global_parse_record(talloc_tos(), rec, &global);
+ if (!NT_STATUS_IS_OK(status)) {
+ return -1;
+ }
+
+ global->db_rec = rec;
+ ret = state->fn(global, state->private_data);
+ talloc_free(global);
return ret;
}