]> git.pld-linux.org Git - packages/kernel.git/blame - 2.6.0-t10-POSIX_message_queues-1of2-lkml.patch
- [2.4.2x, 2.6.x] don't recursively crash in die() on CHRP/PReP machines
[packages/kernel.git] / 2.6.0-t10-POSIX_message_queues-1of2-lkml.patch
CommitLineData
f328a626 1diff -urN 2.6.0-test10-orig_1/ipc/msg.c 2.6.0-test10-patched_1/ipc/msg.c
2--- 2.6.0-test10-orig_1/ipc/msg.c 2003-11-07 17:07:13.000000000 +0100
3+++ 2.6.0-test10-patched_1/ipc/msg.c 2003-11-21 17:11:17.000000000 +0100
4@@ -51,11 +51,6 @@
5 struct task_struct* tsk;
6 };
7
8-struct msg_msgseg {
9- struct msg_msgseg* next;
10- /* the next part of the message follows immediately */
11-};
12-
13 #define SEARCH_ANY 1
14 #define SEARCH_EQUAL 2
15 #define SEARCH_NOTEQUAL 3
16@@ -129,106 +124,6 @@
17 return msg_buildid(id,msq->q_perm.seq);
18 }
19
20-static void free_msg(struct msg_msg* msg)
21-{
22- struct msg_msgseg* seg;
23-
24- security_msg_msg_free(msg);
25-
26- seg = msg->next;
27- kfree(msg);
28- while(seg != NULL) {
29- struct msg_msgseg* tmp = seg->next;
30- kfree(seg);
31- seg = tmp;
32- }
33-}
34-
35-static struct msg_msg* load_msg(void* src, int len)
36-{
37- struct msg_msg* msg;
38- struct msg_msgseg** pseg;
39- int err;
40- int alen;
41-
42- alen = len;
43- if(alen > DATALEN_MSG)
44- alen = DATALEN_MSG;
45-
46- msg = (struct msg_msg *) kmalloc (sizeof(*msg) + alen, GFP_KERNEL);
47- if(msg==NULL)
48- return ERR_PTR(-ENOMEM);
49-
50- msg->next = NULL;
51- msg->security = NULL;
52-
53- if (copy_from_user(msg+1, src, alen)) {
54- err = -EFAULT;
55- goto out_err;
56- }
57-
58- len -= alen;
59- src = ((char*)src)+alen;
60- pseg = &msg->next;
61- while(len > 0) {
62- struct msg_msgseg* seg;
63- alen = len;
64- if(alen > DATALEN_SEG)
65- alen = DATALEN_SEG;
66- seg = (struct msg_msgseg *) kmalloc (sizeof(*seg) + alen, GFP_KERNEL);
67- if(seg==NULL) {
68- err=-ENOMEM;
69- goto out_err;
70- }
71- *pseg = seg;
72- seg->next = NULL;
73- if(copy_from_user (seg+1, src, alen)) {
74- err = -EFAULT;
75- goto out_err;
76- }
77- pseg = &seg->next;
78- len -= alen;
79- src = ((char*)src)+alen;
80- }
81-
82- err = security_msg_msg_alloc(msg);
83- if (err)
84- goto out_err;
85-
86- return msg;
87-
88-out_err:
89- free_msg(msg);
90- return ERR_PTR(err);
91-}
92-
93-static int store_msg(void* dest, struct msg_msg* msg, int len)
94-{
95- int alen;
96- struct msg_msgseg *seg;
97-
98- alen = len;
99- if(alen > DATALEN_MSG)
100- alen = DATALEN_MSG;
101- if(copy_to_user (dest, msg+1, alen))
102- return -1;
103-
104- len -= alen;
105- dest = ((char*)dest)+alen;
106- seg = msg->next;
107- while(len > 0) {
108- alen = len;
109- if(alen > DATALEN_SEG)
110- alen = DATALEN_SEG;
111- if(copy_to_user (dest, seg+1, alen))
112- return -1;
113- len -= alen;
114- dest = ((char*)dest)+alen;
115- seg=seg->next;
116- }
117- return 0;
118-}
119-
120 static inline void ss_add(struct msg_queue* msq, struct msg_sender* mss)
121 {
122 mss->tsk=current;
123diff -urN 2.6.0-test10-orig_1/ipc/util.c 2.6.0-test10-patched_1/ipc/util.c
124--- 2.6.0-test10-orig_1/ipc/util.c 2003-11-07 17:07:13.000000000 +0100
125+++ 2.6.0-test10-patched_1/ipc/util.c 2003-11-21 17:11:17.000000000 +0100
126@@ -611,3 +611,107 @@
127 }
128
129 #endif /* CONFIG_SYSVIPC */
130+
131+#ifdef CONFIG_SYSVIPC
132+
133+void free_msg(struct msg_msg* msg)
134+{
135+ struct msg_msgseg* seg;
136+
137+ security_msg_msg_free(msg);
138+
139+ seg = msg->next;
140+ kfree(msg);
141+ while(seg != NULL) {
142+ struct msg_msgseg* tmp = seg->next;
143+ kfree(seg);
144+ seg = tmp;
145+ }
146+}
147+
148+struct msg_msg* load_msg(void* src, int len)
149+{
150+ struct msg_msg* msg;
151+ struct msg_msgseg** pseg;
152+ int err;
153+ int alen;
154+
155+ alen = len;
156+ if(alen > DATALEN_MSG)
157+ alen = DATALEN_MSG;
158+
159+ msg = (struct msg_msg *) kmalloc (sizeof(*msg) + alen, GFP_KERNEL);
160+ if(msg==NULL)
161+ return ERR_PTR(-ENOMEM);
162+
163+ msg->next = NULL;
164+ msg->security = NULL;
165+
166+ if (copy_from_user(msg+1, src, alen)) {
167+ err = -EFAULT;
168+ goto out_err;
169+ }
170+
171+ len -= alen;
172+ src = ((char*)src)+alen;
173+ pseg = &msg->next;
174+ while(len > 0) {
175+ struct msg_msgseg* seg;
176+ alen = len;
177+ if(alen > DATALEN_SEG)
178+ alen = DATALEN_SEG;
179+ seg = (struct msg_msgseg *) kmalloc (sizeof(*seg) + alen, GFP_KERNEL);
180+ if(seg==NULL) {
181+ err=-ENOMEM;
182+ goto out_err;
183+ }
184+ *pseg = seg;
185+ seg->next = NULL;
186+ if(copy_from_user (seg+1, src, alen)) {
187+ err = -EFAULT;
188+ goto out_err;
189+ }
190+ pseg = &seg->next;
191+ len -= alen;
192+ src = ((char*)src)+alen;
193+ }
194+
195+ err = security_msg_msg_alloc(msg);
196+ if (err)
197+ goto out_err;
198+
199+ return msg;
200+
201+out_err:
202+ free_msg(msg);
203+ return ERR_PTR(err);
204+}
205+
206+int store_msg(void* dest, struct msg_msg* msg, int len)
207+{
208+ int alen;
209+ struct msg_msgseg *seg;
210+
211+ alen = len;
212+ if(alen > DATALEN_MSG)
213+ alen = DATALEN_MSG;
214+ if(copy_to_user (dest, msg+1, alen))
215+ return -1;
216+
217+ len -= alen;
218+ dest = ((char*)dest)+alen;
219+ seg = msg->next;
220+ while(len > 0) {
221+ alen = len;
222+ if(alen > DATALEN_SEG)
223+ alen = DATALEN_SEG;
224+ if(copy_to_user (dest, seg+1, alen))
225+ return -1;
226+ len -= alen;
227+ dest = ((char*)dest)+alen;
228+ seg=seg->next;
229+ }
230+ return 0;
231+}
232+
233+#endif /* CONFIG_SYSVIPC */
234diff -urN 2.6.0-test10-orig_1/ipc/util.h 2.6.0-test10-patched_1/ipc/util.h
235--- 2.6.0-test10-orig_1/ipc/util.h 2003-11-07 17:07:13.000000000 +0100
236+++ 2.6.0-test10-patched_1/ipc/util.h 2003-11-21 17:11:17.000000000 +0100
237@@ -25,6 +25,16 @@
238 struct kern_ipc_perm* p;
239 };
240
241+struct msg_msgseg {
242+ struct msg_msgseg* next;
243+ /* the next part of the message follows immediately */
244+};
245+
246+void free_msg(struct msg_msg* msg);
247+struct msg_msg* load_msg(void* src, int len);
248+int store_msg(void* dest, struct msg_msg* msg, int len);
249+
250+
251 void __init ipc_init_ids(struct ipc_ids* ids, int size);
252
253 /* must be called with ids->sem acquired.*/
This page took 0.230376 seconds and 4 git commands to generate.