]>
Commit | Line | Data |
---|---|---|
f328a626 | 1 | diff -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; | |
123 | diff -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 */ | |
234 | diff -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.*/ |