CC: [email protected] In-Reply-To: <159611041929.535980.14513096920129728440.stgit@localhost.localdomain> References: <159611041929.535980.14513096920129728440.stgit@localhost.localdomain> TO: Kirill Tkhai <[email protected]> TO: [email protected] TO: [email protected] TO: [email protected] TO: [email protected] TO: [email protected] TO: [email protected] TO: [email protected] TO: [email protected] TO: [email protected] TO: [email protected]
Hi Kirill, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on next-20200729] [also build test WARNING on v5.8] [cannot apply to cgroup/for-next tip/timers/core net-next/master sparc-next/master net/master linus/master v5.8-rc7 v5.8-rc6 v5.8-rc5] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch] url: https://github.com/0day-ci/linux/commits/Kirill-Tkhai/proc-Introduce-proc-namespaces-directory-to-expose-namespaces-lineary/20200730-200346 base: 04b4571786305a76ad81757bbec78eb16a5de582 :::::: branch date: 6 days ago :::::: commit date: 6 days ago compiler: nds32le-linux-gcc (GCC) 9.3.0 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <[email protected]> cppcheck warnings: (new ones prefixed by >>) >> fs/proc/task_namespaces.c:61:8: warning: Variable 'error' is reassigned a >> value before the old one has been used. [redundantAssignment] error = ns_get_path(&ns_path, task, ns_ops); ^ fs/proc/task_namespaces.c:49:0: note: Variable 'error' is reassigned a value before the old one has been used. int error = -EACCES; ^ fs/proc/task_namespaces.c:61:8: note: Variable 'error' is reassigned a value before the old one has been used. error = ns_get_path(&ns_path, task, ns_ops); ^ >> fs/proc/task_namespaces.c:172:6: warning: Variable 'res' is reassigned a >> value before the old one has been used. [redundantAssignment] res = proc_ns_instantiate(dentry, task, *entry); ^ fs/proc/task_namespaces.c:157:0: note: Variable 'res' is reassigned a value before the old one has been used. struct dentry *res = ERR_PTR(-ENOENT); ^ fs/proc/task_namespaces.c:172:6: note: Variable 'res' is reassigned a value before the old one has been used. res = proc_ns_instantiate(dentry, task, *entry); ^ >> fs/proc/namespaces.c:24:16: warning: Either the condition '!p' is redundant >> or there is overflow in pointer subtraction. >> [nullPointerArithmeticRedundantCheck] *type_len = p - name; ^ fs/proc/namespaces.c:25:6: note: Assuming that condition '!p' is not redundant if (!p || p == name) ^ fs/proc/namespaces.c:24:16: note: Null pointer subtraction *type_len = p - name; ^ >> fs/proc/namespaces.c:153:7: warning: Variable 'ret' is reassigned a value >> before the old one has been used. [redundantAssignment] ret = __ns_get_path(&path, ns); ^ fs/proc/namespaces.c:148:7: note: Variable 'ret' is reassigned a value before the old one has been used. ret = -ENOENT; ^ fs/proc/namespaces.c:153:7: note: Variable 'ret' is reassigned a value before the old one has been used. ret = __ns_get_path(&path, ns); ^ # https://github.com/0day-ci/linux/commit/5b434887cc768d2f4c4867c792d69faa662b3cc9 git remote add linux-review https://github.com/0day-ci/linux git remote update linux-review git checkout 5b434887cc768d2f4c4867c792d69faa662b3cc9 vim +24 fs/proc/namespaces.c 5b434887cc768d Kirill Tkhai 2020-07-30 15 5b434887cc768d Kirill Tkhai 2020-07-30 16 static int parse_namespace_dentry_name(const struct dentry *dentry, 5b434887cc768d Kirill Tkhai 2020-07-30 17 const char **type, unsigned int *type_len, unsigned int *inum) 5b434887cc768d Kirill Tkhai 2020-07-30 18 { 5b434887cc768d Kirill Tkhai 2020-07-30 19 const char *p, *name; 5b434887cc768d Kirill Tkhai 2020-07-30 20 int count; 5b434887cc768d Kirill Tkhai 2020-07-30 21 5b434887cc768d Kirill Tkhai 2020-07-30 22 *type = name = dentry->d_name.name; 5b434887cc768d Kirill Tkhai 2020-07-30 23 p = strchr(name, ':'); 5b434887cc768d Kirill Tkhai 2020-07-30 @24 *type_len = p - name; 5b434887cc768d Kirill Tkhai 2020-07-30 25 if (!p || p == name) 5b434887cc768d Kirill Tkhai 2020-07-30 26 return -ENOENT; 5b434887cc768d Kirill Tkhai 2020-07-30 27 5b434887cc768d Kirill Tkhai 2020-07-30 28 p += 1; 5b434887cc768d Kirill Tkhai 2020-07-30 29 if (sscanf(p, "[%u]%n", inum, &count) != 1 || *(p + count) != '\0' || 5b434887cc768d Kirill Tkhai 2020-07-30 30 *inum < PROC_NS_MIN_INO) 5b434887cc768d Kirill Tkhai 2020-07-30 31 return -ENOENT; 5b434887cc768d Kirill Tkhai 2020-07-30 32 5b434887cc768d Kirill Tkhai 2020-07-30 33 return 0; 5b434887cc768d Kirill Tkhai 2020-07-30 34 } 5b434887cc768d Kirill Tkhai 2020-07-30 35 5b434887cc768d Kirill Tkhai 2020-07-30 36 static struct ns_common *get_namespace_by_dentry(struct pid_namespace *pid_ns, 5b434887cc768d Kirill Tkhai 2020-07-30 37 const struct dentry *dentry) 5b434887cc768d Kirill Tkhai 2020-07-30 38 { 5b434887cc768d Kirill Tkhai 2020-07-30 39 unsigned int type_len, inum, p_inum; 5b434887cc768d Kirill Tkhai 2020-07-30 40 struct user_namespace *user_ns; 5b434887cc768d Kirill Tkhai 2020-07-30 41 struct ns_common *ns; 5b434887cc768d Kirill Tkhai 2020-07-30 42 const char *type; 5b434887cc768d Kirill Tkhai 2020-07-30 43 5b434887cc768d Kirill Tkhai 2020-07-30 44 if (parse_namespace_dentry_name(dentry, &type, &type_len, &inum) < 0) 5b434887cc768d Kirill Tkhai 2020-07-30 45 return NULL; 5b434887cc768d Kirill Tkhai 2020-07-30 46 5b434887cc768d Kirill Tkhai 2020-07-30 47 p_inum = inum - 1; 5b434887cc768d Kirill Tkhai 2020-07-30 48 ns = ns_get_next(&p_inum); 5b434887cc768d Kirill Tkhai 2020-07-30 49 if (!ns) 5b434887cc768d Kirill Tkhai 2020-07-30 50 return NULL; 5b434887cc768d Kirill Tkhai 2020-07-30 51 5b434887cc768d Kirill Tkhai 2020-07-30 52 if (ns->inum != inum || strncmp(type, ns->ops->name, type_len) != 0 || 5b434887cc768d Kirill Tkhai 2020-07-30 53 ns->ops->name[type_len] != '\0') { 5b434887cc768d Kirill Tkhai 2020-07-30 54 ns->ops->put(ns); 5b434887cc768d Kirill Tkhai 2020-07-30 55 return NULL; 5b434887cc768d Kirill Tkhai 2020-07-30 56 } 5b434887cc768d Kirill Tkhai 2020-07-30 57 5b434887cc768d Kirill Tkhai 2020-07-30 58 if (ns->ops != &userns_operations) 5b434887cc768d Kirill Tkhai 2020-07-30 59 user_ns = ns->ops->owner(ns); 5b434887cc768d Kirill Tkhai 2020-07-30 60 else 5b434887cc768d Kirill Tkhai 2020-07-30 61 user_ns = container_of(ns, struct user_namespace, ns); 5b434887cc768d Kirill Tkhai 2020-07-30 62 5b434887cc768d Kirill Tkhai 2020-07-30 63 if (!in_userns(pid_ns->user_ns, user_ns)) { 5b434887cc768d Kirill Tkhai 2020-07-30 64 ns->ops->put(ns); 5b434887cc768d Kirill Tkhai 2020-07-30 65 return NULL; 5b434887cc768d Kirill Tkhai 2020-07-30 66 } 5b434887cc768d Kirill Tkhai 2020-07-30 67 5b434887cc768d Kirill Tkhai 2020-07-30 68 return ns; 5b434887cc768d Kirill Tkhai 2020-07-30 69 } 5b434887cc768d Kirill Tkhai 2020-07-30 70 5b434887cc768d Kirill Tkhai 2020-07-30 71 static struct dentry *proc_namespace_instantiate(struct dentry *dentry, 5b434887cc768d Kirill Tkhai 2020-07-30 72 struct task_struct *task, const void *ptr); 5b434887cc768d Kirill Tkhai 2020-07-30 73 5b434887cc768d Kirill Tkhai 2020-07-30 74 static struct dentry *proc_namespaces_lookup(struct inode *dir, struct dentry *dentry, 5b434887cc768d Kirill Tkhai 2020-07-30 75 unsigned int flags) 5b434887cc768d Kirill Tkhai 2020-07-30 76 { 5b434887cc768d Kirill Tkhai 2020-07-30 77 struct pid_namespace *pid_ns = proc_pid_ns(dir->i_sb); 5b434887cc768d Kirill Tkhai 2020-07-30 78 struct task_struct *task; 5b434887cc768d Kirill Tkhai 2020-07-30 79 struct ns_common *ns; 5b434887cc768d Kirill Tkhai 2020-07-30 80 5b434887cc768d Kirill Tkhai 2020-07-30 81 ns = get_namespace_by_dentry(pid_ns, dentry); 5b434887cc768d Kirill Tkhai 2020-07-30 82 if (!ns) 5b434887cc768d Kirill Tkhai 2020-07-30 83 return ERR_PTR(-ENOENT); 5b434887cc768d Kirill Tkhai 2020-07-30 84 5b434887cc768d Kirill Tkhai 2020-07-30 85 read_lock(&tasklist_lock); 5b434887cc768d Kirill Tkhai 2020-07-30 86 task = get_task_struct(pid_ns->child_reaper); 5b434887cc768d Kirill Tkhai 2020-07-30 87 read_unlock(&tasklist_lock); 5b434887cc768d Kirill Tkhai 2020-07-30 88 5b434887cc768d Kirill Tkhai 2020-07-30 89 dentry = proc_namespace_instantiate(dentry, task, ns); 5b434887cc768d Kirill Tkhai 2020-07-30 90 put_task_struct(task); 5b434887cc768d Kirill Tkhai 2020-07-30 91 ns->ops->put(ns); 5b434887cc768d Kirill Tkhai 2020-07-30 92 5b434887cc768d Kirill Tkhai 2020-07-30 93 return dentry; 5b434887cc768d Kirill Tkhai 2020-07-30 94 } 5b434887cc768d Kirill Tkhai 2020-07-30 95 5b434887cc768d Kirill Tkhai 2020-07-30 96 static int proc_namespaces_permission(struct inode *inode, int mask) 5b434887cc768d Kirill Tkhai 2020-07-30 97 { 5b434887cc768d Kirill Tkhai 2020-07-30 98 if ((mask & MAY_EXEC) && S_ISLNK(inode->i_mode)) 5b434887cc768d Kirill Tkhai 2020-07-30 99 return -EACCES; 5b434887cc768d Kirill Tkhai 2020-07-30 100 5b434887cc768d Kirill Tkhai 2020-07-30 101 return 0; 5b434887cc768d Kirill Tkhai 2020-07-30 102 } 5b434887cc768d Kirill Tkhai 2020-07-30 103 5b434887cc768d Kirill Tkhai 2020-07-30 104 static int proc_namespaces_getattr(const struct path *path, struct kstat *stat, 5b434887cc768d Kirill Tkhai 2020-07-30 105 u32 request_mask, unsigned int query_flags) 5b434887cc768d Kirill Tkhai 2020-07-30 106 { 5b434887cc768d Kirill Tkhai 2020-07-30 107 struct inode *inode = d_inode(path->dentry); 5b434887cc768d Kirill Tkhai 2020-07-30 108 5b434887cc768d Kirill Tkhai 2020-07-30 109 generic_fillattr(inode, stat); 5b434887cc768d Kirill Tkhai 2020-07-30 110 return 0; 5b434887cc768d Kirill Tkhai 2020-07-30 111 } 5b434887cc768d Kirill Tkhai 2020-07-30 112 5b434887cc768d Kirill Tkhai 2020-07-30 113 static const struct inode_operations proc_namespaces_inode_operations = { 5b434887cc768d Kirill Tkhai 2020-07-30 114 .lookup = proc_namespaces_lookup, 5b434887cc768d Kirill Tkhai 2020-07-30 115 .permission = proc_namespaces_permission, 5b434887cc768d Kirill Tkhai 2020-07-30 116 .getattr = proc_namespaces_getattr, 5b434887cc768d Kirill Tkhai 2020-07-30 117 }; 5b434887cc768d Kirill Tkhai 2020-07-30 118 5b434887cc768d Kirill Tkhai 2020-07-30 119 static int proc_namespaces_readlink(struct dentry *dentry, char __user *buffer, int buflen) 5b434887cc768d Kirill Tkhai 2020-07-30 120 { 5b434887cc768d Kirill Tkhai 2020-07-30 121 struct inode *dir = dentry->d_parent->d_inode; 5b434887cc768d Kirill Tkhai 2020-07-30 122 struct pid_namespace *pid_ns = proc_pid_ns(dir->i_sb); 5b434887cc768d Kirill Tkhai 2020-07-30 123 struct ns_common *ns; 5b434887cc768d Kirill Tkhai 2020-07-30 124 5b434887cc768d Kirill Tkhai 2020-07-30 125 ns = get_namespace_by_dentry(pid_ns, dentry); 5b434887cc768d Kirill Tkhai 2020-07-30 126 if (!ns) 5b434887cc768d Kirill Tkhai 2020-07-30 127 return -ENOENT; 5b434887cc768d Kirill Tkhai 2020-07-30 128 ns->ops->put(ns); 5b434887cc768d Kirill Tkhai 2020-07-30 129 5b434887cc768d Kirill Tkhai 2020-07-30 130 /* proc_namespaces_readdir() creates dentry names in namespace format */ 5b434887cc768d Kirill Tkhai 2020-07-30 131 return readlink_copy(buffer, buflen, dentry->d_iname); 5b434887cc768d Kirill Tkhai 2020-07-30 132 } 5b434887cc768d Kirill Tkhai 2020-07-30 133 5b434887cc768d Kirill Tkhai 2020-07-30 134 int __ns_get_path(struct path *path, struct ns_common *ns); 5b434887cc768d Kirill Tkhai 2020-07-30 135 5b434887cc768d Kirill Tkhai 2020-07-30 136 static const char *proc_namespaces_getlink(struct dentry *dentry, 5b434887cc768d Kirill Tkhai 2020-07-30 137 struct inode *inode, struct delayed_call *done) 5b434887cc768d Kirill Tkhai 2020-07-30 138 { 5b434887cc768d Kirill Tkhai 2020-07-30 139 struct pid_namespace *pid_ns = proc_pid_ns(inode->i_sb); 5b434887cc768d Kirill Tkhai 2020-07-30 140 struct ns_common *ns; 5b434887cc768d Kirill Tkhai 2020-07-30 141 struct path path; 5b434887cc768d Kirill Tkhai 2020-07-30 142 int ret; 5b434887cc768d Kirill Tkhai 2020-07-30 143 5b434887cc768d Kirill Tkhai 2020-07-30 144 if (!dentry) 5b434887cc768d Kirill Tkhai 2020-07-30 145 return ERR_PTR(-ECHILD); 5b434887cc768d Kirill Tkhai 2020-07-30 146 5b434887cc768d Kirill Tkhai 2020-07-30 147 while (1) { 5b434887cc768d Kirill Tkhai 2020-07-30 148 ret = -ENOENT; 5b434887cc768d Kirill Tkhai 2020-07-30 149 ns = get_namespace_by_dentry(pid_ns, dentry); 5b434887cc768d Kirill Tkhai 2020-07-30 150 if (!ns) 5b434887cc768d Kirill Tkhai 2020-07-30 151 goto out; 5b434887cc768d Kirill Tkhai 2020-07-30 152 5b434887cc768d Kirill Tkhai 2020-07-30 @153 ret = __ns_get_path(&path, ns); 5b434887cc768d Kirill Tkhai 2020-07-30 154 if (ret == -EAGAIN) 5b434887cc768d Kirill Tkhai 2020-07-30 155 continue; 5b434887cc768d Kirill Tkhai 2020-07-30 156 if (ret) 5b434887cc768d Kirill Tkhai 2020-07-30 157 goto out; 5b434887cc768d Kirill Tkhai 2020-07-30 158 break; 5b434887cc768d Kirill Tkhai 2020-07-30 159 } 5b434887cc768d Kirill Tkhai 2020-07-30 160 5b434887cc768d Kirill Tkhai 2020-07-30 161 ret = nd_jump_link(&path); 5b434887cc768d Kirill Tkhai 2020-07-30 162 out: 5b434887cc768d Kirill Tkhai 2020-07-30 163 return ERR_PTR(ret); 5b434887cc768d Kirill Tkhai 2020-07-30 164 } 5b434887cc768d Kirill Tkhai 2020-07-30 165 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/[email protected] _______________________________________________ kbuild mailing list -- [email protected] To unsubscribe send an email to [email protected]
