On Fri 27-08-21 12:18:57, Suren Baghdasaryan wrote: [...] > Userspace can set the name for a region of memory by calling > prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, start, len, (unsigned long)name); > Setting the name to NULL clears it. Maybe I am missing this part but I do not see this being handled anywhere. [...] > @@ -3283,5 +3283,16 @@ static inline int seal_check_future_write(int seals, struct vm_area_struct *vma) > return 0; > } > > +#ifdef CONFIG_ADVISE_SYSCALLS > +int madvise_set_anon_name(struct mm_struct *mm, unsigned long start, > + unsigned long len_in, const char *name); > +#else > +static inline int > +madvise_set_anon_name(struct mm_struct *mm, unsigned long start, > + unsigned long len_in, const char *name) { > + return 0; > +} > +#endif You want to make this depend on CONFIG_PROC_FS. [...] > +#ifdef CONFIG_MMU > + > +#define ANON_VMA_NAME_MAX_LEN 64 > + > +static int prctl_set_vma(unsigned long opt, unsigned long addr, > + unsigned long size, unsigned long arg) > +{ > + struct mm_struct *mm = current->mm; > + char *name, *pch; > + int error; > + > + switch (opt) { > + case PR_SET_VMA_ANON_NAME: > + name = strndup_user((const char __user *)arg, > + ANON_VMA_NAME_MAX_LEN); > + > + if (IS_ERR(name)) > + return PTR_ERR(name); unless I am missing something NULL name would lead to an error rather than a name clearing as advertised above. > + > + for (pch = name; *pch != '\0'; pch++) { > + if (!isprint(*pch)) { > + kfree(name); > + return -EINVAL; > + } > + } > + > + mmap_write_lock(mm); > + error = madvise_set_anon_name(mm, addr, size, name); > + mmap_write_unlock(mm); > + kfree(name); > + break; > + default: > + error = -EINVAL; > + } > + > + return error; -- Michal Hocko SUSE Labs