diff options
author | Ralph Boehme <slow@samba.org> | 2019-05-06 14:19:31 +0200 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2019-08-08 21:43:14 +0000 |
commit | 64f182412a5b7bdb1f8eccffaee296e7c8554a95 (patch) | |
tree | e413dfe13e134c9b14c688a226591ab49274861b /source3/rpc_server | |
parent | b2bf13ecf7b5406665f27487cb892e4f15fb28c4 (diff) | |
download | samba-64f182412a5b7bdb1f8eccffaee296e7c8554a95.tar.gz |
s3:mdssvc: fix slrpc_fetch_attributes() when CNID is not known
Samba currenlty fails the whole RPC request, macOS returns returns a nil entry
for the requested CNID:
DALLOC_CTX(#1): {
sl_array_t(#3): {
uint64_t: 0x0000
CNIDs: unkn1: 0xfec, unkn2: 0x6b000020
DALLOC_CTX(#1): {
uint64_t: 0xe4bbf314c03b1e
}
sl_filemeta_t(#1): {
sl_array_t(#2): {
nil
nil
}
}
}
}
Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Autobuild-User(master): Jeremy Allison <jra@samba.org>
Autobuild-Date(master): Thu Aug 8 21:43:14 UTC 2019 on sn-devel-184
Diffstat (limited to 'source3/rpc_server')
-rw-r--r-- | source3/rpc_server/mdssvc/mdssvc.c | 30 |
1 files changed, 15 insertions, 15 deletions
diff --git a/source3/rpc_server/mdssvc/mdssvc.c b/source3/rpc_server/mdssvc/mdssvc.c index 1d420482437..24183329301 100644 --- a/source3/rpc_server/mdssvc/mdssvc.c +++ b/source3/rpc_server/mdssvc/mdssvc.c @@ -1226,6 +1226,7 @@ static bool slrpc_fetch_attributes(struct mds_ctx *mds_ctx, sl_filemeta_t *fm; sl_array_t *fm_array; sl_nil_t nil; + char *path = NULL; struct stat_ex sb; struct sl_inode_path_map *elem = NULL; void *p; @@ -1283,25 +1284,24 @@ static bool slrpc_fetch_attributes(struct mds_ctx *mds_ctx, status = dbwrap_fetch(mds_ctx->ino_path_map, reply, make_tdb_data((void*)&ino, sizeof(uint64_t)), &val); - if (!NT_STATUS_IS_OK(status)) { - DEBUG(1, ("Failed to fetch inode: %s\n", nt_errstr(status))); - goto error; - } - if (val.dsize != sizeof(p)) { - DEBUG(1, ("invalid record pointer size: %zd\n", val.dsize)); - TALLOC_FREE(val.dptr); - goto error; - } + if (NT_STATUS_IS_OK(status)) { + if (val.dsize != sizeof(p)) { + DBG_ERR("invalid record pointer size: %zd\n", val.dsize); + TALLOC_FREE(val.dptr); + goto error; + } - memcpy(&p, val.dptr, sizeof(p)); - elem = talloc_get_type_abort(p, struct sl_inode_path_map); + memcpy(&p, val.dptr, sizeof(p)); + elem = talloc_get_type_abort(p, struct sl_inode_path_map); + path = elem->path; - result = sys_stat(elem->path, &sb, false); - if (result != 0) { - goto error; + result = sys_stat(path, &sb, false); + if (result != 0) { + goto error; + } } - ok = add_filemeta(mds_ctx, reqinfo, fm_array, elem->path, &sb); + ok = add_filemeta(mds_ctx, reqinfo, fm_array, path, &sb); if (!ok) { goto error; } |