aboutsummaryrefslogtreecommitdiffstats
path: root/security/tomoyo/common.c
diff options
context:
space:
mode:
authorTetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>2012-03-14 05:27:49 -0400
committerJames Morris <james.l.morris@oracle.com>2012-03-14 21:29:18 -0400
commit6041e8346f2165679c2184cab60db768d6a26a1d (patch)
tree2c4eb032eb851f240c1b70d1afb214a2c661b886 /security/tomoyo/common.c
parentf67dabbdde1fe112dfff05d02890f1e0d54117a8 (diff)
TOMOYO: Return appropriate value to poll().
"struct file_operations"->poll() expects "unsigned int" return value. All files in /sys/kernel/security/tomoyo/ directory other than /sys/kernel/security/tomoyo/query and /sys/kernel/security/tomoyo/audit should return POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM rather than -ENOSYS. Also, /sys/kernel/security/tomoyo/query and /sys/kernel/security/tomoyo/audit should return POLLOUT | POLLWRNORM rather than 0 when there is no data to read. Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> Signed-off-by: James Morris <james.l.morris@oracle.com>
Diffstat (limited to 'security/tomoyo/common.c')
-rw-r--r--security/tomoyo/common.c54
1 files changed, 18 insertions, 36 deletions
diff --git a/security/tomoyo/common.c b/security/tomoyo/common.c
index c47d3ce6c733..d8561c30fbf2 100644
--- a/security/tomoyo/common.c
+++ b/security/tomoyo/common.c
@@ -2111,7 +2111,7 @@ static struct tomoyo_domain_info *tomoyo_find_domain_by_qid
2111 struct tomoyo_domain_info *domain = NULL; 2111 struct tomoyo_domain_info *domain = NULL;
2112 spin_lock(&tomoyo_query_list_lock); 2112 spin_lock(&tomoyo_query_list_lock);
2113 list_for_each_entry(ptr, &tomoyo_query_list, list) { 2113 list_for_each_entry(ptr, &tomoyo_query_list, list) {
2114 if (ptr->serial != serial || ptr->answer) 2114 if (ptr->serial != serial)
2115 continue; 2115 continue;
2116 domain = ptr->domain; 2116 domain = ptr->domain;
2117 break; 2117 break;
@@ -2130,28 +2130,13 @@ static struct tomoyo_domain_info *tomoyo_find_domain_by_qid
2130 * 2130 *
2131 * Waits for access requests which violated policy in enforcing mode. 2131 * Waits for access requests which violated policy in enforcing mode.
2132 */ 2132 */
2133static int tomoyo_poll_query(struct file *file, poll_table *wait) 2133static unsigned int tomoyo_poll_query(struct file *file, poll_table *wait)
2134{ 2134{
2135 struct list_head *tmp; 2135 if (!list_empty(&tomoyo_query_list))
2136 bool found = false; 2136 return POLLIN | POLLRDNORM;
2137 u8 i; 2137 poll_wait(file, &tomoyo_query_wait, wait);
2138 for (i = 0; i < 2; i++) { 2138 if (!list_empty(&tomoyo_query_list))
2139 spin_lock(&tomoyo_query_list_lock); 2139 return POLLIN | POLLRDNORM;
2140 list_for_each(tmp, &tomoyo_query_list) {
2141 struct tomoyo_query *ptr =
2142 list_entry(tmp, typeof(*ptr), list);
2143 if (ptr->answer)
2144 continue;
2145 found = true;
2146 break;
2147 }
2148 spin_unlock(&tomoyo_query_list_lock);
2149 if (found)
2150 return POLLIN | POLLRDNORM;
2151 if (i)
2152 break;
2153 poll_wait(file, &tomoyo_query_wait, wait);
2154 }
2155 return 0; 2140 return 0;
2156} 2141}
2157 2142
@@ -2175,8 +2160,6 @@ static void tomoyo_read_query(struct tomoyo_io_buffer *head)
2175 spin_lock(&tomoyo_query_list_lock); 2160 spin_lock(&tomoyo_query_list_lock);
2176 list_for_each(tmp, &tomoyo_query_list) { 2161 list_for_each(tmp, &tomoyo_query_list) {
2177 struct tomoyo_query *ptr = list_entry(tmp, typeof(*ptr), list); 2162 struct tomoyo_query *ptr = list_entry(tmp, typeof(*ptr), list);
2178 if (ptr->answer)
2179 continue;
2180 if (pos++ != head->r.query_index) 2163 if (pos++ != head->r.query_index)
2181 continue; 2164 continue;
2182 len = ptr->query_len; 2165 len = ptr->query_len;
@@ -2194,8 +2177,6 @@ static void tomoyo_read_query(struct tomoyo_io_buffer *head)
2194 spin_lock(&tomoyo_query_list_lock); 2177 spin_lock(&tomoyo_query_list_lock);
2195 list_for_each(tmp, &tomoyo_query_list) { 2178 list_for_each(tmp, &tomoyo_query_list) {
2196 struct tomoyo_query *ptr = list_entry(tmp, typeof(*ptr), list); 2179 struct tomoyo_query *ptr = list_entry(tmp, typeof(*ptr), list);
2197 if (ptr->answer)
2198 continue;
2199 if (pos++ != head->r.query_index) 2180 if (pos++ != head->r.query_index)
2200 continue; 2181 continue;
2201 /* 2182 /*
@@ -2243,8 +2224,10 @@ static int tomoyo_write_answer(struct tomoyo_io_buffer *head)
2243 struct tomoyo_query *ptr = list_entry(tmp, typeof(*ptr), list); 2224 struct tomoyo_query *ptr = list_entry(tmp, typeof(*ptr), list);
2244 if (ptr->serial != serial) 2225 if (ptr->serial != serial)
2245 continue; 2226 continue;
2246 if (!ptr->answer) 2227 ptr->answer = answer;
2247 ptr->answer = answer; 2228 /* Remove from tomoyo_query_list. */
2229 if (ptr->answer)
2230 list_del_init(&ptr->list);
2248 break; 2231 break;
2249 } 2232 }
2250 spin_unlock(&tomoyo_query_list_lock); 2233 spin_unlock(&tomoyo_query_list_lock);
@@ -2477,18 +2460,17 @@ int tomoyo_open_control(const u8 type, struct file *file)
2477 * tomoyo_poll_control - poll() for /sys/kernel/security/tomoyo/ interface. 2460 * tomoyo_poll_control - poll() for /sys/kernel/security/tomoyo/ interface.
2478 * 2461 *
2479 * @file: Pointer to "struct file". 2462 * @file: Pointer to "struct file".
2480 * @wait: Pointer to "poll_table". 2463 * @wait: Pointer to "poll_table". Maybe NULL.
2481 * 2464 *
2482 * Waits for read readiness. 2465 * Returns POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM if ready to read/write,
2483 * /sys/kernel/security/tomoyo/query is handled by /usr/sbin/tomoyo-queryd and 2466 * POLLOUT | POLLWRNORM otherwise.
2484 * /sys/kernel/security/tomoyo/audit is handled by /usr/sbin/tomoyo-auditd.
2485 */ 2467 */
2486int tomoyo_poll_control(struct file *file, poll_table *wait) 2468unsigned int tomoyo_poll_control(struct file *file, poll_table *wait)
2487{ 2469{
2488 struct tomoyo_io_buffer *head = file->private_data; 2470 struct tomoyo_io_buffer *head = file->private_data;
2489 if (!head->poll) 2471 if (head->poll)
2490 return -ENOSYS; 2472 return head->poll(file, wait) | POLLOUT | POLLWRNORM;
2491 return head->poll(file, wait); 2473 return POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM;
2492} 2474}
2493 2475
2494/** 2476/**