linux_misc.c (241025) | linux_misc.c (241896) |
---|---|
1/*- 2 * Copyright (c) 2002 Doug Rabson 3 * Copyright (c) 1994-1995 S��ren Schmidt 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: --- 14 unchanged lines hidden (view full) --- 23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 */ 29 30#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 2002 Doug Rabson 3 * Copyright (c) 1994-1995 S��ren Schmidt 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: --- 14 unchanged lines hidden (view full) --- 23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 */ 29 30#include <sys/cdefs.h> |
31__FBSDID("$FreeBSD: head/sys/compat/linux/linux_misc.c 241025 2012-09-28 11:25:02Z kib $"); | 31__FBSDID("$FreeBSD: head/sys/compat/linux/linux_misc.c 241896 2012-10-22 17:50:54Z kib $"); |
32 33#include "opt_compat.h" 34#include "opt_kdtrace.h" 35 36#include <sys/param.h> 37#include <sys/blist.h> 38#include <sys/fcntl.h> 39#if defined(__i386__) --- 202 unchanged lines hidden (view full) --- 242 struct exec *a_out; 243 struct vattr attr; 244 vm_offset_t vmaddr; 245 unsigned long file_offset; 246 unsigned long bss_size; 247 char *library; 248 ssize_t aresid; 249 int error; | 32 33#include "opt_compat.h" 34#include "opt_kdtrace.h" 35 36#include <sys/param.h> 37#include <sys/blist.h> 38#include <sys/fcntl.h> 39#if defined(__i386__) --- 202 unchanged lines hidden (view full) --- 242 struct exec *a_out; 243 struct vattr attr; 244 vm_offset_t vmaddr; 245 unsigned long file_offset; 246 unsigned long bss_size; 247 char *library; 248 ssize_t aresid; 249 int error; |
250 int locked, vfslocked; | 250 int locked; |
251 252 LCONVPATHEXIST(td, args->library, &library); 253 254#ifdef DEBUG 255 if (ldebug(uselib)) 256 printf(ARGS(uselib, "%s"), library); 257#endif 258 259 a_out = NULL; | 251 252 LCONVPATHEXIST(td, args->library, &library); 253 254#ifdef DEBUG 255 if (ldebug(uselib)) 256 printf(ARGS(uselib, "%s"), library); 257#endif 258 259 a_out = NULL; |
260 vfslocked = 0; | |
261 locked = 0; 262 vp = NULL; 263 | 260 locked = 0; 261 vp = NULL; 262 |
264 NDINIT(&ni, LOOKUP, ISOPEN | FOLLOW | LOCKLEAF | MPSAFE | AUDITVNODE1, | 263 NDINIT(&ni, LOOKUP, ISOPEN | FOLLOW | LOCKLEAF | AUDITVNODE1, |
265 UIO_SYSSPACE, library, td); 266 error = namei(&ni); 267 LFREEPATH(library); 268 if (error) 269 goto cleanup; 270 271 vp = ni.ni_vp; | 264 UIO_SYSSPACE, library, td); 265 error = namei(&ni); 266 LFREEPATH(library); 267 if (error) 268 goto cleanup; 269 270 vp = ni.ni_vp; |
272 vfslocked = NDHASGIANT(&ni); | |
273 NDFREE(&ni, NDF_ONLY_PNBUF); 274 275 /* 276 * From here on down, we have a locked vnode that must be unlocked. 277 * XXX: The code below largely duplicates exec_check_permissions(). 278 */ 279 locked = 1; 280 --- 107 unchanged lines hidden (view full) --- 388 */ 389 VOP_SET_TEXT(vp); 390 391 /* 392 * Lock no longer needed 393 */ 394 locked = 0; 395 VOP_UNLOCK(vp, 0); | 271 NDFREE(&ni, NDF_ONLY_PNBUF); 272 273 /* 274 * From here on down, we have a locked vnode that must be unlocked. 275 * XXX: The code below largely duplicates exec_check_permissions(). 276 */ 277 locked = 1; 278 --- 107 unchanged lines hidden (view full) --- 386 */ 387 VOP_SET_TEXT(vp); 388 389 /* 390 * Lock no longer needed 391 */ 392 locked = 0; 393 VOP_UNLOCK(vp, 0); |
396 VFS_UNLOCK_GIANT(vfslocked); | |
397 398 /* 399 * Check if file_offset page aligned. Currently we cannot handle 400 * misalinged file offsets, and so we read in the entire image 401 * (what a waste). 402 */ 403 if (file_offset & PAGE_MASK) { 404#ifdef DEBUG --- 53 unchanged lines hidden (view full) --- 458 error = vm_map_find(&td->td_proc->p_vmspace->vm_map, NULL, 0, 459 &vmaddr, bss_size, FALSE, VM_PROT_ALL, VM_PROT_ALL, 0); 460 if (error) 461 goto cleanup; 462 } 463 464cleanup: 465 /* Unlock vnode if needed */ | 394 395 /* 396 * Check if file_offset page aligned. Currently we cannot handle 397 * misalinged file offsets, and so we read in the entire image 398 * (what a waste). 399 */ 400 if (file_offset & PAGE_MASK) { 401#ifdef DEBUG --- 53 unchanged lines hidden (view full) --- 455 error = vm_map_find(&td->td_proc->p_vmspace->vm_map, NULL, 0, 456 &vmaddr, bss_size, FALSE, VM_PROT_ALL, VM_PROT_ALL, 0); 457 if (error) 458 goto cleanup; 459 } 460 461cleanup: 462 /* Unlock vnode if needed */ |
466 if (locked) { | 463 if (locked) |
467 VOP_UNLOCK(vp, 0); | 464 VOP_UNLOCK(vp, 0); |
468 VFS_UNLOCK_GIANT(vfslocked); 469 } | |
470 471 /* Release the temporary mapping. */ 472 if (a_out) 473 kmem_free_wakeup(exec_map, (vm_offset_t)a_out, PAGE_SIZE); 474 475 return (error); 476} 477 --- 1453 unchanged lines hidden --- | 465 466 /* Release the temporary mapping. */ 467 if (a_out) 468 kmem_free_wakeup(exec_map, (vm_offset_t)a_out, PAGE_SIZE); 469 470 return (error); 471} 472 --- 1453 unchanged lines hidden --- |