Re: buggy GFP_KERNEL allocators

From: Ben LaHaise (bcrl@redhat.com)
Date: Wed Jan 26 2000 - 13:15:51 EST


Hello Rik & all,

Here's a patch for two of the places that touch userspace after modifying
current->state. Alan, could you include these in the next pre patch?

                -ben

diff -ur clean/2.2.15pre4/kernel/exit.c linux/kernel/exit.c
--- clean/2.2.15pre4/kernel/exit.c Wed Jan 26 11:30:15 2000
+++ linux/kernel/exit.c Wed Jan 26 13:00:26 2000
@@ -473,6 +473,7 @@
                                 if (!(options & WUNTRACED) && !(p->flags & PF_PTRACED))
                                         continue;
                                 read_unlock(&tasklist_lock);
+ current->state = TASK_RUNNING; /* We *must* do this before touching userspace! */
                                 retval = ru ? getrusage(p, RUSAGE_BOTH, ru) : 0;
                                 if (!retval && stat_addr)
                                         retval = put_user((p->exit_code << 8) | 0x7f, stat_addr);
@@ -485,6 +486,7 @@
                                 current->times.tms_cutime += p->times.tms_utime + p->times.tms_cutime;
                                 current->times.tms_cstime += p->times.tms_stime + p->times.tms_cstime;
                                 read_unlock(&tasklist_lock);
+ current->state = TASK_RUNNING; /* We *must* do this before touching userspace! */
                                 retval = ru ? getrusage(p, RUSAGE_BOTH, ru) : 0;
                                 if (!retval && stat_addr)
                                         retval = put_user(p->exit_code, stat_addr);
diff -ur clean/2.2.15pre4/net/ipv4/tcp.c linux/net/ipv4/tcp.c
--- clean/2.2.15pre4/net/ipv4/tcp.c Wed Jan 26 11:30:40 2000
+++ linux/net/ipv4/tcp.c Wed Jan 26 12:57:00 2000
@@ -1283,6 +1283,9 @@
                 continue;
 
         found_ok_skb:
+ /* Below we'll be accessing user memory, which might sleep, so... */
+ current->state = TASK_RUNNING;
+
                 /* Lock the buffer. We can be fairly relaxed as
                  * an interrupt will never steal a buffer we are
                  * using unless I've missed something serious in
@@ -1364,15 +1367,15 @@
                 break;
         }
 
+ remove_wait_queue(sk->sleep, &wait);
+ current->state = TASK_RUNNING;
+
         if(copied >= 0 && msg->msg_name) {
                 tp->af_specific->addr2sockaddr(sk, (struct sockaddr *)
                                                msg->msg_name);
                 if(addr_len)
                         *addr_len = tp->af_specific->sockaddr_len;
         }
-
- remove_wait_queue(sk->sleep, &wait);
- current->state = TASK_RUNNING;
 
         /* Clean up data we have read: This will do ACK frames. */
         cleanup_rbuf(sk, copied);

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Mon Jan 31 2000 - 21:00:17 EST