Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
59ee66b5
Commit
59ee66b5
authored
Oct 10, 2003
by
Len Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge intel.com:/home/lenb/bk/linux-2.6.0
into intel.com:/home/lenb/bk/linux-acpi-test-2.6.0
parents
a4d5fc0a
06349d9d
Changes
29
Hide whitespace changes
Inline
Side-by-side
Showing
29 changed files
with
298 additions
and
155 deletions
+298
-155
arch/i386/mm/fault.c
arch/i386/mm/fault.c
+178
-12
arch/ia64/kernel/unaligned.c
arch/ia64/kernel/unaligned.c
+1
-1
arch/sparc64/solaris/misc.c
arch/sparc64/solaris/misc.c
+1
-1
drivers/char/n_tty.c
drivers/char/n_tty.c
+1
-2
drivers/char/rocket.c
drivers/char/rocket.c
+1
-1
drivers/char/tty_io.c
drivers/char/tty_io.c
+45
-43
drivers/char/vt.c
drivers/char/vt.c
+1
-1
drivers/char/vt_ioctl.c
drivers/char/vt_ioctl.c
+2
-1
drivers/media/video/zoran_card.c
drivers/media/video/zoran_card.c
+2
-0
drivers/media/video/zoran_device.c
drivers/media/video/zoran_device.c
+2
-0
drivers/media/video/zoran_driver.c
drivers/media/video/zoran_driver.c
+1
-0
drivers/net/slip.c
drivers/net/slip.c
+1
-1
fs/binfmt_elf.c
fs/binfmt_elf.c
+2
-2
fs/compat_ioctl.c
fs/compat_ioctl.c
+1
-1
fs/dquot.c
fs/dquot.c
+5
-5
fs/exec.c
fs/exec.c
+0
-5
fs/open.c
fs/open.c
+1
-1
fs/proc/array.c
fs/proc/array.c
+4
-4
include/asm-i386/processor.h
include/asm-i386/processor.h
+3
-3
include/linux/sched.h
include/linux/sched.h
+7
-25
kernel/acct.c
kernel/acct.c
+1
-1
kernel/exit.c
kernel/exit.c
+11
-11
kernel/fork.c
kernel/fork.c
+4
-10
kernel/pid.c
kernel/pid.c
+4
-4
kernel/signal.c
kernel/signal.c
+2
-3
kernel/sys.c
kernel/sys.c
+9
-9
net/ipv4/netfilter/ipt_owner.c
net/ipv4/netfilter/ipt_owner.c
+1
-1
net/ipv6/netfilter/ip6t_owner.c
net/ipv6/netfilter/ip6t_owner.c
+1
-1
net/sunrpc/clnt.c
net/sunrpc/clnt.c
+6
-6
No files found.
arch/i386/mm/fault.c
View file @
59ee66b5
...
...
@@ -19,6 +19,7 @@
#include <linux/init.h>
#include <linux/tty.h>
#include <linux/vt_kern.h>
/* For unblank_screen() */
#include <linux/highmem.h>
#include <linux/module.h>
#include <asm/system.h>
...
...
@@ -55,6 +56,147 @@ void bust_spinlocks(int yes)
console_loglevel
=
loglevel_save
;
}
/*
* Return EIP plus the CS segment base. The segment limit is also
* adjusted, clamped to the kernel/user address space (whichever is
* appropriate), and returned in *eip_limit.
*
* The segment is checked, because it might have been changed by another
* task between the original faulting instruction and here.
*
* If CS is no longer a valid code segment, or if EIP is beyond the
* limit, or if it is a kernel address when CS is not a kernel segment,
* then the returned value will be greater than *eip_limit.
*
* This is slow, but is very rarely executed.
*/
static
inline
unsigned
long
get_segment_eip
(
struct
pt_regs
*
regs
,
unsigned
long
*
eip_limit
)
{
unsigned
long
eip
=
regs
->
eip
;
unsigned
seg
=
regs
->
xcs
&
0xffff
;
u32
seg_ar
,
seg_limit
,
base
,
*
desc
;
/* The standard kernel/user address space limit. */
*
eip_limit
=
(
seg
&
3
)
?
USER_DS
.
seg
:
KERNEL_DS
.
seg
;
/* Unlikely, but must come before segment checks. */
if
(
unlikely
((
regs
->
eflags
&
VM_MASK
)
!=
0
))
return
eip
+
(
seg
<<
4
);
/* By far the most common cases. */
if
(
likely
(
seg
==
__USER_CS
||
seg
==
__KERNEL_CS
))
return
eip
;
/* Check the segment exists, is within the current LDT/GDT size,
that kernel/user (ring 0..3) has the appropriate privilege,
that it's a code segment, and get the limit. */
__asm__
(
"larl %3,%0; lsll %3,%1"
:
"=&r"
(
seg_ar
),
"=r"
(
seg_limit
)
:
"0"
(
0
),
"rm"
(
seg
));
if
((
~
seg_ar
&
0x9800
)
||
eip
>
seg_limit
)
{
*
eip_limit
=
0
;
return
1
;
/* So that returned eip > *eip_limit. */
}
/* Get the GDT/LDT descriptor base.
When you look for races in this code remember that
LDT and other horrors are only used in user space. */
if
(
seg
&
(
1
<<
2
))
{
/* Must lock the LDT while reading it. */
down
(
&
current
->
mm
->
context
.
sem
);
desc
=
current
->
mm
->
context
.
ldt
;
desc
=
(
void
*
)
desc
+
(
seg
&
~
7
);
}
else
{
/* Must disable preemption while reading the GDT. */
desc
=
(
u32
*
)
&
cpu_gdt_table
[
get_cpu
()];
desc
=
(
void
*
)
desc
+
(
seg
&
~
7
);
}
/* Decode the code segment base from the descriptor */
base
=
(
desc
[
0
]
>>
16
)
|
((
desc
[
1
]
&
0xff
)
<<
16
)
|
(
desc
[
1
]
&
0xff000000
);
if
(
seg
&
(
1
<<
2
))
{
up
(
&
current
->
mm
->
context
.
sem
);
}
else
put_cpu
();
/* Adjust EIP and segment limit, and clamp at the kernel limit.
It's legitimate for segments to wrap at 0xffffffff. */
seg_limit
+=
base
;
if
(
seg_limit
<
*
eip_limit
&&
seg_limit
>=
base
)
*
eip_limit
=
seg_limit
;
return
eip
+
base
;
}
/*
* Sometimes AMD Athlon/Opteron CPUs report invalid exceptions on prefetch.
* Check that here and ignore it.
*/
static
int
__is_prefetch
(
struct
pt_regs
*
regs
,
unsigned
long
addr
)
{
unsigned
long
limit
;
unsigned
long
instr
=
get_segment_eip
(
regs
,
&
limit
);
int
scan_more
=
1
;
int
prefetch
=
0
;
int
i
;
for
(
i
=
0
;
scan_more
&&
i
<
15
;
i
++
)
{
unsigned
char
opcode
;
unsigned
char
instr_hi
;
unsigned
char
instr_lo
;
if
(
instr
>
limit
)
break
;
if
(
__get_user
(
opcode
,
(
unsigned
char
*
)
instr
))
break
;
instr_hi
=
opcode
&
0xf0
;
instr_lo
=
opcode
&
0x0f
;
instr
++
;
switch
(
instr_hi
)
{
case
0x20
:
case
0x30
:
/* Values 0x26,0x2E,0x36,0x3E are valid x86 prefixes. */
scan_more
=
((
instr_lo
&
7
)
==
0x6
);
break
;
case
0x60
:
/* 0x64 thru 0x67 are valid prefixes in all modes. */
scan_more
=
(
instr_lo
&
0xC
)
==
0x4
;
break
;
case
0xF0
:
/* 0xF0, 0xF2, and 0xF3 are valid prefixes */
scan_more
=
!
instr_lo
||
(
instr_lo
>>
1
)
==
1
;
break
;
case
0x00
:
/* Prefetch instruction is 0x0F0D or 0x0F18 */
scan_more
=
0
;
if
(
instr
>
limit
)
break
;
if
(
__get_user
(
opcode
,
(
unsigned
char
*
)
instr
))
break
;
prefetch
=
(
instr_lo
==
0xF
)
&&
(
opcode
==
0x0D
||
opcode
==
0x18
);
break
;
default:
scan_more
=
0
;
break
;
}
}
return
prefetch
;
}
static
inline
int
is_prefetch
(
struct
pt_regs
*
regs
,
unsigned
long
addr
)
{
if
(
unlikely
(
boot_cpu_data
.
x86_vendor
==
X86_VENDOR_AMD
&&
boot_cpu_data
.
x86
>=
6
))
return
__is_prefetch
(
regs
,
addr
);
return
0
;
}
asmlinkage
void
do_invalid_op
(
struct
pt_regs
*
,
unsigned
long
);
/*
...
...
@@ -86,6 +228,8 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code)
tsk
=
current
;
info
.
si_code
=
SEGV_MAPERR
;
/*
* We fault-in kernel-space virtual memory on-demand. The
* 'reference' page table is init_mm.pgd.
...
...
@@ -99,18 +243,24 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code)
* (error_code & 4) == 0, and that the fault was not a
* protection error (error_code & 1) == 0.
*/
if
(
address
>=
TASK_SIZE
&&
!
(
error_code
&
5
))
goto
vmalloc_fault
;
if
(
unlikely
(
address
>=
TASK_SIZE
))
{
if
(
!
(
error_code
&
5
))
goto
vmalloc_fault
;
/*
* Don't take the mm semaphore here. If we fixup a prefetch
* fault we could otherwise deadlock.
*/
goto
bad_area_nosemaphore
;
}
mm
=
tsk
->
mm
;
info
.
si_code
=
SEGV_MAPERR
;
/*
* If we're in an interrupt, have no user context or are running in an
* atomic region then we must not take the fault..
*/
if
(
in_atomic
()
||
!
mm
)
goto
no_context
;
goto
bad_area_nosemaphore
;
down_read
(
&
mm
->
mmap_sem
);
...
...
@@ -198,8 +348,16 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code)
bad_area:
up_read
(
&
mm
->
mmap_sem
);
bad_area_nosemaphore:
/* User mode accesses just cause a SIGSEGV */
if
(
error_code
&
4
)
{
/*
* Valid to do another page fault here because this one came
* from user space.
*/
if
(
is_prefetch
(
regs
,
address
))
return
;
tsk
->
thread
.
cr2
=
address
;
tsk
->
thread
.
error_code
=
error_code
;
tsk
->
thread
.
trap_no
=
14
;
...
...
@@ -232,6 +390,14 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code)
if
(
fixup_exception
(
regs
))
return
;
/*
* Valid to do another page fault here, because if this fault
* had been triggered by is_prefetch fixup_exception would have
* handled it.
*/
if
(
is_prefetch
(
regs
,
address
))
return
;
/*
* Oops. The kernel tried to access some bad page. We'll have to
* terminate things with extreme prejudice.
...
...
@@ -286,10 +452,14 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code)
do_sigbus:
up_read
(
&
mm
->
mmap_sem
);
/*
* Send a sigbus, regardless of whether we were in kernel
* or user mode.
*/
/* Kernel mode? Handle exceptions or die */
if
(
!
(
error_code
&
4
))
goto
no_context
;
/* User space => ok to do another page fault */
if
(
is_prefetch
(
regs
,
address
))
return
;
tsk
->
thread
.
cr2
=
address
;
tsk
->
thread
.
error_code
=
error_code
;
tsk
->
thread
.
trap_no
=
14
;
...
...
@@ -298,10 +468,6 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code)
info
.
si_code
=
BUS_ADRERR
;
info
.
si_addr
=
(
void
*
)
address
;
force_sig_info
(
SIGBUS
,
&
info
,
tsk
);
/* Kernel mode? Handle exceptions or die */
if
(
!
(
error_code
&
4
))
goto
no_context
;
return
;
vmalloc_fault:
...
...
arch/ia64/kernel/unaligned.c
View file @
59ee66b5
...
...
@@ -1347,7 +1347,7 @@ ia64_handle_unaligned (unsigned long ifa, struct pt_regs *regs)
* be holding locks...
*/
if
(
user_mode
(
regs
))
tty_write_message
(
process_tty
(
current
)
,
buf
);
tty_write_message
(
current
->
tty
,
buf
);
buf
[
len
-
1
]
=
'\0'
;
/* drop '\r' */
printk
(
KERN_WARNING
"%s"
,
buf
);
/* watch for command names containing %s */
}
...
...
arch/sparc64/solaris/misc.c
View file @
59ee66b5
...
...
@@ -402,7 +402,7 @@ asmlinkage int solaris_procids(int cmd, s32 pid, s32 pgid)
Solaris setpgrp and setsid? */
ret
=
sys_setpgid
(
0
,
0
);
if
(
ret
)
return
ret
;
current
->
signal
->
tty
=
NULL
;
current
->
tty
=
NULL
;
return
process_group
(
current
);
}
case
2
:
/* getsid */
...
...
drivers/char/n_tty.c
View file @
59ee66b5
...
...
@@ -974,8 +974,7 @@ static ssize_t read_chan(struct tty_struct *tty, struct file *file,
/* NOTE: not yet done after every sleep pending a thorough
check of the logic of this change. -- jlc */
/* don't stop on /dev/console */
if
(
file
->
f_op
->
write
!=
redirected_tty_write
&&
process_tty
(
current
)
==
tty
)
{
if
(
file
->
f_op
->
write
!=
redirected_tty_write
&&
current
->
tty
==
tty
)
{
if
(
tty
->
pgrp
<=
0
)
printk
(
"read_chan: tty->pgrp <= 0!
\n
"
);
else
if
(
process_group
(
current
)
!=
tty
->
pgrp
)
{
...
...
drivers/char/rocket.c
View file @
59ee66b5
...
...
@@ -953,7 +953,7 @@ static int rp_open(struct tty_struct *tty, struct file *filp)
/*
* Info->count is now 1; so it's safe to sleep now.
*/
info
->
session
=
process_session
(
current
)
;
info
->
session
=
current
->
session
;
info
->
pgrp
=
process_group
(
current
);
if
((
info
->
flags
&
ROCKET_INITIALIZED
)
==
0
)
{
...
...
drivers/char/tty_io.c
View file @
59ee66b5
...
...
@@ -316,7 +316,7 @@ struct tty_driver *get_tty_driver(dev_t device, int *index)
*/
int
tty_check_change
(
struct
tty_struct
*
tty
)
{
if
(
process_tty
(
current
)
!=
tty
)
if
(
current
->
tty
!=
tty
)
return
0
;
if
(
tty
->
pgrp
<=
0
)
{
printk
(
KERN_WARNING
"tty_check_change: tty->pgrp <= 0!
\n
"
);
...
...
@@ -483,14 +483,14 @@ void do_tty_hangup(void *data)
if
(
tty
->
session
>
0
)
{
struct
list_head
*
l
;
for_each_task_pid
(
tty
->
session
,
PIDTYPE_SID
,
p
,
l
,
pid
)
{
if
(
p
rocess_tty
(
p
)
==
tty
)
p
->
signal
->
tty
=
NULL
;
if
(
!
p
rocess_session_leader
(
p
)
)
if
(
p
->
tty
==
tty
)
p
->
tty
=
NULL
;
if
(
!
p
->
leader
)
continue
;
send_group_sig_info
(
SIGHUP
,
SEND_SIG_PRIV
,
p
);
send_group_sig_info
(
SIGCONT
,
SEND_SIG_PRIV
,
p
);
if
(
tty
->
pgrp
>
0
)
p
->
signal
->
tty_old_pgrp
=
tty
->
pgrp
;
p
->
tty_old_pgrp
=
tty
->
pgrp
;
}
}
read_unlock
(
&
tasklist_lock
);
...
...
@@ -567,15 +567,15 @@ void disassociate_ctty(int on_exit)
lock_kernel
();
tty
=
process_tty
(
current
)
;
tty
=
current
->
tty
;
if
(
tty
)
{
tty_pgrp
=
tty
->
pgrp
;
if
(
on_exit
&&
tty
->
driver
->
type
!=
TTY_DRIVER_TYPE_PTY
)
tty_vhangup
(
tty
);
}
else
{
if
(
current
->
signal
->
tty_old_pgrp
)
{
kill_pg
(
current
->
signal
->
tty_old_pgrp
,
SIGHUP
,
on_exit
);
kill_pg
(
current
->
signal
->
tty_old_pgrp
,
SIGCONT
,
on_exit
);
if
(
current
->
tty_old_pgrp
)
{
kill_pg
(
current
->
tty_old_pgrp
,
SIGHUP
,
on_exit
);
kill_pg
(
current
->
tty_old_pgrp
,
SIGCONT
,
on_exit
);
}
unlock_kernel
();
return
;
...
...
@@ -586,13 +586,13 @@ void disassociate_ctty(int on_exit)
kill_pg
(
tty_pgrp
,
SIGCONT
,
on_exit
);
}
current
->
signal
->
tty_old_pgrp
=
0
;
current
->
tty_old_pgrp
=
0
;
tty
->
session
=
0
;
tty
->
pgrp
=
-
1
;
read_lock
(
&
tasklist_lock
);
for_each_task_pid
(
process_session
(
current
)
,
PIDTYPE_SID
,
p
,
l
,
pid
)
p
->
signal
->
tty
=
NULL
;
for_each_task_pid
(
current
->
session
,
PIDTYPE_SID
,
p
,
l
,
pid
)
p
->
tty
=
NULL
;
read_unlock
(
&
tasklist_lock
);
unlock_kernel
();
}
...
...
@@ -1220,10 +1220,10 @@ static void release_dev(struct file * filp)
read_lock
(
&
tasklist_lock
);
for_each_task_pid
(
tty
->
session
,
PIDTYPE_SID
,
p
,
l
,
pid
)
p
->
signal
->
tty
=
NULL
;
p
->
tty
=
NULL
;
if
(
o_tty
)
for_each_task_pid
(
o_tty
->
session
,
PIDTYPE_SID
,
p
,
l
,
pid
)
p
->
signal
->
tty
=
NULL
;
p
->
tty
=
NULL
;
read_unlock
(
&
tasklist_lock
);
}
...
...
@@ -1294,10 +1294,10 @@ static int tty_open(struct inode * inode, struct file * filp)
retry_open:
noctty
=
filp
->
f_flags
&
O_NOCTTY
;
if
(
device
==
MKDEV
(
TTYAUX_MAJOR
,
0
))
{
if
(
!
process_tty
(
current
)
)
if
(
!
current
->
tty
)
return
-
ENXIO
;
driver
=
process_tty
(
current
)
->
driver
;
index
=
process_tty
(
current
)
->
index
;
driver
=
current
->
tty
->
driver
;
index
=
current
->
tty
->
index
;
filp
->
f_flags
|=
O_NONBLOCK
;
/* Don't let /dev/tty block */
/* noctty = 1; */
goto
got_driver
;
...
...
@@ -1391,13 +1391,15 @@ static int tty_open(struct inode * inode, struct file * filp)
filp
->
f_op
=
&
tty_fops
;
goto
retry_open
;
}
if
(
!
noctty
&&
process_session_leader
(
current
)
&&
!
process_tty
(
current
)
&&
tty
->
session
==
0
)
{
if
(
!
noctty
&&
current
->
leader
&&
!
current
->
tty
&&
tty
->
session
==
0
)
{
task_lock
(
current
);
current
->
signal
->
tty
=
tty
;
current
->
tty
=
tty
;
task_unlock
(
current
);
current
->
signal
->
tty_old_pgrp
=
0
;
tty
->
session
=
process_session
(
current
)
;
current
->
tty_old_pgrp
=
0
;
tty
->
session
=
current
->
session
;
tty
->
pgrp
=
process_group
(
current
);
}
return
0
;
...
...
@@ -1455,7 +1457,7 @@ static int tiocsti(struct tty_struct *tty, char * arg)
{
char
ch
,
mbz
=
0
;
if
((
process_tty
(
current
)
!=
tty
)
&&
!
capable
(
CAP_SYS_ADMIN
))
if
((
current
->
tty
!=
tty
)
&&
!
capable
(
CAP_SYS_ADMIN
))
return
-
EPERM
;
if
(
get_user
(
ch
,
arg
))
return
-
EFAULT
;
...
...
@@ -1541,14 +1543,14 @@ static int tiocsctty(struct tty_struct *tty, int arg)
struct
pid
*
pid
;
task_t
*
p
;
if
(
process_session_leader
(
current
)
&&
(
process_session
(
current
)
==
tty
->
session
))
if
(
current
->
leader
&&
(
current
->
session
==
tty
->
session
))
return
0
;
/*
* The process must be a session leader and
* not have a controlling tty already.
*/
if
(
!
process_session_leader
(
current
)
||
process_tty
(
current
)
)
if
(
!
current
->
leader
||
current
->
tty
)
return
-
EPERM
;
if
(
tty
->
session
>
0
)
{
/*
...
...
@@ -1562,16 +1564,16 @@ static int tiocsctty(struct tty_struct *tty, int arg)
read_lock
(
&
tasklist_lock
);
for_each_task_pid
(
tty
->
session
,
PIDTYPE_SID
,
p
,
l
,
pid
)
p
->
signal
->
tty
=
NULL
;
p
->
tty
=
NULL
;
read_unlock
(
&
tasklist_lock
);
}
else
return
-
EPERM
;
}
task_lock
(
current
);
current
->
signal
->
tty
=
tty
;
current
->
tty
=
tty
;
task_unlock
(
current
);
current
->
signal
->
tty_old_pgrp
=
0
;
tty
->
session
=
process_session
(
current
)
;
current
->
tty_old_pgrp
=
0
;
tty
->
session
=
current
->
session
;
tty
->
pgrp
=
process_group
(
current
);
return
0
;
}
...
...
@@ -1582,13 +1584,12 @@ static int tiocgpgrp(struct tty_struct *tty, struct tty_struct *real_tty, pid_t
* (tty == real_tty) is a cheap way of
* testing if the tty is NOT a master pty.
*/
if
(
tty
==
real_tty
&&
process_tty
(
current
)
!=
real_tty
)
if
(
tty
==
real_tty
&&
current
->
tty
!=
real_tty
)
return
-
ENOTTY
;
return
put_user
(
real_tty
->
pgrp
,
arg
);
}
static
int
tiocspgrp
(
struct
tty_struct
*
tty
,
struct
tty_struct
*
real_tty
,
pid_t
*
arg
)
static
int
tiocspgrp
(
struct
tty_struct
*
tty
,
struct
tty_struct
*
real_tty
,
pid_t
*
arg
)
{
pid_t
pgrp
;
int
retval
=
tty_check_change
(
real_tty
);
...
...
@@ -1597,14 +1598,15 @@ static int tiocspgrp(struct tty_struct *tty,
return
-
ENOTTY
;
if
(
retval
)
return
retval
;
if
(
!
process_tty
(
current
)
||
(
process_tty
(
current
)
!=
real_tty
)
||
(
real_tty
->
session
!=
process_session
(
current
)))
if
(
!
current
->
tty
||
(
current
->
tty
!=
real_tty
)
||
(
real_tty
->
session
!=
current
->
session
))
return
-
ENOTTY
;
if
(
get_user
(
pgrp
,
(
pid_t
*
)
arg
))
return
-
EFAULT
;
if
(
pgrp
<
0
)
return
-
EINVAL
;
if
(
session_of_pgrp
(
pgrp
)
!=
process_session
(
current
)
)
if
(
session_of_pgrp
(
pgrp
)
!=
current
->
session
)
return
-
EPERM
;
real_tty
->
pgrp
=
pgrp
;
return
0
;
...
...
@@ -1616,7 +1618,7 @@ static int tiocgsid(struct tty_struct *tty, struct tty_struct *real_tty, pid_t *
* (tty == real_tty) is a cheap way of
* testing if the tty is NOT a master pty.
*/
if
(
tty
==
real_tty
&&
process_tty
(
current
)
!=
real_tty
)
if
(
tty
==
real_tty
&&
current
->
tty
!=
real_tty
)
return
-
ENOTTY
;
if
(
real_tty
->
session
<=
0
)
return
-
ENOTTY
;
...
...
@@ -1774,12 +1776,12 @@ int tty_ioctl(struct inode * inode, struct file * file,
clear_bit
(
TTY_EXCLUSIVE
,
&
tty
->
flags
);
return
0
;
case
TIOCNOTTY
:
if
(
process_tty
(
current
)
!=
tty
)
if
(
current
->
tty
!=
tty
)
return
-
ENOTTY
;
if
(
process_session_leader
(
current
)
)
if
(
current
->
leader
)
disassociate_ctty
(
0
);
task_lock
(
current
);
current
->
signal
->
tty
=
NULL
;
current
->
tty
=
NULL
;
task_unlock
(
current
);
return
0
;
case
TIOCSCTTY
:
...
...
@@ -1883,10 +1885,10 @@ static void __do_SAK(void *arg)
tty
->
driver
->
flush_buffer
(
tty
);
read_lock
(
&
tasklist_lock
);
for_each_task_pid
(
session
,
PIDTYPE_SID
,
p
,
l
,
pid
)
{
if
(
p
rocess_tty
(
p
)
==
tty
||
session
>
0
)
{
if
(
p
->
tty
==
tty
||
session
>
0
)
{
printk
(
KERN_NOTICE
"SAK: killed process %d"
" (%s): process_session(p)
==tty->session
\n
"
,
p
->
pid
,
p
->
comm
);
" (%s): p->session
==tty->session
\n
"
,
p
->
pid
,
p
->
comm
);
send_sig
(
SIGKILL
,
p
,
1
);
continue
;
}
...
...
drivers/char/vt.c
View file @
59ee66b5
...
...
@@ -2226,7 +2226,7 @@ int tioclinux(struct tty_struct *tty, unsigned long arg)
if
(
tty
->
driver
->
type
!=
TTY_DRIVER_TYPE_CONSOLE
)
return
-
EINVAL
;
if
(
process_tty
(
current
)
!=
tty
&&
!
capable
(
CAP_SYS_ADMIN
))
if
(
current
->
tty
!=
tty
&&
!
capable
(
CAP_SYS_ADMIN
))
return
-
EPERM
;
if
(
get_user
(
type
,
(
char
*
)
arg
))
return
-
EFAULT
;
...
...
drivers/char/vt_ioctl.c
View file @
59ee66b5
...
...
@@ -380,7 +380,7 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
* to be the owner of the tty, or have CAP_SYS_TTY_CONFIG.
*/
perm
=
0
;
if
(
process_tty
(
current
)
==
tty
||
capable
(
CAP_SYS_TTY_CONFIG
))
if
(
current
->
tty
==
tty
||
capable
(
CAP_SYS_TTY_CONFIG
))
perm
=
1
;
kbd
=
kbd_table
+
console
;
...
...
@@ -1188,3 +1188,4 @@ void change_console(unsigned int new_console)
complete_change_console
(
new_console
);
}
drivers/media/video/zoran_card.c
View file @
59ee66b5
...
...
@@ -47,6 +47,8 @@
#include <linux/video_decoder.h>
#include <linux/video_encoder.h>
#include <asm/io.h>
#include "videocodec.h"
#include "zoran.h"
#include "zoran_card.h"
...
...
drivers/media/video/zoran_device.c
View file @
59ee66b5
...
...
@@ -46,6 +46,8 @@
#include <linux/video_encoder.h>
#include <linux/delay.h>
#include <asm/io.h>
#include "videocodec.h"
#include "zoran.h"
#include "zoran_device.h"
...
...
drivers/media/video/zoran_driver.c
View file @
59ee66b5
...
...
@@ -73,6 +73,7 @@
#include <linux/videodev.h>
#include "videocodec.h"
#include <asm/io.h>
#include <asm/uaccess.h>
#include <linux/proc_fs.h>
...
...
drivers/net/slip.c
View file @
59ee66b5
...
...
@@ -1307,7 +1307,7 @@ static int sl_ioctl(struct net_device *dev,struct ifreq *rq,int cmd)
/* Resolve race condition, when ioctl'ing hanged up
and opened by another process device.
*/
if
(
sl
->
tty
!=
process_tty
(
current
)
&&
sl
->
pid
!=
current
->
pid
)
{
if
(
sl
->
tty
!=
current
->
tty
&&
sl
->
pid
!=
current
->
pid
)
{
spin_unlock_bh
(
&
sl
->
lock
);
return
-
EPERM
;
}
...
...
fs/binfmt_elf.c
View file @
59ee66b5
...
...
@@ -1084,7 +1084,7 @@ static void fill_prstatus(struct elf_prstatus *prstatus,
prstatus
->
pr_pid
=
p
->
pid
;
prstatus
->
pr_ppid
=
p
->
parent
->
pid
;
prstatus
->
pr_pgrp
=
process_group
(
p
);
prstatus
->
pr_sid
=
p
rocess_session
(
p
)
;
prstatus
->
pr_sid
=
p
->
session
;
jiffies_to_timeval
(
p
->
utime
,
&
prstatus
->
pr_utime
);
jiffies_to_timeval
(
p
->
stime
,
&
prstatus
->
pr_stime
);
jiffies_to_timeval
(
p
->
cutime
,
&
prstatus
->
pr_cutime
);
...
...
@@ -1112,7 +1112,7 @@ static void fill_psinfo(struct elf_prpsinfo *psinfo, struct task_struct *p,
psinfo
->
pr_pid
=
p
->
pid
;
psinfo
->
pr_ppid
=
p
->
parent
->
pid
;
psinfo
->
pr_pgrp
=
process_group
(
p
);
psinfo
->
pr_sid
=
p
rocess_session
(
p
)
;
psinfo
->
pr_sid
=
p
->
session
;
i
=
p
->
state
?
ffz
(
~
p
->
state
)
+
1
:
0
;
psinfo
->
pr_state
=
i
;
...
...
fs/compat_ioctl.c
View file @
59ee66b5
...
...
@@ -1574,7 +1574,7 @@ static int vt_check(struct file *file)
* To have permissions to do most of the vt ioctls, we either have
* to be the owner of the tty, or super-user.
*/
if
(
process_tty
(
current
)
==
tty
||
capable
(
CAP_SYS_ADMIN
))
if
(
current
->
tty
==
tty
||
capable
(
CAP_SYS_ADMIN
))
return
1
;
return
0
;
}
...
...
fs/dquot.c
View file @
59ee66b5
...
...
@@ -668,12 +668,12 @@ static void print_warning(struct dquot *dquot, const char warntype)
if
(
!
need_print_warning
(
dquot
)
||
(
flag
&&
test_and_set_bit
(
flag
,
&
dquot
->
dq_flags
)))
return
;
tty_write_message
(
process_tty
(
current
)
,
dquot
->
dq_sb
->
s_id
);
tty_write_message
(
current
->
tty
,
dquot
->
dq_sb
->
s_id
);
if
(
warntype
==
ISOFTWARN
||
warntype
==
BSOFTWARN
)
tty_write_message
(
process_tty
(
current
)
,
": warning, "
);
tty_write_message
(
current
->
tty
,
": warning, "
);
else
tty_write_message
(
process_tty
(
current
)
,
": write failed, "
);
tty_write_message
(
process_tty
(
current
)
,
quotatypes
[
dquot
->
dq_type
]);
tty_write_message
(
current
->
tty
,
": write failed, "
);
tty_write_message
(
current
->
tty
,
quotatypes
[
dquot
->
dq_type
]);
switch
(
warntype
)
{
case
IHARDWARN
:
msg
=
" file limit reached.
\n
"
;
...
...
@@ -694,7 +694,7 @@ static void print_warning(struct dquot *dquot, const char warntype)
msg
=
" block quota exceeded.
\n
"
;
break
;
}
tty_write_message
(
process_tty
(
current
)
,
msg
);
tty_write_message
(
current
->
tty
,
msg
);
}
static
inline
void
flush_warnings
(
struct
dquot
**
dquots
,
char
*
warntype
)
...
...
fs/exec.c
View file @
59ee66b5
...
...
@@ -596,11 +596,6 @@ static inline int de_thread(struct task_struct *tsk)
newsig
->
group_stop_count
=
0
;
newsig
->
curr_target
=
NULL
;
init_sigpending
(
&
newsig
->
shared_pending
);
newsig
->
pgrp
=
oldsig
->
pgrp
;
newsig
->
session
=
oldsig
->
session
;
newsig
->
leader
=
oldsig
->
leader
;
newsig
->
tty_old_pgrp
=
oldsig
->
tty_old_pgrp
;
}
if
(
thread_group_empty
(
current
))
...
...
fs/open.c
View file @
59ee66b5
...
...
@@ -1035,7 +1035,7 @@ EXPORT_SYMBOL(sys_close);
asmlinkage
long
sys_vhangup
(
void
)
{
if
(
capable
(
CAP_SYS_TTY_CONFIG
))
{
tty_vhangup
(
process_tty
(
current
)
);
tty_vhangup
(
current
->
tty
);
return
0
;
}
return
-
EPERM
;
...
...
fs/proc/array.c
View file @
59ee66b5
...
...
@@ -304,9 +304,9 @@ int proc_pid_stat(struct task_struct *task, char * buffer)
mm
=
task
->
mm
;
if
(
mm
)
mm
=
mmgrab
(
mm
);
if
(
process_tty
(
task
)
)
{
tty_pgrp
=
process_tty
(
task
)
->
pgrp
;
tty_nr
=
new_encode_dev
(
tty_devnum
(
process_tty
(
task
)
));
if
(
task
->
tty
)
{
tty_pgrp
=
task
->
tty
->
pgrp
;
tty_nr
=
new_encode_dev
(
tty_devnum
(
task
->
tty
));
}
task_unlock
(
task
);
if
(
mm
)
{
...
...
@@ -345,7 +345,7 @@ int proc_pid_stat(struct task_struct *task, char * buffer)
state
,
ppid
,
process_group
(
task
),
process_session
(
task
)
,
task
->
session
,
tty_nr
,
tty_pgrp
,
task
->
flags
,
...
...
include/asm-i386/processor.h
View file @
59ee66b5
...
...
@@ -585,12 +585,12 @@ static inline void rep_nop(void)
/* Prefetch instructions for Pentium III and AMD Athlon */
/* It's not worth to care about 3dnow! prefetches for the K6
because they are microcoded there and very slow. */
because they are microcoded there and very slow.
However we don't do prefetches for pre XP Athlons currently
That should be fixed. */
#define ARCH_HAS_PREFETCH
extern
inline
void
prefetch
(
const
void
*
x
)
{
if
(
cpu_data
[
0
].
x86_vendor
==
X86_VENDOR_AMD
)
return
;
/* Some athlons fault if the address is bad */
alternative_input
(
ASM_NOP4
,
"prefetchnta (%1)"
,
X86_FEATURE_XMM
,
...
...
include/linux/sched.h
View file @
59ee66b5
...
...
@@ -264,15 +264,6 @@ struct signal_struct {
/* thread group stop support, overloads group_exit_code too */
int
group_stop_count
;
/* job control IDs */
pid_t
pgrp
;
pid_t
tty_old_pgrp
;
pid_t
session
;
/* boolean value for session group leader */
int
leader
;
struct
tty_struct
*
tty
;
/* NULL if no tty */
};
/*
...
...
@@ -375,7 +366,12 @@ struct task_struct {
unsigned
long
personality
;
int
did_exec
:
1
;
pid_t
pid
;
pid_t
__pgrp
;
/* Accessed via process_group() */
pid_t
tty_old_pgrp
;
pid_t
session
;
pid_t
tgid
;
/* boolean value for session group leader */
int
leader
;
/*
* pointers to (original) parent process, youngest child, younger sibling,
* older sibling, respectively. (p->father can be replaced with
...
...
@@ -419,6 +415,7 @@ struct task_struct {
char
comm
[
16
];
/* file system info */
int
link_count
,
total_link_count
;
struct
tty_struct
*
tty
;
/* NULL if no tty */
/* ipc stuff */
struct
sysv_sem
sysvsem
;
/* CPU-specific state of this task */
...
...
@@ -471,22 +468,7 @@ struct task_struct {
static
inline
pid_t
process_group
(
struct
task_struct
*
tsk
)
{
return
tsk
->
signal
->
pgrp
;
}
static
inline
pid_t
process_session
(
struct
task_struct
*
tsk
)
{
return
tsk
->
signal
->
session
;
}
static
inline
int
process_session_leader
(
struct
task_struct
*
tsk
)
{
return
tsk
->
signal
->
leader
;
}
static
inline
struct
tty_struct
*
process_tty
(
struct
task_struct
*
tsk
)
{
return
tsk
->
signal
->
tty
;
return
tsk
->
group_leader
->
__pgrp
;
}
extern
void
__put_task_struct
(
struct
task_struct
*
tsk
);
...
...
kernel/acct.c
View file @
59ee66b5
...
...
@@ -343,7 +343,7 @@ static void do_acct_process(long exitcode, struct file *file)
/* we really need to bite the bullet and change layout */
ac
.
ac_uid
=
current
->
uid
;
ac
.
ac_gid
=
current
->
gid
;
ac
.
ac_tty
=
process_tty
(
current
)
?
old_encode_dev
(
tty_devnum
(
process_tty
(
current
)
))
:
0
;
ac
.
ac_tty
=
current
->
tty
?
old_encode_dev
(
tty_devnum
(
current
->
tty
))
:
0
;
ac
.
ac_flag
=
0
;
if
(
current
->
flags
&
PF_FORKNOEXEC
)
...
...
kernel/exit.c
View file @
59ee66b5
...
...
@@ -119,13 +119,13 @@ int session_of_pgrp(int pgrp)
read_lock
(
&
tasklist_lock
);
for_each_task_pid
(
pgrp
,
PIDTYPE_PGID
,
p
,
l
,
pid
)
if
(
p
rocess_session
(
p
)
>
0
)
{
sid
=
p
rocess_session
(
p
)
;
if
(
p
->
session
>
0
)
{
sid
=
p
->
session
;
goto
out
;
}
p
=
find_task_by_pid
(
pgrp
);
if
(
p
)
sid
=
p
rocess_session
(
p
)
;
sid
=
p
->
session
;
out:
read_unlock
(
&
tasklist_lock
);
...
...
@@ -153,7 +153,7 @@ static int will_become_orphaned_pgrp(int pgrp, task_t *ignored_task)
||
p
->
real_parent
->
pid
==
1
)
continue
;
if
(
process_group
(
p
->
real_parent
)
!=
pgrp
&&
p
rocess_session
(
p
->
real_parent
)
==
process_session
(
p
)
)
{
&&
p
->
real_parent
->
session
==
p
->
session
)
{
ret
=
0
;
break
;
}
...
...
@@ -242,14 +242,14 @@ void __set_special_pids(pid_t session, pid_t pgrp)
{
struct
task_struct
*
curr
=
current
;
if
(
process_session
(
curr
)
!=
session
)
{
if
(
curr
->
session
!=
session
)
{
detach_pid
(
curr
,
PIDTYPE_SID
);
curr
->
s
ignal
->
s
ession
=
session
;
curr
->
session
=
session
;
attach_pid
(
curr
,
PIDTYPE_SID
,
session
);
}
if
(
process_group
(
curr
)
!=
pgrp
)
{
detach_pid
(
curr
,
PIDTYPE_PGID
);
curr
->
signal
->
pgrp
=
pgrp
;
curr
->
group_leader
->
__
pgrp
=
pgrp
;
attach_pid
(
curr
,
PIDTYPE_PGID
,
pgrp
);
}
}
...
...
@@ -303,7 +303,7 @@ void daemonize(const char *name, ...)
exit_mm
(
current
);
set_special_pids
(
1
,
1
);
current
->
signal
->
tty
=
NULL
;
current
->
tty
=
NULL
;
/* Block and flush all signals */
sigfillset
(
&
blocked
);
...
...
@@ -515,7 +515,7 @@ static inline void reparent_thread(task_t *p, task_t *father, int traced)
* outside, so the child pgrp is now orphaned.
*/
if
((
process_group
(
p
)
!=
process_group
(
father
))
&&
(
p
rocess_session
(
p
)
==
process_session
(
father
)
))
{
(
p
->
session
==
father
->
session
))
{
int
pgrp
=
process_group
(
p
);
if
(
will_become_orphaned_pgrp
(
pgrp
,
NULL
)
&&
has_stopped_jobs
(
pgrp
))
{
...
...
@@ -625,7 +625,7 @@ static void exit_notify(struct task_struct *tsk)
t
=
tsk
->
real_parent
;
if
((
process_group
(
t
)
!=
process_group
(
tsk
))
&&
(
process_session
(
t
)
==
process_session
(
tsk
)
)
&&
(
t
->
session
==
tsk
->
session
)
&&
will_become_orphaned_pgrp
(
process_group
(
tsk
),
tsk
)
&&
has_stopped_jobs
(
process_group
(
tsk
)))
{
__kill_pg_info
(
SIGHUP
,
(
void
*
)
1
,
process_group
(
tsk
));
...
...
@@ -720,7 +720,7 @@ NORET_TYPE void do_exit(long code)
exit_itimers
(
tsk
);
exit_thread
();
if
(
process_session_leader
(
tsk
)
)
if
(
tsk
->
leader
)
disassociate_ctty
(
1
);
module_put
(
tsk
->
thread_info
->
exec_domain
->
module
);
...
...
kernel/fork.c
View file @
59ee66b5
...
...
@@ -743,12 +743,6 @@ static inline int copy_signal(unsigned long clone_flags, struct task_struct * ts
sig
->
curr_target
=
NULL
;
init_sigpending
(
&
sig
->
shared_pending
);
sig
->
tty
=
process_tty
(
current
);
sig
->
pgrp
=
process_group
(
current
);
sig
->
session
=
process_session
(
current
);
sig
->
leader
=
0
;
/* session leadership doesn't inherit */
sig
->
tty_old_pgrp
=
0
;
return
0
;
}
...
...
@@ -795,9 +789,7 @@ struct task_struct *copy_process(unsigned long clone_flags,
* Thread groups must share signals as well, and detached threads
* can only be started up within the thread group.
*/
if
((
clone_flags
&
CLONE_THREAD
)
&&
(
clone_flags
&
(
CLONE_SIGHAND
|
CLONE_DETACHED
))
!=
(
CLONE_SIGHAND
|
CLONE_DETACHED
))
if
((
clone_flags
&
CLONE_THREAD
)
&&
!
(
clone_flags
&
CLONE_SIGHAND
))
return
ERR_PTR
(
-
EINVAL
);
/*
...
...
@@ -902,6 +894,8 @@ struct task_struct *copy_process(unsigned long clone_flags,
init_timer
(
&
p
->
real_timer
);
p
->
real_timer
.
data
=
(
unsigned
long
)
p
;
p
->
leader
=
0
;
/* session leadership doesn't inherit */
p
->
tty_old_pgrp
=
0
;
p
->
utime
=
p
->
stime
=
0
;
p
->
cutime
=
p
->
cstime
=
0
;
p
->
array
=
NULL
;
...
...
@@ -1046,7 +1040,7 @@ struct task_struct *copy_process(unsigned long clone_flags,
if
(
thread_group_leader
(
p
))
{
attach_pid
(
p
,
PIDTYPE_TGID
,
p
->
tgid
);
attach_pid
(
p
,
PIDTYPE_PGID
,
process_group
(
p
));
attach_pid
(
p
,
PIDTYPE_SID
,
p
rocess_session
(
p
)
);
attach_pid
(
p
,
PIDTYPE_SID
,
p
->
session
);
if
(
p
->
pid
)
__get_cpu_var
(
process_counts
)
++
;
}
else
...
...
kernel/pid.c
View file @
59ee66b5
...
...
@@ -253,14 +253,14 @@ void switch_exec_pids(task_t *leader, task_t *thread)
attach_pid
(
thread
,
PIDTYPE_PID
,
thread
->
pid
);
attach_pid
(
thread
,
PIDTYPE_TGID
,
thread
->
tgid
);
attach_pid
(
thread
,
PIDTYPE_PGID
,
thread
->
signal
->
pgrp
);
attach_pid
(
thread
,
PIDTYPE_SID
,
thread
->
s
ignal
->
s
ession
);
attach_pid
(
thread
,
PIDTYPE_PGID
,
leader
->
__
pgrp
);
attach_pid
(
thread
,
PIDTYPE_SID
,
thread
->
session
);
list_add_tail
(
&
thread
->
tasks
,
&
init_task
.
tasks
);
attach_pid
(
leader
,
PIDTYPE_PID
,
leader
->
pid
);
attach_pid
(
leader
,
PIDTYPE_TGID
,
leader
->
tgid
);
attach_pid
(
leader
,
PIDTYPE_PGID
,
leader
->
signal
->
pgrp
);
attach_pid
(
leader
,
PIDTYPE_SID
,
leader
->
s
ignal
->
s
ession
);
attach_pid
(
leader
,
PIDTYPE_PGID
,
leader
->
__
pgrp
);
attach_pid
(
leader
,
PIDTYPE_SID
,
leader
->
session
);
}
/*
...
...
kernel/signal.c
View file @
59ee66b5
...
...
@@ -593,8 +593,7 @@ static int check_kill_permission(int sig, struct siginfo *info,
error
=
-
EPERM
;
if
((
!
info
||
((
unsigned
long
)
info
!=
1
&&
(
unsigned
long
)
info
!=
2
&&
SI_FROMUSER
(
info
)))
&&
((
sig
!=
SIGCONT
)
||
(
process_session
(
current
)
!=
process_session
(
t
)))
&&
((
sig
!=
SIGCONT
)
||
(
current
->
session
!=
t
->
session
))
&&
(
current
->
euid
^
t
->
suid
)
&&
(
current
->
euid
^
t
->
uid
)
&&
(
current
->
uid
^
t
->
suid
)
&&
(
current
->
uid
^
t
->
uid
)
&&
!
capable
(
CAP_KILL
))
...
...
@@ -1103,7 +1102,7 @@ kill_sl_info(int sig, struct siginfo *info, pid_t sid)
retval
=
-
ESRCH
;
read_lock
(
&
tasklist_lock
);
for_each_task_pid
(
sid
,
PIDTYPE_SID
,
p
,
l
,
pid
)
{
if
(
!
p
rocess_session_leader
(
p
)
)
if
(
!
p
->
leader
)
continue
;
err
=
group_send_sig_info
(
sig
,
info
,
p
);
if
(
retval
)
...
...
kernel/sys.c
View file @
59ee66b5
...
...
@@ -969,7 +969,7 @@ asmlinkage long sys_setpgid(pid_t pid, pid_t pgid)
if
(
p
->
parent
==
current
||
p
->
real_parent
==
current
)
{
err
=
-
EPERM
;
if
(
p
rocess_session
(
p
)
!=
process_session
(
current
)
)
if
(
p
->
session
!=
current
->
session
)
goto
out
;
err
=
-
EACCES
;
if
(
p
->
did_exec
)
...
...
@@ -981,7 +981,7 @@ asmlinkage long sys_setpgid(pid_t pid, pid_t pgid)
}
err
=
-
EPERM
;
if
(
p
rocess_session_leader
(
p
)
)
if
(
p
->
leader
)
goto
out
;
if
(
pgid
!=
pid
)
{
...
...
@@ -990,7 +990,7 @@ asmlinkage long sys_setpgid(pid_t pid, pid_t pgid)
struct
list_head
*
l
;
for_each_task_pid
(
pgid
,
PIDTYPE_PGID
,
p
,
l
,
pid
)
if
(
p
rocess_session
(
p
)
==
process_session
(
current
)
)
if
(
p
->
session
==
current
->
session
)
goto
ok_pgid
;
goto
out
;
}
...
...
@@ -1002,7 +1002,7 @@ asmlinkage long sys_setpgid(pid_t pid, pid_t pgid)
if
(
process_group
(
p
)
!=
pgid
)
{
detach_pid
(
p
,
PIDTYPE_PGID
);
p
->
signal
->
pgrp
=
pgid
;
p
->
group_leader
->
__
pgrp
=
pgid
;
attach_pid
(
p
,
PIDTYPE_PGID
,
pgid
);
}
...
...
@@ -1044,7 +1044,7 @@ asmlinkage long sys_getpgrp(void)
asmlinkage
long
sys_getsid
(
pid_t
pid
)
{
if
(
!
pid
)
{
return
process_session
(
current
)
;
return
current
->
session
;
}
else
{
int
retval
;
struct
task_struct
*
p
;
...
...
@@ -1056,7 +1056,7 @@ asmlinkage long sys_getsid(pid_t pid)
if
(
p
)
{
retval
=
security_task_getsid
(
p
);
if
(
!
retval
)
retval
=
p
rocess_session
(
p
)
;
retval
=
p
->
session
;
}
read_unlock
(
&
tasklist_lock
);
return
retval
;
...
...
@@ -1077,10 +1077,10 @@ asmlinkage long sys_setsid(void)
if
(
pid
)
goto
out
;
current
->
signal
->
leader
=
1
;
current
->
leader
=
1
;
__set_special_pids
(
current
->
pid
,
current
->
pid
);
current
->
signal
->
tty
=
NULL
;
current
->
signal
->
tty_old_pgrp
=
0
;
current
->
tty
=
NULL
;
current
->
tty_old_pgrp
=
0
;
err
=
process_group
(
current
);
out:
write_unlock_irq
(
&
tasklist_lock
);
...
...
net/ipv4/netfilter/ipt_owner.c
View file @
59ee66b5
...
...
@@ -90,7 +90,7 @@ match_sid(const struct sk_buff *skb, pid_t sid)
read_lock
(
&
tasklist_lock
);
do_each_thread
(
g
,
p
)
{
struct
files_struct
*
files
;
if
(
p
rocess_session
(
p
)
!=
sid
)
if
(
p
->
session
!=
sid
)
continue
;
task_lock
(
p
);
...
...
net/ipv6/netfilter/ip6t_owner.c
View file @
59ee66b5
...
...
@@ -56,7 +56,7 @@ match_sid(const struct sk_buff *skb, pid_t sid)
read_lock
(
&
tasklist_lock
);
do_each_thread
(
g
,
p
)
{
struct
files_struct
*
files
;
if
(
p
rocess_session
(
p
)
!=
sid
)
if
(
p
->
session
!=
sid
)
continue
;
task_lock
(
p
);
...
...
net/sunrpc/clnt.c
View file @
59ee66b5
...
...
@@ -961,19 +961,19 @@ call_verify(struct rpc_task *task)
case
RPC_SUCCESS
:
return
p
;
case
RPC_PROG_UNAVAIL
:
printk
(
KERN_WARNING
"RPC:
%4d
call_verify: program %u is unsupported by server %s
\n
"
,
task
->
tk_pid
,
(
unsigned
int
)
task
->
tk_client
->
cl_prog
,
printk
(
KERN_WARNING
"RPC: call_verify: program %u is unsupported by server %s
\n
"
,
(
unsigned
int
)
task
->
tk_client
->
cl_prog
,
task
->
tk_client
->
cl_server
);
goto
out_eio
;
case
RPC_PROG_MISMATCH
:
printk
(
KERN_WARNING
"RPC:
%4d
call_verify: program %u, version %u unsupported by server %s
\n
"
,
task
->
tk_pid
,
(
unsigned
int
)
task
->
tk_client
->
cl_prog
,
printk
(
KERN_WARNING
"RPC: call_verify: program %u, version %u unsupported by server %s
\n
"
,
(
unsigned
int
)
task
->
tk_client
->
cl_prog
,
(
unsigned
int
)
task
->
tk_client
->
cl_vers
,
task
->
tk_client
->
cl_server
);
goto
out_eio
;
case
RPC_PROC_UNAVAIL
:
printk
(
KERN_WARNING
"RPC:
%4d
call_verify: proc %p unsupported by program %u, version %u on server %s
\n
"
,
task
->
tk_
pid
,
task
->
tk_
msg
.
rpc_proc
,
printk
(
KERN_WARNING
"RPC: call_verify: proc %p unsupported by program %u, version %u on server %s
\n
"
,
task
->
tk_msg
.
rpc_proc
,
task
->
tk_client
->
cl_prog
,
task
->
tk_client
->
cl_vers
,
task
->
tk_client
->
cl_server
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment