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

Reply via email to