From: Ralph Boehme Date: Mon, 6 May 2019 12:19:31 +0000 (+0200) Subject: s3:mdssvc: fix slrpc_fetch_attributes() when CNID is not known X-Git-Tag: tdb-1.4.2~200 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=64f182412a5b7bdb1f8eccffaee296e7c8554a95;p=thirdparty%2Fsamba.git 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 Reviewed-by: Jeremy Allison Autobuild-User(master): Jeremy Allison Autobuild-Date(master): Thu Aug 8 21:43:14 UTC 2019 on sn-devel-184 --- diff --git a/selftest/knownfail.d/samba3.rpc b/selftest/knownfail.d/samba3.rpc deleted file mode 100644 index 103c99436f1..00000000000 --- a/selftest/knownfail.d/samba3.rpc +++ /dev/null @@ -1 +0,0 @@ -^samba3.rpc.mdssvc.mdscmd.fetch_unknown_cnid\(fileserver\) 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; }