messaging.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473
  1. /**
  2. * eCryptfs: Linux filesystem encryption layer
  3. *
  4. * Copyright (C) 2004-2008 International Business Machines Corp.
  5. * Author(s): Michael A. Halcrow <mhalcrow@us.ibm.com>
  6. * Tyler Hicks <tyhicks@ou.edu>
  7. *
  8. * This program is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU General Public License version
  10. * 2 as published by the Free Software Foundation.
  11. *
  12. * This program is distributed in the hope that it will be useful, but
  13. * WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
  20. * 02111-1307, USA.
  21. */
  22. #include <linux/sched.h>
  23. #include <linux/slab.h>
  24. #include <linux/user_namespace.h>
  25. #include <linux/nsproxy.h>
  26. #include "ecryptfs_kernel.h"
  27. static LIST_HEAD(ecryptfs_msg_ctx_free_list);
  28. static LIST_HEAD(ecryptfs_msg_ctx_alloc_list);
  29. static struct mutex ecryptfs_msg_ctx_lists_mux;
  30. static struct hlist_head *ecryptfs_daemon_hash;
  31. struct mutex ecryptfs_daemon_hash_mux;
  32. static int ecryptfs_hash_bits;
  33. #define ecryptfs_current_euid_hash(uid) \
  34. hash_long((unsigned long)from_kuid(&init_user_ns, current_euid()), ecryptfs_hash_bits)
  35. static u32 ecryptfs_msg_counter;
  36. static struct ecryptfs_msg_ctx *ecryptfs_msg_ctx_arr;
  37. /**
  38. * ecryptfs_acquire_free_msg_ctx
  39. * @msg_ctx: The context that was acquired from the free list
  40. *
  41. * Acquires a context element from the free list and locks the mutex
  42. * on the context. Sets the msg_ctx task to current. Returns zero on
  43. * success; non-zero on error or upon failure to acquire a free
  44. * context element. Must be called with ecryptfs_msg_ctx_lists_mux
  45. * held.
  46. */
  47. static int ecryptfs_acquire_free_msg_ctx(struct ecryptfs_msg_ctx **msg_ctx)
  48. {
  49. struct list_head *p;
  50. int rc;
  51. if (list_empty(&ecryptfs_msg_ctx_free_list)) {
  52. printk(KERN_WARNING "%s: The eCryptfs free "
  53. "context list is empty. It may be helpful to "
  54. "specify the ecryptfs_message_buf_len "
  55. "parameter to be greater than the current "
  56. "value of [%d]\n", __func__, ecryptfs_message_buf_len);
  57. rc = -ENOMEM;
  58. goto out;
  59. }
  60. list_for_each(p, &ecryptfs_msg_ctx_free_list) {
  61. *msg_ctx = list_entry(p, struct ecryptfs_msg_ctx, node);
  62. if (mutex_trylock(&(*msg_ctx)->mux)) {
  63. (*msg_ctx)->task = current;
  64. rc = 0;
  65. goto out;
  66. }
  67. }
  68. rc = -ENOMEM;
  69. out:
  70. return rc;
  71. }
  72. /**
  73. * ecryptfs_msg_ctx_free_to_alloc
  74. * @msg_ctx: The context to move from the free list to the alloc list
  75. *
  76. * Must be called with ecryptfs_msg_ctx_lists_mux held.
  77. */
  78. static void ecryptfs_msg_ctx_free_to_alloc(struct ecryptfs_msg_ctx *msg_ctx)
  79. {
  80. list_move(&msg_ctx->node, &ecryptfs_msg_ctx_alloc_list);
  81. msg_ctx->state = ECRYPTFS_MSG_CTX_STATE_PENDING;
  82. msg_ctx->counter = ++ecryptfs_msg_counter;
  83. }
  84. /**
  85. * ecryptfs_msg_ctx_alloc_to_free
  86. * @msg_ctx: The context to move from the alloc list to the free list
  87. *
  88. * Must be called with ecryptfs_msg_ctx_lists_mux held.
  89. */
  90. void ecryptfs_msg_ctx_alloc_to_free(struct ecryptfs_msg_ctx *msg_ctx)
  91. {
  92. list_move(&(msg_ctx->node), &ecryptfs_msg_ctx_free_list);
  93. if (msg_ctx->msg)
  94. kfree(msg_ctx->msg);
  95. msg_ctx->msg = NULL;
  96. msg_ctx->state = ECRYPTFS_MSG_CTX_STATE_FREE;
  97. }
  98. /**
  99. * ecryptfs_find_daemon_by_euid
  100. * @daemon: If return value is zero, points to the desired daemon pointer
  101. *
  102. * Must be called with ecryptfs_daemon_hash_mux held.
  103. *
  104. * Search the hash list for the current effective user id.
  105. *
  106. * Returns zero if the user id exists in the list; non-zero otherwise.
  107. */
  108. int ecryptfs_find_daemon_by_euid(struct ecryptfs_daemon **daemon)
  109. {
  110. struct hlist_node *elem;
  111. int rc;
  112. hlist_for_each_entry(*daemon, elem,
  113. &ecryptfs_daemon_hash[ecryptfs_current_euid_hash()],
  114. euid_chain) {
  115. if (uid_eq((*daemon)->file->f_cred->euid, current_euid())) {
  116. rc = 0;
  117. goto out;
  118. }
  119. }
  120. rc = -EINVAL;
  121. out:
  122. return rc;
  123. }
  124. /**
  125. * ecryptfs_spawn_daemon - Create and initialize a new daemon struct
  126. * @daemon: Pointer to set to newly allocated daemon struct
  127. * @file: File used when opening /dev/ecryptfs
  128. *
  129. * Must be called ceremoniously while in possession of
  130. * ecryptfs_sacred_daemon_hash_mux
  131. *
  132. * Returns zero on success; non-zero otherwise
  133. */
  134. int
  135. ecryptfs_spawn_daemon(struct ecryptfs_daemon **daemon, struct file *file)
  136. {
  137. int rc = 0;
  138. (*daemon) = kzalloc(sizeof(**daemon), GFP_KERNEL);
  139. if (!(*daemon)) {
  140. rc = -ENOMEM;
  141. printk(KERN_ERR "%s: Failed to allocate [%zd] bytes of "
  142. "GFP_KERNEL memory\n", __func__, sizeof(**daemon));
  143. goto out;
  144. }
  145. (*daemon)->file = file;
  146. mutex_init(&(*daemon)->mux);
  147. INIT_LIST_HEAD(&(*daemon)->msg_ctx_out_queue);
  148. init_waitqueue_head(&(*daemon)->wait);
  149. (*daemon)->num_queued_msg_ctx = 0;
  150. hlist_add_head(&(*daemon)->euid_chain,
  151. &ecryptfs_daemon_hash[ecryptfs_current_euid_hash()]);
  152. out:
  153. return rc;
  154. }
  155. /**
  156. * ecryptfs_exorcise_daemon - Destroy the daemon struct
  157. *
  158. * Must be called ceremoniously while in possession of
  159. * ecryptfs_daemon_hash_mux and the daemon's own mux.
  160. */
  161. int ecryptfs_exorcise_daemon(struct ecryptfs_daemon *daemon)
  162. {
  163. struct ecryptfs_msg_ctx *msg_ctx, *msg_ctx_tmp;
  164. int rc = 0;
  165. mutex_lock(&daemon->mux);
  166. if ((daemon->flags & ECRYPTFS_DAEMON_IN_READ)
  167. || (daemon->flags & ECRYPTFS_DAEMON_IN_POLL)) {
  168. rc = -EBUSY;
  169. mutex_unlock(&daemon->mux);
  170. goto out;
  171. }
  172. list_for_each_entry_safe(msg_ctx, msg_ctx_tmp,
  173. &daemon->msg_ctx_out_queue, daemon_out_list) {
  174. list_del(&msg_ctx->daemon_out_list);
  175. daemon->num_queued_msg_ctx--;
  176. printk(KERN_WARNING "%s: Warning: dropping message that is in "
  177. "the out queue of a dying daemon\n", __func__);
  178. ecryptfs_msg_ctx_alloc_to_free(msg_ctx);
  179. }
  180. hlist_del(&daemon->euid_chain);
  181. mutex_unlock(&daemon->mux);
  182. kzfree(daemon);
  183. out:
  184. return rc;
  185. }
  186. /**
  187. * ecryptfs_process_reponse
  188. * @msg: The ecryptfs message received; the caller should sanity check
  189. * msg->data_len and free the memory
  190. * @seq: The sequence number of the message; must match the sequence
  191. * number for the existing message context waiting for this
  192. * response
  193. *
  194. * Processes a response message after sending an operation request to
  195. * userspace. Some other process is awaiting this response. Before
  196. * sending out its first communications, the other process allocated a
  197. * msg_ctx from the ecryptfs_msg_ctx_arr at a particular index. The
  198. * response message contains this index so that we can copy over the
  199. * response message into the msg_ctx that the process holds a
  200. * reference to. The other process is going to wake up, check to see
  201. * that msg_ctx->state == ECRYPTFS_MSG_CTX_STATE_DONE, and then
  202. * proceed to read off and process the response message. Returns zero
  203. * upon delivery to desired context element; non-zero upon delivery
  204. * failure or error.
  205. *
  206. * Returns zero on success; non-zero otherwise
  207. */
  208. int ecryptfs_process_response(struct ecryptfs_daemon *daemon,
  209. struct ecryptfs_message *msg, u32 seq)
  210. {
  211. struct ecryptfs_msg_ctx *msg_ctx;
  212. size_t msg_size;
  213. int rc;
  214. if (msg->index >= ecryptfs_message_buf_len) {
  215. rc = -EINVAL;
  216. printk(KERN_ERR "%s: Attempt to reference "
  217. "context buffer at index [%d]; maximum "
  218. "allowable is [%d]\n", __func__, msg->index,
  219. (ecryptfs_message_buf_len - 1));
  220. goto out;
  221. }
  222. msg_ctx = &ecryptfs_msg_ctx_arr[msg->index];
  223. mutex_lock(&msg_ctx->mux);
  224. if (msg_ctx->state != ECRYPTFS_MSG_CTX_STATE_PENDING) {
  225. rc = -EINVAL;
  226. printk(KERN_WARNING "%s: Desired context element is not "
  227. "pending a response\n", __func__);
  228. goto unlock;
  229. } else if (msg_ctx->counter != seq) {
  230. rc = -EINVAL;
  231. printk(KERN_WARNING "%s: Invalid message sequence; "
  232. "expected [%d]; received [%d]\n", __func__,
  233. msg_ctx->counter, seq);
  234. goto unlock;
  235. }
  236. msg_size = (sizeof(*msg) + msg->data_len);
  237. msg_ctx->msg = kmalloc(msg_size, GFP_KERNEL);
  238. if (!msg_ctx->msg) {
  239. rc = -ENOMEM;
  240. printk(KERN_ERR "%s: Failed to allocate [%zd] bytes of "
  241. "GFP_KERNEL memory\n", __func__, msg_size);
  242. goto unlock;
  243. }
  244. memcpy(msg_ctx->msg, msg, msg_size);
  245. msg_ctx->state = ECRYPTFS_MSG_CTX_STATE_DONE;
  246. wake_up_process(msg_ctx->task);
  247. rc = 0;
  248. unlock:
  249. mutex_unlock(&msg_ctx->mux);
  250. out:
  251. return rc;
  252. }
  253. /**
  254. * ecryptfs_send_message_locked
  255. * @data: The data to send
  256. * @data_len: The length of data
  257. * @msg_ctx: The message context allocated for the send
  258. *
  259. * Must be called with ecryptfs_daemon_hash_mux held.
  260. *
  261. * Returns zero on success; non-zero otherwise
  262. */
  263. static int
  264. ecryptfs_send_message_locked(char *data, int data_len, u8 msg_type,
  265. struct ecryptfs_msg_ctx **msg_ctx)
  266. {
  267. struct ecryptfs_daemon *daemon;
  268. int rc;
  269. rc = ecryptfs_find_daemon_by_euid(&daemon);
  270. if (rc || !daemon) {
  271. rc = -ENOTCONN;
  272. goto out;
  273. }
  274. mutex_lock(&ecryptfs_msg_ctx_lists_mux);
  275. rc = ecryptfs_acquire_free_msg_ctx(msg_ctx);
  276. if (rc) {
  277. mutex_unlock(&ecryptfs_msg_ctx_lists_mux);
  278. printk(KERN_WARNING "%s: Could not claim a free "
  279. "context element\n", __func__);
  280. goto out;
  281. }
  282. ecryptfs_msg_ctx_free_to_alloc(*msg_ctx);
  283. mutex_unlock(&(*msg_ctx)->mux);
  284. mutex_unlock(&ecryptfs_msg_ctx_lists_mux);
  285. rc = ecryptfs_send_miscdev(data, data_len, *msg_ctx, msg_type, 0,
  286. daemon);
  287. if (rc)
  288. printk(KERN_ERR "%s: Error attempting to send message to "
  289. "userspace daemon; rc = [%d]\n", __func__, rc);
  290. out:
  291. return rc;
  292. }
  293. /**
  294. * ecryptfs_send_message
  295. * @data: The data to send
  296. * @data_len: The length of data
  297. * @msg_ctx: The message context allocated for the send
  298. *
  299. * Grabs ecryptfs_daemon_hash_mux.
  300. *
  301. * Returns zero on success; non-zero otherwise
  302. */
  303. int ecryptfs_send_message(char *data, int data_len,
  304. struct ecryptfs_msg_ctx **msg_ctx)
  305. {
  306. int rc;
  307. mutex_lock(&ecryptfs_daemon_hash_mux);
  308. rc = ecryptfs_send_message_locked(data, data_len, ECRYPTFS_MSG_REQUEST,
  309. msg_ctx);
  310. mutex_unlock(&ecryptfs_daemon_hash_mux);
  311. return rc;
  312. }
  313. /**
  314. * ecryptfs_wait_for_response
  315. * @msg_ctx: The context that was assigned when sending a message
  316. * @msg: The incoming message from userspace; not set if rc != 0
  317. *
  318. * Sleeps until awaken by ecryptfs_receive_message or until the amount
  319. * of time exceeds ecryptfs_message_wait_timeout. If zero is
  320. * returned, msg will point to a valid message from userspace; a
  321. * non-zero value is returned upon failure to receive a message or an
  322. * error occurs. Callee must free @msg on success.
  323. */
  324. int ecryptfs_wait_for_response(struct ecryptfs_msg_ctx *msg_ctx,
  325. struct ecryptfs_message **msg)
  326. {
  327. signed long timeout = ecryptfs_message_wait_timeout * HZ;
  328. int rc = 0;
  329. sleep:
  330. timeout = schedule_timeout_interruptible(timeout);
  331. mutex_lock(&ecryptfs_msg_ctx_lists_mux);
  332. mutex_lock(&msg_ctx->mux);
  333. if (msg_ctx->state != ECRYPTFS_MSG_CTX_STATE_DONE) {
  334. if (timeout) {
  335. mutex_unlock(&msg_ctx->mux);
  336. mutex_unlock(&ecryptfs_msg_ctx_lists_mux);
  337. goto sleep;
  338. }
  339. rc = -ENOMSG;
  340. } else {
  341. *msg = msg_ctx->msg;
  342. msg_ctx->msg = NULL;
  343. }
  344. ecryptfs_msg_ctx_alloc_to_free(msg_ctx);
  345. mutex_unlock(&msg_ctx->mux);
  346. mutex_unlock(&ecryptfs_msg_ctx_lists_mux);
  347. return rc;
  348. }
  349. int __init ecryptfs_init_messaging(void)
  350. {
  351. int i;
  352. int rc = 0;
  353. if (ecryptfs_number_of_users > ECRYPTFS_MAX_NUM_USERS) {
  354. ecryptfs_number_of_users = ECRYPTFS_MAX_NUM_USERS;
  355. printk(KERN_WARNING "%s: Specified number of users is "
  356. "too large, defaulting to [%d] users\n", __func__,
  357. ecryptfs_number_of_users);
  358. }
  359. mutex_init(&ecryptfs_daemon_hash_mux);
  360. mutex_lock(&ecryptfs_daemon_hash_mux);
  361. ecryptfs_hash_bits = 1;
  362. while (ecryptfs_number_of_users >> ecryptfs_hash_bits)
  363. ecryptfs_hash_bits++;
  364. ecryptfs_daemon_hash = kmalloc((sizeof(struct hlist_head)
  365. * (1 << ecryptfs_hash_bits)),
  366. GFP_KERNEL);
  367. if (!ecryptfs_daemon_hash) {
  368. rc = -ENOMEM;
  369. printk(KERN_ERR "%s: Failed to allocate memory\n", __func__);
  370. mutex_unlock(&ecryptfs_daemon_hash_mux);
  371. goto out;
  372. }
  373. for (i = 0; i < (1 << ecryptfs_hash_bits); i++)
  374. INIT_HLIST_HEAD(&ecryptfs_daemon_hash[i]);
  375. mutex_unlock(&ecryptfs_daemon_hash_mux);
  376. ecryptfs_msg_ctx_arr = kmalloc((sizeof(struct ecryptfs_msg_ctx)
  377. * ecryptfs_message_buf_len),
  378. GFP_KERNEL);
  379. if (!ecryptfs_msg_ctx_arr) {
  380. rc = -ENOMEM;
  381. printk(KERN_ERR "%s: Failed to allocate memory\n", __func__);
  382. goto out;
  383. }
  384. mutex_init(&ecryptfs_msg_ctx_lists_mux);
  385. mutex_lock(&ecryptfs_msg_ctx_lists_mux);
  386. ecryptfs_msg_counter = 0;
  387. for (i = 0; i < ecryptfs_message_buf_len; i++) {
  388. INIT_LIST_HEAD(&ecryptfs_msg_ctx_arr[i].node);
  389. INIT_LIST_HEAD(&ecryptfs_msg_ctx_arr[i].daemon_out_list);
  390. mutex_init(&ecryptfs_msg_ctx_arr[i].mux);
  391. mutex_lock(&ecryptfs_msg_ctx_arr[i].mux);
  392. ecryptfs_msg_ctx_arr[i].index = i;
  393. ecryptfs_msg_ctx_arr[i].state = ECRYPTFS_MSG_CTX_STATE_FREE;
  394. ecryptfs_msg_ctx_arr[i].counter = 0;
  395. ecryptfs_msg_ctx_arr[i].task = NULL;
  396. ecryptfs_msg_ctx_arr[i].msg = NULL;
  397. list_add_tail(&ecryptfs_msg_ctx_arr[i].node,
  398. &ecryptfs_msg_ctx_free_list);
  399. mutex_unlock(&ecryptfs_msg_ctx_arr[i].mux);
  400. }
  401. mutex_unlock(&ecryptfs_msg_ctx_lists_mux);
  402. rc = ecryptfs_init_ecryptfs_miscdev();
  403. if (rc)
  404. ecryptfs_release_messaging();
  405. out:
  406. return rc;
  407. }
  408. void ecryptfs_release_messaging(void)
  409. {
  410. if (ecryptfs_msg_ctx_arr) {
  411. int i;
  412. mutex_lock(&ecryptfs_msg_ctx_lists_mux);
  413. for (i = 0; i < ecryptfs_message_buf_len; i++) {
  414. mutex_lock(&ecryptfs_msg_ctx_arr[i].mux);
  415. if (ecryptfs_msg_ctx_arr[i].msg)
  416. kfree(ecryptfs_msg_ctx_arr[i].msg);
  417. mutex_unlock(&ecryptfs_msg_ctx_arr[i].mux);
  418. }
  419. kfree(ecryptfs_msg_ctx_arr);
  420. mutex_unlock(&ecryptfs_msg_ctx_lists_mux);
  421. }
  422. if (ecryptfs_daemon_hash) {
  423. struct hlist_node *elem;
  424. struct ecryptfs_daemon *daemon;
  425. int i;
  426. mutex_lock(&ecryptfs_daemon_hash_mux);
  427. for (i = 0; i < (1 << ecryptfs_hash_bits); i++) {
  428. int rc;
  429. hlist_for_each_entry(daemon, elem,
  430. &ecryptfs_daemon_hash[i],
  431. euid_chain) {
  432. rc = ecryptfs_exorcise_daemon(daemon);
  433. if (rc)
  434. printk(KERN_ERR "%s: Error whilst "
  435. "attempting to destroy daemon; "
  436. "rc = [%d]. Dazed and confused, "
  437. "but trying to continue.\n",
  438. __func__, rc);
  439. }
  440. }
  441. kfree(ecryptfs_daemon_hash);
  442. mutex_unlock(&ecryptfs_daemon_hash_mux);
  443. }
  444. ecryptfs_destroy_ecryptfs_miscdev();
  445. return;
  446. }