Re: fs/binfmt_flat.c:828:9: error: void value not ignored as it ought to be
From: Randy Dunlap
Date: Tue Aug 22 2017 - 20:20:47 EST
On 08/19/2017 04:27 PM, kbuild test robot wrote:
> Hi Al,
>
> FYI, the error/warning still remains.
>
> tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
> head: 58d4e450a490d5f02183f6834c12550ba26d3b47
> commit: 468138d78510688fb5476f98d23f11ac6a63229a binfmt_flat: flat_{get,put}_addr_from_rp() should be able to fail
> date: 7 weeks ago
> config: m32r-mappi.nommu_defconfig (attached as .config)
> compiler: m32r-linux-gcc (GCC) 6.2.0
> reproduce:
> wget https://raw.githubusercontent.com/01org/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
> chmod +x ~/bin/make.cross
> git checkout 468138d78510688fb5476f98d23f11ac6a63229a
> # save the attached .config to linux build tree
> make.cross ARCH=m32r
Hi Al,
I sent a patch to m322 and microblaze a few weeks ago for this build error.
(July 30, 2017) https://lkml.org/lkml/2017/7/30/179
Have you had a chance to look at it?
Thanks.
> All errors (new ones prefixed by >>):
>
>>> fs/binfmt_flat.c:828:9: error: void value not ignored as it ought to be
> ret = flat_put_addr_at_rp(rp, addr, relval);
> ^
>
> vim +828 fs/binfmt_flat.c
>
> 506
> 507 /*
> 508 * Check initial limits. This avoids letting people circumvent
> 509 * size limits imposed on them by creating programs with large
> 510 * arrays in the data or bss.
> 511 */
> 512 rlim = rlimit(RLIMIT_DATA);
> 513 if (rlim >= RLIM_INFINITY)
> 514 rlim = ~0;
> 515 if (data_len + bss_len > rlim) {
> 516 ret = -ENOMEM;
> 517 goto err;
> 518 }
> 519
> 520 /* Flush all traces of the currently running executable */
> 521 if (id == 0) {
> 522 ret = flush_old_exec(bprm);
> 523 if (ret)
> 524 goto err;
> 525
> 526 /* OK, This is the point of no return */
> 527 set_personality(PER_LINUX_32BIT);
> 528 setup_new_exec(bprm);
> 529 }
> 530
> 531 /*
> 532 * calculate the extra space we need to map in
> 533 */
> 534 extra = max_t(unsigned long, bss_len + stack_len,
> 535 relocs * sizeof(unsigned long));
> 536
> 537 /*
> 538 * there are a couple of cases here, the separate code/data
> 539 * case, and then the fully copied to RAM case which lumps
> 540 * it all together.
> 541 */
> 542 if (!IS_ENABLED(CONFIG_MMU) && !(flags & (FLAT_FLAG_RAM|FLAT_FLAG_GZIP))) {
> 543 /*
> 544 * this should give us a ROM ptr, but if it doesn't we don't
> 545 * really care
> 546 */
> 547 pr_debug("ROM mapping of file (we hope)\n");
> 548
> 549 textpos = vm_mmap(bprm->file, 0, text_len, PROT_READ|PROT_EXEC,
> 550 MAP_PRIVATE|MAP_EXECUTABLE, 0);
> 551 if (!textpos || IS_ERR_VALUE(textpos)) {
> 552 ret = textpos;
> 553 if (!textpos)
> 554 ret = -ENOMEM;
> 555 pr_err("Unable to mmap process text, errno %d\n", ret);
> 556 goto err;
> 557 }
> 558
> 559 len = data_len + extra + MAX_SHARED_LIBS * sizeof(unsigned long);
> 560 len = PAGE_ALIGN(len);
> 561 realdatastart = vm_mmap(NULL, 0, len,
> 562 PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE, 0);
> 563
> 564 if (realdatastart == 0 || IS_ERR_VALUE(realdatastart)) {
> 565 ret = realdatastart;
> 566 if (!realdatastart)
> 567 ret = -ENOMEM;
> 568 pr_err("Unable to allocate RAM for process data, "
> 569 "errno %d\n", ret);
> 570 vm_munmap(textpos, text_len);
> 571 goto err;
> 572 }
> 573 datapos = ALIGN(realdatastart +
> 574 MAX_SHARED_LIBS * sizeof(unsigned long),
> 575 FLAT_DATA_ALIGN);
> 576
> 577 pr_debug("Allocated data+bss+stack (%ld bytes): %lx\n",
> 578 data_len + bss_len + stack_len, datapos);
> 579
> 580 fpos = ntohl(hdr->data_start);
> 581 #ifdef CONFIG_BINFMT_ZFLAT
> 582 if (flags & FLAT_FLAG_GZDATA) {
> 583 result = decompress_exec(bprm, fpos, (char *)datapos,
> 584 full_data, 0);
> 585 } else
> 586 #endif
> 587 {
> 588 result = read_code(bprm->file, datapos, fpos,
> 589 full_data);
> 590 }
> 591 if (IS_ERR_VALUE(result)) {
> 592 ret = result;
> 593 pr_err("Unable to read data+bss, errno %d\n", ret);
> 594 vm_munmap(textpos, text_len);
> 595 vm_munmap(realdatastart, len);
> 596 goto err;
> 597 }
> 598
> 599 reloc = (u32 __user *)
> 600 (datapos + (ntohl(hdr->reloc_start) - text_len));
> 601 memp = realdatastart;
> 602 memp_size = len;
> 603 } else {
> 604
> 605 len = text_len + data_len + extra + MAX_SHARED_LIBS * sizeof(u32);
> 606 len = PAGE_ALIGN(len);
> 607 textpos = vm_mmap(NULL, 0, len,
> 608 PROT_READ | PROT_EXEC | PROT_WRITE, MAP_PRIVATE, 0);
> 609
> 610 if (!textpos || IS_ERR_VALUE(textpos)) {
> 611 ret = textpos;
> 612 if (!textpos)
> 613 ret = -ENOMEM;
> 614 pr_err("Unable to allocate RAM for process text/data, "
> 615 "errno %d\n", ret);
> 616 goto err;
> 617 }
> 618
> 619 realdatastart = textpos + ntohl(hdr->data_start);
> 620 datapos = ALIGN(realdatastart +
> 621 MAX_SHARED_LIBS * sizeof(u32),
> 622 FLAT_DATA_ALIGN);
> 623
> 624 reloc = (u32 __user *)
> 625 (datapos + (ntohl(hdr->reloc_start) - text_len));
> 626 memp = textpos;
> 627 memp_size = len;
> 628 #ifdef CONFIG_BINFMT_ZFLAT
> 629 /*
> 630 * load it all in and treat it like a RAM load from now on
> 631 */
> 632 if (flags & FLAT_FLAG_GZIP) {
> 633 #ifndef CONFIG_MMU
> 634 result = decompress_exec(bprm, sizeof(struct flat_hdr),
> 635 (((char *)textpos) + sizeof(struct flat_hdr)),
> 636 (text_len + full_data
> 637 - sizeof(struct flat_hdr)),
> 638 0);
> 639 memmove((void *) datapos, (void *) realdatastart,
> 640 full_data);
> 641 #else
> 642 /*
> 643 * This is used on MMU systems mainly for testing.
> 644 * Let's use a kernel buffer to simplify things.
> 645 */
> 646 long unz_text_len = text_len - sizeof(struct flat_hdr);
> 647 long unz_len = unz_text_len + full_data;
> 648 char *unz_data = vmalloc(unz_len);
> 649 if (!unz_data) {
> 650 result = -ENOMEM;
> 651 } else {
> 652 result = decompress_exec(bprm, sizeof(struct flat_hdr),
> 653 unz_data, unz_len, 0);
> 654 if (result == 0 &&
> 655 (copy_to_user((void __user *)textpos + sizeof(struct flat_hdr),
> 656 unz_data, unz_text_len) ||
> 657 copy_to_user((void __user *)datapos,
> 658 unz_data + unz_text_len, full_data)))
> 659 result = -EFAULT;
> 660 vfree(unz_data);
> 661 }
> 662 #endif
> 663 } else if (flags & FLAT_FLAG_GZDATA) {
> 664 result = read_code(bprm->file, textpos, 0, text_len);
> 665 if (!IS_ERR_VALUE(result)) {
> 666 #ifndef CONFIG_MMU
> 667 result = decompress_exec(bprm, text_len, (char *) datapos,
> 668 full_data, 0);
> 669 #else
> 670 char *unz_data = vmalloc(full_data);
> 671 if (!unz_data) {
> 672 result = -ENOMEM;
> 673 } else {
> 674 result = decompress_exec(bprm, text_len,
> 675 unz_data, full_data, 0);
> 676 if (result == 0 &&
> 677 copy_to_user((void __user *)datapos,
> 678 unz_data, full_data))
> 679 result = -EFAULT;
> 680 vfree(unz_data);
> 681 }
> 682 #endif
> 683 }
> 684 } else
> 685 #endif /* CONFIG_BINFMT_ZFLAT */
> 686 {
> 687 result = read_code(bprm->file, textpos, 0, text_len);
> 688 if (!IS_ERR_VALUE(result))
> 689 result = read_code(bprm->file, datapos,
> 690 ntohl(hdr->data_start),
> 691 full_data);
> 692 }
> 693 if (IS_ERR_VALUE(result)) {
> 694 ret = result;
> 695 pr_err("Unable to read code+data+bss, errno %d\n", ret);
> 696 vm_munmap(textpos, text_len + data_len + extra +
> 697 MAX_SHARED_LIBS * sizeof(u32));
> 698 goto err;
> 699 }
> 700 }
> 701
> 702 start_code = textpos + sizeof(struct flat_hdr);
> 703 end_code = textpos + text_len;
> 704 text_len -= sizeof(struct flat_hdr); /* the real code len */
> 705
> 706 /* The main program needs a little extra setup in the task structure */
> 707 if (id == 0) {
> 708 current->mm->start_code = start_code;
> 709 current->mm->end_code = end_code;
> 710 current->mm->start_data = datapos;
> 711 current->mm->end_data = datapos + data_len;
> 712 /*
> 713 * set up the brk stuff, uses any slack left in data/bss/stack
> 714 * allocation. We put the brk after the bss (between the bss
> 715 * and stack) like other platforms.
> 716 * Userspace code relies on the stack pointer starting out at
> 717 * an address right at the end of a page.
> 718 */
> 719 current->mm->start_brk = datapos + data_len + bss_len;
> 720 current->mm->brk = (current->mm->start_brk + 3) & ~3;
> 721 #ifndef CONFIG_MMU
> 722 current->mm->context.end_brk = memp + memp_size - stack_len;
> 723 #endif
> 724 }
> 725
> 726 if (flags & FLAT_FLAG_KTRACE) {
> 727 pr_info("Mapping is %lx, Entry point is %x, data_start is %x\n",
> 728 textpos, 0x00ffffff&ntohl(hdr->entry), ntohl(hdr->data_start));
> 729 pr_info("%s %s: TEXT=%lx-%lx DATA=%lx-%lx BSS=%lx-%lx\n",
> 730 id ? "Lib" : "Load", bprm->filename,
> 731 start_code, end_code, datapos, datapos + data_len,
> 732 datapos + data_len, (datapos + data_len + bss_len + 3) & ~3);
> 733 }
> 734
> 735 /* Store the current module values into the global library structure */
> 736 libinfo->lib_list[id].start_code = start_code;
> 737 libinfo->lib_list[id].start_data = datapos;
> 738 libinfo->lib_list[id].start_brk = datapos + data_len + bss_len;
> 739 libinfo->lib_list[id].text_len = text_len;
> 740 libinfo->lib_list[id].loaded = 1;
> 741 libinfo->lib_list[id].entry = (0x00ffffff & ntohl(hdr->entry)) + textpos;
> 742 libinfo->lib_list[id].build_date = ntohl(hdr->build_date);
> 743
> 744 /*
> 745 * We just load the allocations into some temporary memory to
> 746 * help simplify all this mumbo jumbo
> 747 *
> 748 * We've got two different sections of relocation entries.
> 749 * The first is the GOT which resides at the beginning of the data segment
> 750 * and is terminated with a -1. This one can be relocated in place.
> 751 * The second is the extra relocation entries tacked after the image's
> 752 * data segment. These require a little more processing as the entry is
> 753 * really an offset into the image which contains an offset into the
> 754 * image.
> 755 */
> 756 if (flags & FLAT_FLAG_GOTPIC) {
> 757 for (rp = (u32 __user *)datapos; ; rp++) {
> 758 u32 addr, rp_val;
> 759 if (get_user(rp_val, rp))
> 760 return -EFAULT;
> 761 if (rp_val == 0xffffffff)
> 762 break;
> 763 if (rp_val) {
> 764 addr = calc_reloc(rp_val, libinfo, id, 0);
> 765 if (addr == RELOC_FAILED) {
> 766 ret = -ENOEXEC;
> 767 goto err;
> 768 }
> 769 if (put_user(addr, rp))
> 770 return -EFAULT;
> 771 }
> 772 }
> 773 }
> 774
> 775 /*
> 776 * Now run through the relocation entries.
> 777 * We've got to be careful here as C++ produces relocatable zero
> 778 * entries in the constructor and destructor tables which are then
> 779 * tested for being not zero (which will always occur unless we're
> 780 * based from address zero). This causes an endless loop as __start
> 781 * is at zero. The solution used is to not relocate zero addresses.
> 782 * This has the negative side effect of not allowing a global data
> 783 * reference to be statically initialised to _stext (I've moved
> 784 * __start to address 4 so that is okay).
> 785 */
> 786 if (rev > OLD_FLAT_VERSION) {
> 787 u32 __maybe_unused persistent = 0;
> 788 for (i = 0; i < relocs; i++) {
> 789 u32 addr, relval;
> 790
> 791 /*
> 792 * Get the address of the pointer to be
> 793 * relocated (of course, the address has to be
> 794 * relocated first).
> 795 */
> 796 if (get_user(relval, reloc + i))
> 797 return -EFAULT;
> 798 relval = ntohl(relval);
> 799 if (flat_set_persistent(relval, &persistent))
> 800 continue;
> 801 addr = flat_get_relocate_addr(relval);
> 802 rp = (u32 __user *)calc_reloc(addr, libinfo, id, 1);
> 803 if (rp == (u32 __user *)RELOC_FAILED) {
> 804 ret = -ENOEXEC;
> 805 goto err;
> 806 }
> 807
> 808 /* Get the pointer's value. */
> 809 ret = flat_get_addr_from_rp(rp, relval, flags,
> 810 &addr, &persistent);
> 811 if (unlikely(ret))
> 812 goto err;
> 813
> 814 if (addr != 0) {
> 815 /*
> 816 * Do the relocation. PIC relocs in the data section are
> 817 * already in target order
> 818 */
> 819 if ((flags & FLAT_FLAG_GOTPIC) == 0)
> 820 addr = ntohl(addr);
> 821 addr = calc_reloc(addr, libinfo, id, 0);
> 822 if (addr == RELOC_FAILED) {
> 823 ret = -ENOEXEC;
> 824 goto err;
> 825 }
> 826
> 827 /* Write back the relocated pointer. */
> > 828 ret = flat_put_addr_at_rp(rp, addr, relval);
> 829 if (unlikely(ret))
> 830 goto err;
> 831 }
> 832 }
--
~Randy