mirror of
https://github.com/genesi/linux-legacy.git
synced 2026-07-08 17:56:06 +00:00
x86/ptrace: make genregs[32]_get/set more robust
commit 04a1e62c2cec820501f93526ad1e46073b802dc4 upstream. The loop condition is fragile: we compare an unsigned value to zero, and then decrement it by something larger than one in the loop. All the callers should be passing in appropriately aligned buffer lengths, but it's better to just not rely on it, and have some appropriate defensive loop limits. Acked-by: Roland McGrath <roland@redhat.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
2bdc1c6942
commit
1bb36e83e3
@@ -417,14 +417,14 @@ static int genregs_get(struct task_struct *target,
|
||||
{
|
||||
if (kbuf) {
|
||||
unsigned long *k = kbuf;
|
||||
while (count > 0) {
|
||||
while (count >= sizeof(*k)) {
|
||||
*k++ = getreg(target, pos);
|
||||
count -= sizeof(*k);
|
||||
pos += sizeof(*k);
|
||||
}
|
||||
} else {
|
||||
unsigned long __user *u = ubuf;
|
||||
while (count > 0) {
|
||||
while (count >= sizeof(*u)) {
|
||||
if (__put_user(getreg(target, pos), u++))
|
||||
return -EFAULT;
|
||||
count -= sizeof(*u);
|
||||
@@ -443,14 +443,14 @@ static int genregs_set(struct task_struct *target,
|
||||
int ret = 0;
|
||||
if (kbuf) {
|
||||
const unsigned long *k = kbuf;
|
||||
while (count > 0 && !ret) {
|
||||
while (count >= sizeof(*k) && !ret) {
|
||||
ret = putreg(target, pos, *k++);
|
||||
count -= sizeof(*k);
|
||||
pos += sizeof(*k);
|
||||
}
|
||||
} else {
|
||||
const unsigned long __user *u = ubuf;
|
||||
while (count > 0 && !ret) {
|
||||
while (count >= sizeof(*u) && !ret) {
|
||||
unsigned long word;
|
||||
ret = __get_user(word, u++);
|
||||
if (ret)
|
||||
@@ -1223,14 +1223,14 @@ static int genregs32_get(struct task_struct *target,
|
||||
{
|
||||
if (kbuf) {
|
||||
compat_ulong_t *k = kbuf;
|
||||
while (count > 0) {
|
||||
while (count >= sizeof(*k)) {
|
||||
getreg32(target, pos, k++);
|
||||
count -= sizeof(*k);
|
||||
pos += sizeof(*k);
|
||||
}
|
||||
} else {
|
||||
compat_ulong_t __user *u = ubuf;
|
||||
while (count > 0) {
|
||||
while (count >= sizeof(*u)) {
|
||||
compat_ulong_t word;
|
||||
getreg32(target, pos, &word);
|
||||
if (__put_user(word, u++))
|
||||
@@ -1251,14 +1251,14 @@ static int genregs32_set(struct task_struct *target,
|
||||
int ret = 0;
|
||||
if (kbuf) {
|
||||
const compat_ulong_t *k = kbuf;
|
||||
while (count > 0 && !ret) {
|
||||
while (count >= sizeof(*k) && !ret) {
|
||||
ret = putreg32(target, pos, *k++);
|
||||
count -= sizeof(*k);
|
||||
pos += sizeof(*k);
|
||||
}
|
||||
} else {
|
||||
const compat_ulong_t __user *u = ubuf;
|
||||
while (count > 0 && !ret) {
|
||||
while (count >= sizeof(*u) && !ret) {
|
||||
compat_ulong_t word;
|
||||
ret = __get_user(word, u++);
|
||||
if (ret)
|
||||
|
||||
Reference in New Issue
Block a user