On Thu, Dec 30, 2021 at 02:17:23AM +0000, Al Viro wrote:
quoted
+static int io_setxattr_prep(struct io_kiocb *req,
+ const struct io_uring_sqe *sqe)
+{
+ struct io_xattr *ix = &req->xattr;
+ const char __user *path;
+ int ret;
+
+ ret = __io_setxattr_prep(req, sqe);
+ if (ret)
+ return ret;
+
+ path = u64_to_user_ptr(READ_ONCE(sqe->addr3));
+
+ ix->filename = getname_flags(path, LOOKUP_FOLLOW, NULL);
+ if (IS_ERR(ix->filename)) {
+ ret = PTR_ERR(ix->filename);
+ ix->filename = NULL;
+ }
+
+ return ret;
+}
... and here you use it and bring the pathname in. Should the latter
step fail, you restore ->filename to NULL and return an error.
Could you explain what kind of magic could allow the caller to tell
whether ix->ctx.kname needs to be freed on error? I don't see any way
that could possibly work...
getxattr side has the same problem, AFAICS...