Blame


1 d3df3087 2003-12-06 devnull #include <u.h>
2 d3df3087 2003-12-06 devnull #include <libc.h>
3 d3df3087 2003-12-06 devnull #include <fcall.h>
4 d3df3087 2003-12-06 devnull
5 d3df3087 2003-12-06 devnull static
6 d3df3087 2003-12-06 devnull uchar*
7 d3df3087 2003-12-06 devnull gstring(uchar *p, uchar *ep, char **s)
8 d3df3087 2003-12-06 devnull {
9 d3df3087 2003-12-06 devnull uint n;
10 d3df3087 2003-12-06 devnull
11 d3df3087 2003-12-06 devnull if(p+BIT16SZ > ep)
12 d3df3087 2003-12-06 devnull return nil;
13 d3df3087 2003-12-06 devnull n = GBIT16(p);
14 d3df3087 2003-12-06 devnull p += BIT16SZ - 1;
15 d3df3087 2003-12-06 devnull if(p+n+1 > ep)
16 d3df3087 2003-12-06 devnull return nil;
17 d3df3087 2003-12-06 devnull /* move it down, on top of count, to make room for '\0' */
18 d3df3087 2003-12-06 devnull memmove(p, p + 1, n);
19 d3df3087 2003-12-06 devnull p[n] = '\0';
20 d3df3087 2003-12-06 devnull *s = (char*)p;
21 d3df3087 2003-12-06 devnull p += n+1;
22 d3df3087 2003-12-06 devnull return p;
23 d3df3087 2003-12-06 devnull }
24 d3df3087 2003-12-06 devnull
25 d3df3087 2003-12-06 devnull static
26 d3df3087 2003-12-06 devnull uchar*
27 d3df3087 2003-12-06 devnull gqid(uchar *p, uchar *ep, Qid *q)
28 d3df3087 2003-12-06 devnull {
29 d3df3087 2003-12-06 devnull if(p+QIDSZ > ep)
30 d3df3087 2003-12-06 devnull return nil;
31 d3df3087 2003-12-06 devnull q->type = GBIT8(p);
32 d3df3087 2003-12-06 devnull p += BIT8SZ;
33 d3df3087 2003-12-06 devnull q->vers = GBIT32(p);
34 d3df3087 2003-12-06 devnull p += BIT32SZ;
35 d3df3087 2003-12-06 devnull q->path = GBIT64(p);
36 d3df3087 2003-12-06 devnull p += BIT64SZ;
37 d3df3087 2003-12-06 devnull return p;
38 d3df3087 2003-12-06 devnull }
39 d3df3087 2003-12-06 devnull
40 d3df3087 2003-12-06 devnull /*
41 d3df3087 2003-12-06 devnull * no syntactic checks.
42 d3df3087 2003-12-06 devnull * three causes for error:
43 d3df3087 2003-12-06 devnull * 1. message size field is incorrect
44 d3df3087 2003-12-06 devnull * 2. input buffer too short for its own data (counts too long, etc.)
45 d3df3087 2003-12-06 devnull * 3. too many names or qids
46 d3df3087 2003-12-06 devnull * gqid() and gstring() return nil if they would reach beyond buffer.
47 d3df3087 2003-12-06 devnull * main switch statement checks range and also can fall through
48 d3df3087 2003-12-06 devnull * to test at end of routine.
49 d3df3087 2003-12-06 devnull */
50 d3df3087 2003-12-06 devnull uint
51 fb941e08 2005-09-13 devnull convM2Su(uchar *ap, uint nap, Fcall *f, int dotu)
52 d3df3087 2003-12-06 devnull {
53 d3df3087 2003-12-06 devnull uchar *p, *ep;
54 d3df3087 2003-12-06 devnull uint i, size;
55 d3df3087 2003-12-06 devnull
56 d3df3087 2003-12-06 devnull p = ap;
57 d3df3087 2003-12-06 devnull ep = p + nap;
58 d3df3087 2003-12-06 devnull
59 d3df3087 2003-12-06 devnull if(p+BIT32SZ+BIT8SZ+BIT16SZ > ep)
60 d3df3087 2003-12-06 devnull return 0;
61 d3df3087 2003-12-06 devnull size = GBIT32(p);
62 d3df3087 2003-12-06 devnull p += BIT32SZ;
63 d3df3087 2003-12-06 devnull
64 d3df3087 2003-12-06 devnull if(size < BIT32SZ+BIT8SZ+BIT16SZ)
65 d3df3087 2003-12-06 devnull return 0;
66 d3df3087 2003-12-06 devnull
67 d3df3087 2003-12-06 devnull f->type = GBIT8(p);
68 d3df3087 2003-12-06 devnull p += BIT8SZ;
69 d3df3087 2003-12-06 devnull f->tag = GBIT16(p);
70 d3df3087 2003-12-06 devnull p += BIT16SZ;
71 d3df3087 2003-12-06 devnull
72 d3df3087 2003-12-06 devnull switch(f->type)
73 d3df3087 2003-12-06 devnull {
74 d3df3087 2003-12-06 devnull default:
75 d3df3087 2003-12-06 devnull return 0;
76 d3df3087 2003-12-06 devnull
77 d3df3087 2003-12-06 devnull case Tversion:
78 d3df3087 2003-12-06 devnull if(p+BIT32SZ > ep)
79 d3df3087 2003-12-06 devnull return 0;
80 d3df3087 2003-12-06 devnull f->msize = GBIT32(p);
81 d3df3087 2003-12-06 devnull p += BIT32SZ;
82 d3df3087 2003-12-06 devnull p = gstring(p, ep, &f->version);
83 d3df3087 2003-12-06 devnull break;
84 d3df3087 2003-12-06 devnull
85 d3df3087 2003-12-06 devnull case Tflush:
86 d3df3087 2003-12-06 devnull if(p+BIT16SZ > ep)
87 d3df3087 2003-12-06 devnull return 0;
88 d3df3087 2003-12-06 devnull f->oldtag = GBIT16(p);
89 d3df3087 2003-12-06 devnull p += BIT16SZ;
90 d3df3087 2003-12-06 devnull break;
91 d3df3087 2003-12-06 devnull
92 d3df3087 2003-12-06 devnull case Tauth:
93 d3df3087 2003-12-06 devnull if(p+BIT32SZ > ep)
94 d3df3087 2003-12-06 devnull return 0;
95 d3df3087 2003-12-06 devnull f->afid = GBIT32(p);
96 d3df3087 2003-12-06 devnull p += BIT32SZ;
97 d3df3087 2003-12-06 devnull p = gstring(p, ep, &f->uname);
98 d3df3087 2003-12-06 devnull if(p == nil)
99 d3df3087 2003-12-06 devnull break;
100 d3df3087 2003-12-06 devnull p = gstring(p, ep, &f->aname);
101 d3df3087 2003-12-06 devnull if(p == nil)
102 d3df3087 2003-12-06 devnull break;
103 8ff457f5 2009-08-20 tim.newsh f->uidnum = NOUID;
104 8ff457f5 2009-08-20 tim.newsh if(dotu){
105 8ff457f5 2009-08-20 tim.newsh if(p+BIT32SZ > ep)
106 8ff457f5 2009-08-20 tim.newsh return 0;
107 8ff457f5 2009-08-20 tim.newsh f->uidnum = GBIT32(p);
108 8ff457f5 2009-08-20 tim.newsh p += BIT32SZ;
109 8ff457f5 2009-08-20 tim.newsh }
110 d3df3087 2003-12-06 devnull break;
111 d3df3087 2003-12-06 devnull
112 d3df3087 2003-12-06 devnull case Tattach:
113 d3df3087 2003-12-06 devnull if(p+BIT32SZ > ep)
114 d3df3087 2003-12-06 devnull return 0;
115 d3df3087 2003-12-06 devnull f->fid = GBIT32(p);
116 d3df3087 2003-12-06 devnull p += BIT32SZ;
117 d3df3087 2003-12-06 devnull if(p+BIT32SZ > ep)
118 d3df3087 2003-12-06 devnull return 0;
119 d3df3087 2003-12-06 devnull f->afid = GBIT32(p);
120 d3df3087 2003-12-06 devnull p += BIT32SZ;
121 d3df3087 2003-12-06 devnull p = gstring(p, ep, &f->uname);
122 d3df3087 2003-12-06 devnull if(p == nil)
123 d3df3087 2003-12-06 devnull break;
124 d3df3087 2003-12-06 devnull p = gstring(p, ep, &f->aname);
125 d3df3087 2003-12-06 devnull if(p == nil)
126 d3df3087 2003-12-06 devnull break;
127 8ff457f5 2009-08-20 tim.newsh f->uidnum = NOUID;
128 8ff457f5 2009-08-20 tim.newsh if(dotu){
129 8ff457f5 2009-08-20 tim.newsh if(p+BIT32SZ > ep)
130 8ff457f5 2009-08-20 tim.newsh return 0;
131 8ff457f5 2009-08-20 tim.newsh f->uidnum = GBIT32(p);
132 8ff457f5 2009-08-20 tim.newsh p += BIT32SZ;
133 8ff457f5 2009-08-20 tim.newsh }
134 d3df3087 2003-12-06 devnull break;
135 d3df3087 2003-12-06 devnull
136 d3df3087 2003-12-06 devnull case Twalk:
137 d3df3087 2003-12-06 devnull if(p+BIT32SZ+BIT32SZ+BIT16SZ > ep)
138 d3df3087 2003-12-06 devnull return 0;
139 d3df3087 2003-12-06 devnull f->fid = GBIT32(p);
140 d3df3087 2003-12-06 devnull p += BIT32SZ;
141 d3df3087 2003-12-06 devnull f->newfid = GBIT32(p);
142 d3df3087 2003-12-06 devnull p += BIT32SZ;
143 d3df3087 2003-12-06 devnull f->nwname = GBIT16(p);
144 d3df3087 2003-12-06 devnull p += BIT16SZ;
145 d3df3087 2003-12-06 devnull if(f->nwname > MAXWELEM)
146 d3df3087 2003-12-06 devnull return 0;
147 d3df3087 2003-12-06 devnull for(i=0; i<f->nwname; i++){
148 d3df3087 2003-12-06 devnull p = gstring(p, ep, &f->wname[i]);
149 d3df3087 2003-12-06 devnull if(p == nil)
150 d3df3087 2003-12-06 devnull break;
151 d3df3087 2003-12-06 devnull }
152 d3df3087 2003-12-06 devnull break;
153 d3df3087 2003-12-06 devnull
154 d3df3087 2003-12-06 devnull case Topen:
155 32f69c36 2003-12-11 devnull case Topenfd:
156 d3df3087 2003-12-06 devnull if(p+BIT32SZ+BIT8SZ > ep)
157 d3df3087 2003-12-06 devnull return 0;
158 d3df3087 2003-12-06 devnull f->fid = GBIT32(p);
159 d3df3087 2003-12-06 devnull p += BIT32SZ;
160 d3df3087 2003-12-06 devnull f->mode = GBIT8(p);
161 d3df3087 2003-12-06 devnull p += BIT8SZ;
162 d3df3087 2003-12-06 devnull break;
163 d3df3087 2003-12-06 devnull
164 d3df3087 2003-12-06 devnull case Tcreate:
165 d3df3087 2003-12-06 devnull if(p+BIT32SZ > ep)
166 d3df3087 2003-12-06 devnull return 0;
167 d3df3087 2003-12-06 devnull f->fid = GBIT32(p);
168 d3df3087 2003-12-06 devnull p += BIT32SZ;
169 d3df3087 2003-12-06 devnull p = gstring(p, ep, &f->name);
170 d3df3087 2003-12-06 devnull if(p == nil)
171 d3df3087 2003-12-06 devnull break;
172 d3df3087 2003-12-06 devnull if(p+BIT32SZ+BIT8SZ > ep)
173 d3df3087 2003-12-06 devnull return 0;
174 d3df3087 2003-12-06 devnull f->perm = GBIT32(p);
175 d3df3087 2003-12-06 devnull p += BIT32SZ;
176 d3df3087 2003-12-06 devnull f->mode = GBIT8(p);
177 d3df3087 2003-12-06 devnull p += BIT8SZ;
178 b5c7be2f 2006-03-03 devnull if(dotu)
179 b5c7be2f 2006-03-03 devnull p = gstring(p, ep, &f->extension);
180 d3df3087 2003-12-06 devnull break;
181 d3df3087 2003-12-06 devnull
182 d3df3087 2003-12-06 devnull case Tread:
183 d3df3087 2003-12-06 devnull if(p+BIT32SZ+BIT64SZ+BIT32SZ > ep)
184 d3df3087 2003-12-06 devnull return 0;
185 d3df3087 2003-12-06 devnull f->fid = GBIT32(p);
186 d3df3087 2003-12-06 devnull p += BIT32SZ;
187 d3df3087 2003-12-06 devnull f->offset = GBIT64(p);
188 d3df3087 2003-12-06 devnull p += BIT64SZ;
189 d3df3087 2003-12-06 devnull f->count = GBIT32(p);
190 d3df3087 2003-12-06 devnull p += BIT32SZ;
191 d3df3087 2003-12-06 devnull break;
192 d3df3087 2003-12-06 devnull
193 d3df3087 2003-12-06 devnull case Twrite:
194 d3df3087 2003-12-06 devnull if(p+BIT32SZ+BIT64SZ+BIT32SZ > ep)
195 d3df3087 2003-12-06 devnull return 0;
196 d3df3087 2003-12-06 devnull f->fid = GBIT32(p);
197 d3df3087 2003-12-06 devnull p += BIT32SZ;
198 d3df3087 2003-12-06 devnull f->offset = GBIT64(p);
199 d3df3087 2003-12-06 devnull p += BIT64SZ;
200 d3df3087 2003-12-06 devnull f->count = GBIT32(p);
201 d3df3087 2003-12-06 devnull p += BIT32SZ;
202 d3df3087 2003-12-06 devnull if(p+f->count > ep)
203 d3df3087 2003-12-06 devnull return 0;
204 d3df3087 2003-12-06 devnull f->data = (char*)p;
205 d3df3087 2003-12-06 devnull p += f->count;
206 d3df3087 2003-12-06 devnull break;
207 d3df3087 2003-12-06 devnull
208 d3df3087 2003-12-06 devnull case Tclunk:
209 d3df3087 2003-12-06 devnull case Tremove:
210 d3df3087 2003-12-06 devnull if(p+BIT32SZ > ep)
211 d3df3087 2003-12-06 devnull return 0;
212 d3df3087 2003-12-06 devnull f->fid = GBIT32(p);
213 d3df3087 2003-12-06 devnull p += BIT32SZ;
214 d3df3087 2003-12-06 devnull break;
215 d3df3087 2003-12-06 devnull
216 d3df3087 2003-12-06 devnull case Tstat:
217 d3df3087 2003-12-06 devnull if(p+BIT32SZ > ep)
218 d3df3087 2003-12-06 devnull return 0;
219 d3df3087 2003-12-06 devnull f->fid = GBIT32(p);
220 d3df3087 2003-12-06 devnull p += BIT32SZ;
221 d3df3087 2003-12-06 devnull break;
222 d3df3087 2003-12-06 devnull
223 d3df3087 2003-12-06 devnull case Twstat:
224 d3df3087 2003-12-06 devnull if(p+BIT32SZ+BIT16SZ > ep)
225 d3df3087 2003-12-06 devnull return 0;
226 d3df3087 2003-12-06 devnull f->fid = GBIT32(p);
227 d3df3087 2003-12-06 devnull p += BIT32SZ;
228 d3df3087 2003-12-06 devnull f->nstat = GBIT16(p);
229 d3df3087 2003-12-06 devnull p += BIT16SZ;
230 d3df3087 2003-12-06 devnull if(p+f->nstat > ep)
231 d3df3087 2003-12-06 devnull return 0;
232 d3df3087 2003-12-06 devnull f->stat = p;
233 d3df3087 2003-12-06 devnull p += f->nstat;
234 d3df3087 2003-12-06 devnull break;
235 d3df3087 2003-12-06 devnull
236 d3df3087 2003-12-06 devnull /*
237 d3df3087 2003-12-06 devnull */
238 d3df3087 2003-12-06 devnull case Rversion:
239 d3df3087 2003-12-06 devnull if(p+BIT32SZ > ep)
240 d3df3087 2003-12-06 devnull return 0;
241 d3df3087 2003-12-06 devnull f->msize = GBIT32(p);
242 d3df3087 2003-12-06 devnull p += BIT32SZ;
243 d3df3087 2003-12-06 devnull p = gstring(p, ep, &f->version);
244 d3df3087 2003-12-06 devnull break;
245 d3df3087 2003-12-06 devnull
246 d3df3087 2003-12-06 devnull case Rerror:
247 d3df3087 2003-12-06 devnull p = gstring(p, ep, &f->ename);
248 fb941e08 2005-09-13 devnull f->errornum = 0;
249 fb941e08 2005-09-13 devnull if(dotu){
250 8ff457f5 2009-08-20 tim.newsh if(p+BIT32SZ > ep)
251 fb941e08 2005-09-13 devnull return 0;
252 8ff457f5 2009-08-20 tim.newsh f->errornum = GBIT32(p);
253 8ff457f5 2009-08-20 tim.newsh p += BIT32SZ;
254 fb941e08 2005-09-13 devnull }
255 d3df3087 2003-12-06 devnull break;
256 d3df3087 2003-12-06 devnull
257 d3df3087 2003-12-06 devnull case Rflush:
258 d3df3087 2003-12-06 devnull break;
259 d3df3087 2003-12-06 devnull
260 d3df3087 2003-12-06 devnull case Rauth:
261 d3df3087 2003-12-06 devnull p = gqid(p, ep, &f->aqid);
262 d3df3087 2003-12-06 devnull if(p == nil)
263 d3df3087 2003-12-06 devnull break;
264 d3df3087 2003-12-06 devnull break;
265 d3df3087 2003-12-06 devnull
266 d3df3087 2003-12-06 devnull case Rattach:
267 d3df3087 2003-12-06 devnull p = gqid(p, ep, &f->qid);
268 d3df3087 2003-12-06 devnull if(p == nil)
269 d3df3087 2003-12-06 devnull break;
270 d3df3087 2003-12-06 devnull break;
271 d3df3087 2003-12-06 devnull
272 d3df3087 2003-12-06 devnull case Rwalk:
273 d3df3087 2003-12-06 devnull if(p+BIT16SZ > ep)
274 d3df3087 2003-12-06 devnull return 0;
275 d3df3087 2003-12-06 devnull f->nwqid = GBIT16(p);
276 d3df3087 2003-12-06 devnull p += BIT16SZ;
277 d3df3087 2003-12-06 devnull if(f->nwqid > MAXWELEM)
278 d3df3087 2003-12-06 devnull return 0;
279 d3df3087 2003-12-06 devnull for(i=0; i<f->nwqid; i++){
280 d3df3087 2003-12-06 devnull p = gqid(p, ep, &f->wqid[i]);
281 d3df3087 2003-12-06 devnull if(p == nil)
282 d3df3087 2003-12-06 devnull break;
283 d3df3087 2003-12-06 devnull }
284 d3df3087 2003-12-06 devnull break;
285 d3df3087 2003-12-06 devnull
286 d3df3087 2003-12-06 devnull case Ropen:
287 32f69c36 2003-12-11 devnull case Ropenfd:
288 d3df3087 2003-12-06 devnull case Rcreate:
289 d3df3087 2003-12-06 devnull p = gqid(p, ep, &f->qid);
290 d3df3087 2003-12-06 devnull if(p == nil)
291 d3df3087 2003-12-06 devnull break;
292 d3df3087 2003-12-06 devnull if(p+BIT32SZ > ep)
293 d3df3087 2003-12-06 devnull return 0;
294 d3df3087 2003-12-06 devnull f->iounit = GBIT32(p);
295 d3df3087 2003-12-06 devnull p += BIT32SZ;
296 32f69c36 2003-12-11 devnull if(f->type == Ropenfd){
297 32f69c36 2003-12-11 devnull if(p+BIT32SZ > ep)
298 32f69c36 2003-12-11 devnull return 0;
299 32f69c36 2003-12-11 devnull f->unixfd = GBIT32(p);
300 32f69c36 2003-12-11 devnull p += BIT32SZ;
301 32f69c36 2003-12-11 devnull }
302 d3df3087 2003-12-06 devnull break;
303 d3df3087 2003-12-06 devnull
304 d3df3087 2003-12-06 devnull case Rread:
305 d3df3087 2003-12-06 devnull if(p+BIT32SZ > ep)
306 d3df3087 2003-12-06 devnull return 0;
307 d3df3087 2003-12-06 devnull f->count = GBIT32(p);
308 d3df3087 2003-12-06 devnull p += BIT32SZ;
309 d3df3087 2003-12-06 devnull if(p+f->count > ep)
310 d3df3087 2003-12-06 devnull return 0;
311 d3df3087 2003-12-06 devnull f->data = (char*)p;
312 d3df3087 2003-12-06 devnull p += f->count;
313 d3df3087 2003-12-06 devnull break;
314 d3df3087 2003-12-06 devnull
315 d3df3087 2003-12-06 devnull case Rwrite:
316 d3df3087 2003-12-06 devnull if(p+BIT32SZ > ep)
317 d3df3087 2003-12-06 devnull return 0;
318 d3df3087 2003-12-06 devnull f->count = GBIT32(p);
319 d3df3087 2003-12-06 devnull p += BIT32SZ;
320 d3df3087 2003-12-06 devnull break;
321 d3df3087 2003-12-06 devnull
322 d3df3087 2003-12-06 devnull case Rclunk:
323 d3df3087 2003-12-06 devnull case Rremove:
324 d3df3087 2003-12-06 devnull break;
325 d3df3087 2003-12-06 devnull
326 d3df3087 2003-12-06 devnull case Rstat:
327 d3df3087 2003-12-06 devnull if(p+BIT16SZ > ep)
328 d3df3087 2003-12-06 devnull return 0;
329 d3df3087 2003-12-06 devnull f->nstat = GBIT16(p);
330 d3df3087 2003-12-06 devnull p += BIT16SZ;
331 d3df3087 2003-12-06 devnull if(p+f->nstat > ep)
332 d3df3087 2003-12-06 devnull return 0;
333 d3df3087 2003-12-06 devnull f->stat = p;
334 d3df3087 2003-12-06 devnull p += f->nstat;
335 d3df3087 2003-12-06 devnull break;
336 d3df3087 2003-12-06 devnull
337 d3df3087 2003-12-06 devnull case Rwstat:
338 d3df3087 2003-12-06 devnull break;
339 d3df3087 2003-12-06 devnull }
340 d3df3087 2003-12-06 devnull
341 d3df3087 2003-12-06 devnull if(p==nil || p>ep)
342 d3df3087 2003-12-06 devnull return 0;
343 d3df3087 2003-12-06 devnull if(ap+size == p)
344 d3df3087 2003-12-06 devnull return size;
345 d3df3087 2003-12-06 devnull return 0;
346 d3df3087 2003-12-06 devnull }
347 fb941e08 2005-09-13 devnull
348 fb941e08 2005-09-13 devnull uint
349 fb941e08 2005-09-13 devnull convM2S(uchar *ap, uint nap, Fcall *f)
350 fb941e08 2005-09-13 devnull {
351 fb941e08 2005-09-13 devnull return convM2Su(ap, nap, f, 0);
352 fb941e08 2005-09-13 devnull }