s3:mdssvc: fix slrpc_fetch_attributes() when CNID is not known
authorRalph Boehme <slow@samba.org>
Mon, 6 May 2019 12:19:31 +0000 (14:19 +0200)
committerJeremy Allison <jra@samba.org>
Thu, 8 Aug 2019 21:43:14 +0000 (21:43 +0000)
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

selftest/knownfail.d/samba3.rpc [deleted file]
source3/rpc_server/mdssvc/mdssvc.c

diff --git a/selftest/knownfail.d/samba3.rpc b/selftest/knownfail.d/samba3.rpc
deleted file mode 100644 (file)
index 103c994..0000000
+++ /dev/null
@@ -1 +0,0 @@
-^samba3.rpc.mdssvc.mdscmd.fetch_unknown_cnid\(fileserver\)
index 1d42048243770cd080f33e6aa82c3d3fd91c7c6d..2418332930132a68e7234b5cccd427e60c6a6b90 100644 (file)
@@ -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;
        }