Commit a73588fe481ffe39e3021decdc73a5b358f0776c
1 parent
16f416661e
Exists in
v2017.01-smarct4x
and in
25 other branches
Revert "net: nfs: Use the tx buffer to construct rpc msgs"
This reverts commit 998372b4798fd7ebb666f571950df925b8d80f69. This caused a data abort on some platform. Signed-off-by: Joe Hershberger <joe.hershberger@ni.com> Reported-by: Guillaume GARDET <guillaume.gardet@free.fr>
Showing 1 changed file with 43 additions and 45 deletions Side-by-side Diff
net/nfs.c
... | ... | @@ -170,42 +170,42 @@ |
170 | 170 | /************************************************************************** |
171 | 171 | RPC_LOOKUP - Lookup RPC Port numbers |
172 | 172 | **************************************************************************/ |
173 | -static struct rpc_t *rpc_req_prep(void) | |
173 | +static void rpc_req(int rpc_prog, int rpc_proc, uint32_t *data, int datalen) | |
174 | 174 | { |
175 | - return (struct rpc_t *)(net_tx_packet + net_eth_hdr_size() + | |
176 | - IP_UDP_HDR_SIZE); | |
177 | -} | |
178 | - | |
179 | -static void rpc_req(int rpc_prog, int rpc_proc, struct rpc_t *rpc_pkt, | |
180 | - int datalen) | |
181 | -{ | |
175 | + struct rpc_t rpc_pkt; | |
182 | 176 | unsigned long id; |
177 | + uint32_t *p; | |
183 | 178 | int pktlen; |
184 | 179 | int sport; |
185 | 180 | |
186 | 181 | id = ++rpc_id; |
187 | - rpc_pkt->u.call.id = htonl(id); | |
188 | - rpc_pkt->u.call.type = htonl(MSG_CALL); | |
189 | - rpc_pkt->u.call.rpcvers = htonl(2); /* use RPC version 2 */ | |
190 | - rpc_pkt->u.call.prog = htonl(rpc_prog); | |
182 | + rpc_pkt.u.call.id = htonl(id); | |
183 | + rpc_pkt.u.call.type = htonl(MSG_CALL); | |
184 | + rpc_pkt.u.call.rpcvers = htonl(2); /* use RPC version 2 */ | |
185 | + rpc_pkt.u.call.prog = htonl(rpc_prog); | |
191 | 186 | switch (rpc_prog) { |
192 | 187 | case PROG_NFS: |
193 | 188 | if (supported_nfs_versions & NFSV2_FLAG) |
194 | - rpc_pkt->u.call.vers = htonl(2); /* NFS v2 */ | |
189 | + rpc_pkt.u.call.vers = htonl(2); /* NFS v2 */ | |
195 | 190 | else /* NFSV3_FLAG */ |
196 | - rpc_pkt->u.call.vers = htonl(3); /* NFS v3 */ | |
191 | + rpc_pkt.u.call.vers = htonl(3); /* NFS v3 */ | |
197 | 192 | break; |
198 | 193 | case PROG_PORTMAP: |
199 | 194 | case PROG_MOUNT: |
200 | 195 | default: |
201 | - /* portmapper is version 2 */ | |
202 | - rpc_pkt->u.call.vers = htonl(2); | |
196 | + rpc_pkt.u.call.vers = htonl(2); /* portmapper is version 2 */ | |
203 | 197 | } |
204 | - rpc_pkt->u.call.proc = htonl(rpc_proc); | |
198 | + rpc_pkt.u.call.proc = htonl(rpc_proc); | |
199 | + p = (uint32_t *)&(rpc_pkt.u.call.data); | |
205 | 200 | |
206 | - pktlen = ((char *)&rpc_pkt->u.call.data - (char *)&rpc_pkt) + | |
207 | - datalen * sizeof(uint32_t); | |
201 | + if (datalen) | |
202 | + memcpy((char *)p, (char *)data, datalen*sizeof(uint32_t)); | |
208 | 203 | |
204 | + pktlen = (char *)p + datalen * sizeof(uint32_t) - (char *)&rpc_pkt; | |
205 | + | |
206 | + memcpy((char *)net_tx_packet + net_eth_hdr_size() + IP_UDP_HDR_SIZE, | |
207 | + &rpc_pkt.u.data[0], pktlen); | |
208 | + | |
209 | 209 | if (rpc_prog == PROG_PORTMAP) |
210 | 210 | sport = SUNRPC_PORT; |
211 | 211 | else if (rpc_prog == PROG_MOUNT) |
212 | 212 | |
213 | 213 | |
... | ... | @@ -222,17 +222,15 @@ |
222 | 222 | **************************************************************************/ |
223 | 223 | static void rpc_lookup_req(int prog, int ver) |
224 | 224 | { |
225 | - uint32_t *data; | |
226 | - struct rpc_t *rpc_pkt = rpc_req_prep(); | |
225 | + uint32_t data[16]; | |
227 | 226 | |
228 | - data = rpc_pkt->u.call.data; | |
229 | 227 | data[0] = 0; data[1] = 0; /* auth credential */ |
230 | 228 | data[2] = 0; data[3] = 0; /* auth verifier */ |
231 | 229 | data[4] = htonl(prog); |
232 | 230 | data[5] = htonl(ver); |
233 | 231 | data[6] = htonl(17); /* IP_UDP */ |
234 | 232 | data[7] = 0; |
235 | - rpc_req(PROG_PORTMAP, PORTMAP_GETPORT, rpc_pkt, 8); | |
233 | + rpc_req(PROG_PORTMAP, PORTMAP_GETPORT, data, 8); | |
236 | 234 | } |
237 | 235 | |
238 | 236 | /************************************************************************** |
239 | 237 | |
240 | 238 | |
... | ... | @@ -240,14 +238,14 @@ |
240 | 238 | **************************************************************************/ |
241 | 239 | static void nfs_mount_req(char *path) |
242 | 240 | { |
241 | + uint32_t data[1024]; | |
243 | 242 | uint32_t *p; |
244 | 243 | int len; |
245 | 244 | int pathlen; |
246 | - struct rpc_t *rpc_pkt = rpc_req_prep(); | |
247 | 245 | |
248 | 246 | pathlen = strlen(path); |
249 | 247 | |
250 | - p = rpc_pkt->u.call.data; | |
248 | + p = &(data[0]); | |
251 | 249 | p = rpc_add_credentials(p); |
252 | 250 | |
253 | 251 | *p++ = htonl(pathlen); |
254 | 252 | |
... | ... | @@ -256,9 +254,9 @@ |
256 | 254 | memcpy(p, path, pathlen); |
257 | 255 | p += (pathlen + 3) / 4; |
258 | 256 | |
259 | - len = (uint32_t *)p - (uint32_t *)&(rpc_pkt->u.call.data); | |
257 | + len = (uint32_t *)p - (uint32_t *)&(data[0]); | |
260 | 258 | |
261 | - rpc_req(PROG_MOUNT, MOUNT_ADDENTRY, rpc_pkt, len); | |
259 | + rpc_req(PROG_MOUNT, MOUNT_ADDENTRY, data, len); | |
262 | 260 | } |
263 | 261 | |
264 | 262 | /************************************************************************** |
265 | 263 | |
266 | 264 | |
267 | 265 | |
268 | 266 | |
... | ... | @@ -266,20 +264,20 @@ |
266 | 264 | **************************************************************************/ |
267 | 265 | static void nfs_umountall_req(void) |
268 | 266 | { |
267 | + uint32_t data[1024]; | |
269 | 268 | uint32_t *p; |
270 | 269 | int len; |
271 | - struct rpc_t *rpc_pkt = rpc_req_prep(); | |
272 | 270 | |
273 | 271 | if ((nfs_server_mount_port == -1) || (!fs_mounted)) |
274 | 272 | /* Nothing mounted, nothing to umount */ |
275 | 273 | return; |
276 | 274 | |
277 | - p = rpc_pkt->u.call.data; | |
275 | + p = &(data[0]); | |
278 | 276 | p = rpc_add_credentials(p); |
279 | 277 | |
280 | - len = (uint32_t *)p - (uint32_t *)&(rpc_pkt->u.call.data); | |
278 | + len = (uint32_t *)p - (uint32_t *)&(data[0]); | |
281 | 279 | |
282 | - rpc_req(PROG_MOUNT, MOUNT_UMOUNTALL, rpc_pkt, len); | |
280 | + rpc_req(PROG_MOUNT, MOUNT_UMOUNTALL, data, len); | |
283 | 281 | } |
284 | 282 | |
285 | 283 | /*************************************************************************** |
286 | 284 | |
287 | 285 | |
... | ... | @@ -291,11 +289,11 @@ |
291 | 289 | **************************************************************************/ |
292 | 290 | static void nfs_readlink_req(void) |
293 | 291 | { |
292 | + uint32_t data[1024]; | |
294 | 293 | uint32_t *p; |
295 | 294 | int len; |
296 | - struct rpc_t *rpc_pkt = rpc_req_prep(); | |
297 | 295 | |
298 | - p = rpc_pkt->u.call.data; | |
296 | + p = &(data[0]); | |
299 | 297 | p = rpc_add_credentials(p); |
300 | 298 | |
301 | 299 | if (supported_nfs_versions & NFSV2_FLAG) { |
302 | 300 | |
... | ... | @@ -307,9 +305,9 @@ |
307 | 305 | p += (filefh3_length / 4); |
308 | 306 | } |
309 | 307 | |
310 | - len = (uint32_t *)p - (uint32_t *)&(rpc_pkt->u.call.data); | |
308 | + len = (uint32_t *)p - (uint32_t *)&(data[0]); | |
311 | 309 | |
312 | - rpc_req(PROG_NFS, NFS_READLINK, rpc_pkt, len); | |
310 | + rpc_req(PROG_NFS, NFS_READLINK, data, len); | |
313 | 311 | } |
314 | 312 | |
315 | 313 | /************************************************************************** |
316 | 314 | |
317 | 315 | |
... | ... | @@ -317,14 +315,14 @@ |
317 | 315 | **************************************************************************/ |
318 | 316 | static void nfs_lookup_req(char *fname) |
319 | 317 | { |
318 | + uint32_t data[1024]; | |
320 | 319 | uint32_t *p; |
321 | 320 | int len; |
322 | 321 | int fnamelen; |
323 | - struct rpc_t *rpc_pkt = rpc_req_prep(); | |
324 | 322 | |
325 | 323 | fnamelen = strlen(fname); |
326 | 324 | |
327 | - p = rpc_pkt->u.call.data; | |
325 | + p = &(data[0]); | |
328 | 326 | p = rpc_add_credentials(p); |
329 | 327 | |
330 | 328 | if (supported_nfs_versions & NFSV2_FLAG) { |
331 | 329 | |
... | ... | @@ -336,9 +334,9 @@ |
336 | 334 | memcpy(p, fname, fnamelen); |
337 | 335 | p += (fnamelen + 3) / 4; |
338 | 336 | |
339 | - len = (uint32_t *)p - (uint32_t *)&(rpc_pkt->u.call.data); | |
337 | + len = (uint32_t *)p - (uint32_t *)&(data[0]); | |
340 | 338 | |
341 | - rpc_req(PROG_NFS, NFS_LOOKUP, rpc_pkt, len); | |
339 | + rpc_req(PROG_NFS, NFS_LOOKUP, data, len); | |
342 | 340 | } else { /* NFSV3_FLAG */ |
343 | 341 | *p++ = htonl(NFS_FHSIZE); /* Dir handle length */ |
344 | 342 | memcpy(p, dirfh, NFS_FHSIZE); |
345 | 343 | |
... | ... | @@ -349,9 +347,9 @@ |
349 | 347 | memcpy(p, fname, fnamelen); |
350 | 348 | p += (fnamelen + 3) / 4; |
351 | 349 | |
352 | - len = (uint32_t *)p - (uint32_t *)&(rpc_pkt->u.call.data); | |
350 | + len = (uint32_t *)p - (uint32_t *)&(data[0]); | |
353 | 351 | |
354 | - rpc_req(PROG_NFS, NFS3PROC_LOOKUP, rpc_pkt, len); | |
352 | + rpc_req(PROG_NFS, NFS3PROC_LOOKUP, data, len); | |
355 | 353 | } |
356 | 354 | } |
357 | 355 | |
358 | 356 | |
359 | 357 | |
... | ... | @@ -360,11 +358,11 @@ |
360 | 358 | **************************************************************************/ |
361 | 359 | static void nfs_read_req(int offset, int readlen) |
362 | 360 | { |
361 | + uint32_t data[1024]; | |
363 | 362 | uint32_t *p; |
364 | 363 | int len; |
365 | - struct rpc_t *rpc_pkt = rpc_req_prep(); | |
366 | 364 | |
367 | - p = rpc_pkt->u.call.data; | |
365 | + p = &(data[0]); | |
368 | 366 | p = rpc_add_credentials(p); |
369 | 367 | |
370 | 368 | if (supported_nfs_versions & NFSV2_FLAG) { |
371 | 369 | |
... | ... | @@ -383,9 +381,9 @@ |
383 | 381 | *p++ = 0; |
384 | 382 | } |
385 | 383 | |
386 | - len = (uint32_t *)p - (uint32_t *)&(rpc_pkt->u.call.data); | |
384 | + len = (uint32_t *)p - (uint32_t *)&(data[0]); | |
387 | 385 | |
388 | - rpc_req(PROG_NFS, NFS_READ, rpc_pkt, len); | |
386 | + rpc_req(PROG_NFS, NFS_READ, data, len); | |
389 | 387 | } |
390 | 388 | |
391 | 389 | /************************************************************************** |