From: Mark Vitale Date: Mon, 4 Mar 2019 01:20:58 +0000 (-0500) Subject: dir: check afs_dir_Create return code in afs_dir_MakeDir X-Git-Tag: openafs-devel-1_9_1~88 X-Git-Url: http://git.openafs.org/?p=openafs.git;a=commitdiff_plain;h=dcce956df4fc8d368962cb36d8b3c801be69a85a;hp=04805f48a2eb6ddaa604d8d0738888fd5f960f20 dir: check afs_dir_Create return code in afs_dir_MakeDir afs_dir_MakeDir() ignores the return code from afs_dir_Create() for the '.' and '..' ("dot" and "dotdot") directories. This has been the case from the earliest implementation (MakeDir() calling Create()) in the original IBM import. Instead, check the return codes to prevent the possibility of creating malformed directories. Change-Id: I60179488429dfa9afe60c4862c5e42b41f1e0048 Reviewed-on: https://gerrit.openafs.org/13800 Reviewed-by: Benjamin Kaduk Reviewed-by: Mark Vitale Tested-by: BuildBot --- diff --git a/src/dir/dir.c b/src/dir/dir.c index eaacd32..0fb6bff 100644 --- a/src/dir/dir.c +++ b/src/dir/dir.c @@ -326,10 +326,17 @@ FreeBlobs(dir_file_t dir, int firstblob, int nblobs) DRelease(&pagehdbuf, 1); } -/* +/*! * Format an empty directory properly. Note that the first 13 entries in a * directory header page are allocated, 1 to the page header, 4 to the * allocation map and 8 to the hash table. + * + * \param dir pointer to the directory object + * \param me fid (vnode+uniq) for new dir + * \param parent fid (vnode+uniq) for parent dir + * + * \retval 0 success + * \retval nonzero error code */ int afs_dir_MakeDir(dir_file_t dir, afs_int32 * me, afs_int32 * parent) @@ -337,6 +344,7 @@ afs_dir_MakeDir(dir_file_t dir, afs_int32 * me, afs_int32 * parent) int i; struct DirBuffer buffer; struct DirHeader *dhp; + int code; DNew(dir, 0, &buffer); dhp = (struct DirHeader *)buffer.data; @@ -354,8 +362,12 @@ afs_dir_MakeDir(dir_file_t dir, afs_int32 * me, afs_int32 * parent) for (i = 0; i < NHASHENT; i++) dhp->hashTable[i] = 0; DRelease(&buffer, 1); - afs_dir_Create(dir, ".", me); - afs_dir_Create(dir, "..", parent); /* Virtue is its own .. */ + code = afs_dir_Create(dir, ".", me); + if (code) + return code; + code = afs_dir_Create(dir, "..", parent); + if (code) + return code; return 0; }