xattrs.c 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. #include <linux/fs.h>
  3. #include <linux/xattr.h>
  4. #include "overlayfs.h"
  5. static bool ovl_is_escaped_xattr(struct super_block *sb, const char *name)
  6. {
  7. struct ovl_fs *ofs = sb->s_fs_info;
  8. if (ofs->config.userxattr)
  9. return strncmp(name, OVL_XATTR_ESCAPE_USER_PREFIX,
  10. OVL_XATTR_ESCAPE_USER_PREFIX_LEN) == 0;
  11. else
  12. return strncmp(name, OVL_XATTR_ESCAPE_TRUSTED_PREFIX,
  13. OVL_XATTR_ESCAPE_TRUSTED_PREFIX_LEN - 1) == 0;
  14. }
  15. static bool ovl_is_own_xattr(struct super_block *sb, const char *name)
  16. {
  17. struct ovl_fs *ofs = OVL_FS(sb);
  18. if (ofs->config.userxattr)
  19. return strncmp(name, OVL_XATTR_USER_PREFIX,
  20. OVL_XATTR_USER_PREFIX_LEN) == 0;
  21. else
  22. return strncmp(name, OVL_XATTR_TRUSTED_PREFIX,
  23. OVL_XATTR_TRUSTED_PREFIX_LEN) == 0;
  24. }
  25. bool ovl_is_private_xattr(struct super_block *sb, const char *name)
  26. {
  27. return ovl_is_own_xattr(sb, name) && !ovl_is_escaped_xattr(sb, name);
  28. }
  29. static int ovl_xattr_set(struct dentry *dentry, struct inode *inode, const char *name,
  30. const void *value, size_t size, int flags)
  31. {
  32. int err;
  33. struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
  34. struct dentry *upperdentry = ovl_i_dentry_upper(inode);
  35. struct dentry *realdentry = upperdentry ?: ovl_dentry_lower(dentry);
  36. struct path realpath;
  37. const struct cred *old_cred;
  38. if (!value && !upperdentry) {
  39. ovl_path_lower(dentry, &realpath);
  40. old_cred = ovl_override_creds(dentry->d_sb);
  41. err = vfs_getxattr(mnt_idmap(realpath.mnt), realdentry, name, NULL, 0);
  42. revert_creds(old_cred);
  43. if (err < 0)
  44. goto out;
  45. }
  46. if (!upperdentry) {
  47. err = ovl_copy_up(dentry);
  48. if (err)
  49. goto out;
  50. realdentry = ovl_dentry_upper(dentry);
  51. }
  52. err = ovl_want_write(dentry);
  53. if (err)
  54. goto out;
  55. old_cred = ovl_override_creds(dentry->d_sb);
  56. if (value) {
  57. err = ovl_do_setxattr(ofs, realdentry, name, value, size,
  58. flags);
  59. } else {
  60. WARN_ON(flags != XATTR_REPLACE);
  61. err = ovl_do_removexattr(ofs, realdentry, name);
  62. }
  63. revert_creds(old_cred);
  64. ovl_drop_write(dentry);
  65. /* copy c/mtime */
  66. ovl_copyattr(inode);
  67. out:
  68. return err;
  69. }
  70. static int ovl_xattr_get(struct dentry *dentry, struct inode *inode, const char *name,
  71. void *value, size_t size)
  72. {
  73. ssize_t res;
  74. const struct cred *old_cred;
  75. struct path realpath;
  76. ovl_i_path_real(inode, &realpath);
  77. old_cred = ovl_override_creds(dentry->d_sb);
  78. res = vfs_getxattr(mnt_idmap(realpath.mnt), realpath.dentry, name, value, size);
  79. revert_creds(old_cred);
  80. return res;
  81. }
  82. static bool ovl_can_list(struct super_block *sb, const char *s)
  83. {
  84. /* Never list private (.overlay) */
  85. if (ovl_is_private_xattr(sb, s))
  86. return false;
  87. /* List all non-trusted xattrs */
  88. if (strncmp(s, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN) != 0)
  89. return true;
  90. /* list other trusted for superuser only */
  91. return ns_capable_noaudit(&init_user_ns, CAP_SYS_ADMIN);
  92. }
  93. ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size)
  94. {
  95. struct dentry *realdentry = ovl_dentry_real(dentry);
  96. struct ovl_fs *ofs = OVL_FS(dentry->d_sb);
  97. ssize_t res;
  98. size_t len;
  99. char *s;
  100. const struct cred *old_cred;
  101. size_t prefix_len, name_len;
  102. old_cred = ovl_override_creds(dentry->d_sb);
  103. res = vfs_listxattr(realdentry, list, size);
  104. revert_creds(old_cred);
  105. if (res <= 0 || size == 0)
  106. return res;
  107. prefix_len = ofs->config.userxattr ?
  108. OVL_XATTR_USER_PREFIX_LEN : OVL_XATTR_TRUSTED_PREFIX_LEN;
  109. /* filter out private xattrs */
  110. for (s = list, len = res; len;) {
  111. size_t slen = strnlen(s, len) + 1;
  112. /* underlying fs providing us with an broken xattr list? */
  113. if (WARN_ON(slen > len))
  114. return -EIO;
  115. len -= slen;
  116. if (!ovl_can_list(dentry->d_sb, s)) {
  117. res -= slen;
  118. memmove(s, s + slen, len);
  119. } else if (ovl_is_escaped_xattr(dentry->d_sb, s)) {
  120. res -= OVL_XATTR_ESCAPE_PREFIX_LEN;
  121. name_len = slen - prefix_len - OVL_XATTR_ESCAPE_PREFIX_LEN;
  122. s += prefix_len;
  123. memmove(s, s + OVL_XATTR_ESCAPE_PREFIX_LEN, name_len + len);
  124. s += name_len;
  125. } else {
  126. s += slen;
  127. }
  128. }
  129. return res;
  130. }
  131. static char *ovl_xattr_escape_name(const char *prefix, const char *name)
  132. {
  133. size_t prefix_len = strlen(prefix);
  134. size_t name_len = strlen(name);
  135. size_t escaped_len;
  136. char *escaped, *s;
  137. escaped_len = prefix_len + OVL_XATTR_ESCAPE_PREFIX_LEN + name_len;
  138. if (escaped_len > XATTR_NAME_MAX)
  139. return ERR_PTR(-EOPNOTSUPP);
  140. escaped = kmalloc(escaped_len + 1, GFP_KERNEL);
  141. if (escaped == NULL)
  142. return ERR_PTR(-ENOMEM);
  143. s = escaped;
  144. memcpy(s, prefix, prefix_len);
  145. s += prefix_len;
  146. memcpy(s, OVL_XATTR_ESCAPE_PREFIX, OVL_XATTR_ESCAPE_PREFIX_LEN);
  147. s += OVL_XATTR_ESCAPE_PREFIX_LEN;
  148. memcpy(s, name, name_len + 1);
  149. return escaped;
  150. }
  151. static int ovl_own_xattr_get(const struct xattr_handler *handler,
  152. struct dentry *dentry, struct inode *inode,
  153. const char *name, void *buffer, size_t size)
  154. {
  155. char *escaped;
  156. int r;
  157. escaped = ovl_xattr_escape_name(handler->prefix, name);
  158. if (IS_ERR(escaped))
  159. return PTR_ERR(escaped);
  160. r = ovl_xattr_get(dentry, inode, escaped, buffer, size);
  161. kfree(escaped);
  162. return r;
  163. }
  164. static int ovl_own_xattr_set(const struct xattr_handler *handler,
  165. struct mnt_idmap *idmap,
  166. struct dentry *dentry, struct inode *inode,
  167. const char *name, const void *value,
  168. size_t size, int flags)
  169. {
  170. char *escaped;
  171. int r;
  172. escaped = ovl_xattr_escape_name(handler->prefix, name);
  173. if (IS_ERR(escaped))
  174. return PTR_ERR(escaped);
  175. r = ovl_xattr_set(dentry, inode, escaped, value, size, flags);
  176. kfree(escaped);
  177. return r;
  178. }
  179. static int ovl_other_xattr_get(const struct xattr_handler *handler,
  180. struct dentry *dentry, struct inode *inode,
  181. const char *name, void *buffer, size_t size)
  182. {
  183. return ovl_xattr_get(dentry, inode, name, buffer, size);
  184. }
  185. static int ovl_other_xattr_set(const struct xattr_handler *handler,
  186. struct mnt_idmap *idmap,
  187. struct dentry *dentry, struct inode *inode,
  188. const char *name, const void *value,
  189. size_t size, int flags)
  190. {
  191. return ovl_xattr_set(dentry, inode, name, value, size, flags);
  192. }
  193. static const struct xattr_handler ovl_own_trusted_xattr_handler = {
  194. .prefix = OVL_XATTR_TRUSTED_PREFIX,
  195. .get = ovl_own_xattr_get,
  196. .set = ovl_own_xattr_set,
  197. };
  198. static const struct xattr_handler ovl_own_user_xattr_handler = {
  199. .prefix = OVL_XATTR_USER_PREFIX,
  200. .get = ovl_own_xattr_get,
  201. .set = ovl_own_xattr_set,
  202. };
  203. static const struct xattr_handler ovl_other_xattr_handler = {
  204. .prefix = "", /* catch all */
  205. .get = ovl_other_xattr_get,
  206. .set = ovl_other_xattr_set,
  207. };
  208. static const struct xattr_handler * const ovl_trusted_xattr_handlers[] = {
  209. &ovl_own_trusted_xattr_handler,
  210. &ovl_other_xattr_handler,
  211. NULL
  212. };
  213. static const struct xattr_handler * const ovl_user_xattr_handlers[] = {
  214. &ovl_own_user_xattr_handler,
  215. &ovl_other_xattr_handler,
  216. NULL
  217. };
  218. const struct xattr_handler * const *ovl_xattr_handlers(struct ovl_fs *ofs)
  219. {
  220. return ofs->config.userxattr ? ovl_user_xattr_handlers :
  221. ovl_trusted_xattr_handlers;
  222. }