diff options
| -rw-r--r-- | arch/powerpc/kernel/lparcfg.c | 28 |
1 files changed, 12 insertions, 16 deletions
diff --git a/arch/powerpc/kernel/lparcfg.c b/arch/powerpc/kernel/lparcfg.c index 64381a204a58..9f856a0c3e38 100644 --- a/arch/powerpc/kernel/lparcfg.c +++ b/arch/powerpc/kernel/lparcfg.c | |||
| @@ -573,29 +573,27 @@ static ssize_t update_mpp(u64 *entitlement, u8 *weight) | |||
| 573 | static ssize_t lparcfg_write(struct file *file, const char __user * buf, | 573 | static ssize_t lparcfg_write(struct file *file, const char __user * buf, |
| 574 | size_t count, loff_t * off) | 574 | size_t count, loff_t * off) |
| 575 | { | 575 | { |
| 576 | char *kbuf; | 576 | int kbuf_sz = 64; |
| 577 | char kbuf[kbuf_sz]; | ||
| 577 | char *tmp; | 578 | char *tmp; |
| 578 | u64 new_entitled, *new_entitled_ptr = &new_entitled; | 579 | u64 new_entitled, *new_entitled_ptr = &new_entitled; |
| 579 | u8 new_weight, *new_weight_ptr = &new_weight; | 580 | u8 new_weight, *new_weight_ptr = &new_weight; |
| 580 | ssize_t retval = -ENOMEM; | 581 | ssize_t retval; |
| 581 | 582 | ||
| 582 | if (!firmware_has_feature(FW_FEATURE_SPLPAR) || | 583 | if (!firmware_has_feature(FW_FEATURE_SPLPAR) || |
| 583 | firmware_has_feature(FW_FEATURE_ISERIES)) | 584 | firmware_has_feature(FW_FEATURE_ISERIES)) |
| 584 | return -EINVAL; | 585 | return -EINVAL; |
| 585 | 586 | ||
| 586 | kbuf = kmalloc(count, GFP_KERNEL); | 587 | if (count > kbuf_sz) |
| 587 | if (!kbuf) | 588 | return -EINVAL; |
| 588 | goto out; | ||
| 589 | 589 | ||
| 590 | retval = -EFAULT; | ||
| 591 | if (copy_from_user(kbuf, buf, count)) | 590 | if (copy_from_user(kbuf, buf, count)) |
| 592 | goto out; | 591 | return -EFAULT; |
| 593 | 592 | ||
| 594 | retval = -EINVAL; | ||
| 595 | kbuf[count - 1] = '\0'; | 593 | kbuf[count - 1] = '\0'; |
| 596 | tmp = strchr(kbuf, '='); | 594 | tmp = strchr(kbuf, '='); |
| 597 | if (!tmp) | 595 | if (!tmp) |
| 598 | goto out; | 596 | return -EINVAL; |
| 599 | 597 | ||
| 600 | *tmp++ = '\0'; | 598 | *tmp++ = '\0'; |
| 601 | 599 | ||
| @@ -603,32 +601,32 @@ static ssize_t lparcfg_write(struct file *file, const char __user * buf, | |||
| 603 | char *endp; | 601 | char *endp; |
| 604 | *new_entitled_ptr = (u64) simple_strtoul(tmp, &endp, 10); | 602 | *new_entitled_ptr = (u64) simple_strtoul(tmp, &endp, 10); |
| 605 | if (endp == tmp) | 603 | if (endp == tmp) |
| 606 | goto out; | 604 | return -EINVAL; |
| 607 | 605 | ||
| 608 | retval = update_ppp(new_entitled_ptr, NULL); | 606 | retval = update_ppp(new_entitled_ptr, NULL); |
| 609 | } else if (!strcmp(kbuf, "capacity_weight")) { | 607 | } else if (!strcmp(kbuf, "capacity_weight")) { |
| 610 | char *endp; | 608 | char *endp; |
| 611 | *new_weight_ptr = (u8) simple_strtoul(tmp, &endp, 10); | 609 | *new_weight_ptr = (u8) simple_strtoul(tmp, &endp, 10); |
| 612 | if (endp == tmp) | 610 | if (endp == tmp) |
| 613 | goto out; | 611 | return -EINVAL; |
| 614 | 612 | ||
| 615 | retval = update_ppp(NULL, new_weight_ptr); | 613 | retval = update_ppp(NULL, new_weight_ptr); |
| 616 | } else if (!strcmp(kbuf, "entitled_memory")) { | 614 | } else if (!strcmp(kbuf, "entitled_memory")) { |
| 617 | char *endp; | 615 | char *endp; |
| 618 | *new_entitled_ptr = (u64) simple_strtoul(tmp, &endp, 10); | 616 | *new_entitled_ptr = (u64) simple_strtoul(tmp, &endp, 10); |
| 619 | if (endp == tmp) | 617 | if (endp == tmp) |
| 620 | goto out; | 618 | return -EINVAL; |
| 621 | 619 | ||
| 622 | retval = update_mpp(new_entitled_ptr, NULL); | 620 | retval = update_mpp(new_entitled_ptr, NULL); |
| 623 | } else if (!strcmp(kbuf, "entitled_memory_weight")) { | 621 | } else if (!strcmp(kbuf, "entitled_memory_weight")) { |
| 624 | char *endp; | 622 | char *endp; |
| 625 | *new_weight_ptr = (u8) simple_strtoul(tmp, &endp, 10); | 623 | *new_weight_ptr = (u8) simple_strtoul(tmp, &endp, 10); |
| 626 | if (endp == tmp) | 624 | if (endp == tmp) |
| 627 | goto out; | 625 | return -EINVAL; |
| 628 | 626 | ||
| 629 | retval = update_mpp(NULL, new_weight_ptr); | 627 | retval = update_mpp(NULL, new_weight_ptr); |
| 630 | } else | 628 | } else |
| 631 | goto out; | 629 | return -EINVAL; |
| 632 | 630 | ||
| 633 | if (retval == H_SUCCESS || retval == H_CONSTRAINED) { | 631 | if (retval == H_SUCCESS || retval == H_CONSTRAINED) { |
| 634 | retval = count; | 632 | retval = count; |
| @@ -644,8 +642,6 @@ static ssize_t lparcfg_write(struct file *file, const char __user * buf, | |||
| 644 | retval = -EIO; | 642 | retval = -EIO; |
| 645 | } | 643 | } |
| 646 | 644 | ||
| 647 | out: | ||
| 648 | kfree(kbuf); | ||
| 649 | return retval; | 645 | return retval; |
| 650 | } | 646 | } |
| 651 | 647 | ||
