Date: Thu, 30 Dec 2010 23:35:23 +0000 (UTC) From: Dimitry Andric <dim@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r216827 - in projects/binutils-2.17: . bin/sh contrib/top etc etc/rc.d gnu/lib/libgcc lib/libc/locale lib/libc/rpc lib/libcompiler_rt lib/libkvm lib/libthr/thread libexec/rtld-elf libex... Message-ID: <201012302335.oBUNZNvj054128@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: dim Date: Thu Dec 30 23:35:23 2010 New Revision: 216827 URL: http://svn.freebsd.org/changeset/base/216827 Log: Sync: merge r216683 through r216826 from ^/head. Added: projects/binutils-2.17/tools/regression/bin/sh/expansion/cmdsubst10.0 - copied unchanged from r216826, head/tools/regression/bin/sh/expansion/cmdsubst10.0 projects/binutils-2.17/tools/regression/bin/sh/expansion/cmdsubst4.0 - copied unchanged from r216826, head/tools/regression/bin/sh/expansion/cmdsubst4.0 projects/binutils-2.17/tools/regression/bin/sh/expansion/cmdsubst5.0 - copied unchanged from r216826, head/tools/regression/bin/sh/expansion/cmdsubst5.0 projects/binutils-2.17/tools/regression/bin/sh/expansion/cmdsubst6.0 - copied unchanged from r216826, head/tools/regression/bin/sh/expansion/cmdsubst6.0 projects/binutils-2.17/tools/regression/bin/sh/expansion/cmdsubst7.0 - copied unchanged from r216826, head/tools/regression/bin/sh/expansion/cmdsubst7.0 projects/binutils-2.17/tools/regression/bin/sh/expansion/cmdsubst8.0 - copied unchanged from r216826, head/tools/regression/bin/sh/expansion/cmdsubst8.0 projects/binutils-2.17/tools/regression/bin/sh/expansion/cmdsubst9.0 - copied unchanged from r216826, head/tools/regression/bin/sh/expansion/cmdsubst9.0 projects/binutils-2.17/tools/regression/bin/sh/expansion/plus-minus7.0 - copied unchanged from r216826, head/tools/regression/bin/sh/expansion/plus-minus7.0 Deleted: projects/binutils-2.17/sys/dev/cxgb/ulp/tom/cxgb_vm.c projects/binutils-2.17/sys/dev/cxgb/ulp/tom/cxgb_vm.h Modified: projects/binutils-2.17/Makefile projects/binutils-2.17/UPDATING projects/binutils-2.17/bin/sh/eval.c projects/binutils-2.17/bin/sh/exec.c projects/binutils-2.17/bin/sh/expand.c projects/binutils-2.17/bin/sh/expand.h projects/binutils-2.17/bin/sh/histedit.c projects/binutils-2.17/bin/sh/memalloc.c projects/binutils-2.17/bin/sh/memalloc.h projects/binutils-2.17/bin/sh/parser.c projects/binutils-2.17/etc/portsnap.conf projects/binutils-2.17/etc/rc.d/devd projects/binutils-2.17/gnu/lib/libgcc/Makefile projects/binutils-2.17/lib/libc/locale/mbrtowc.3 projects/binutils-2.17/lib/libc/rpc/publickey.3 projects/binutils-2.17/lib/libcompiler_rt/Makefile projects/binutils-2.17/lib/libkvm/kvm_getloadavg.3 projects/binutils-2.17/lib/libthr/thread/thr_mutex.c projects/binutils-2.17/libexec/rtld-elf/Makefile projects/binutils-2.17/libexec/rtld-elf/amd64/reloc.c projects/binutils-2.17/libexec/rtld-elf/arm/reloc.c projects/binutils-2.17/libexec/rtld-elf/i386/reloc.c projects/binutils-2.17/libexec/rtld-elf/ia64/reloc.c projects/binutils-2.17/libexec/rtld-elf/mips/reloc.c projects/binutils-2.17/libexec/rtld-elf/powerpc/reloc.c projects/binutils-2.17/libexec/rtld-elf/powerpc64/reloc.c projects/binutils-2.17/libexec/rtld-elf/powerpc64/rtld_start.S projects/binutils-2.17/libexec/rtld-elf/rtld.1 projects/binutils-2.17/libexec/rtld-elf/rtld.c projects/binutils-2.17/libexec/rtld-elf/rtld.h projects/binutils-2.17/libexec/rtld-elf/rtld_lock.c projects/binutils-2.17/libexec/rtld-elf/rtld_lock.h projects/binutils-2.17/libexec/rtld-elf/sparc64/reloc.c projects/binutils-2.17/sbin/dumpfs/dumpfs.c projects/binutils-2.17/sbin/hastd/parse.y projects/binutils-2.17/sbin/mount_nfs/mount_nfs.c projects/binutils-2.17/sbin/newfs/mkfs.c projects/binutils-2.17/sbin/newfs/newfs.8 projects/binutils-2.17/sbin/newfs/newfs.c projects/binutils-2.17/sbin/newfs/newfs.h projects/binutils-2.17/sbin/shutdown/Makefile projects/binutils-2.17/sbin/shutdown/shutdown.8 projects/binutils-2.17/sbin/shutdown/shutdown.c projects/binutils-2.17/sbin/tunefs/tunefs.8 projects/binutils-2.17/sbin/tunefs/tunefs.c projects/binutils-2.17/share/examples/etc/make.conf projects/binutils-2.17/share/mk/bsd.cpu.mk projects/binutils-2.17/sys/compat/linux/linux_ioctl.c projects/binutils-2.17/sys/compat/linux/linux_ioctl.h projects/binutils-2.17/sys/conf/kern.pre.mk projects/binutils-2.17/sys/conf/makeLINT.mk projects/binutils-2.17/sys/dev/cxgb/ulp/tom/cxgb_cpl_socket.c projects/binutils-2.17/sys/dev/cxgb/ulp/tom/cxgb_ddp.c projects/binutils-2.17/sys/dev/drm/via_dmablit.c projects/binutils-2.17/sys/dev/md/md.c projects/binutils-2.17/sys/dev/mpt/mpt_pci.c projects/binutils-2.17/sys/dev/sound/pci/hda/hdac.c projects/binutils-2.17/sys/dev/wpi/if_wpi.c projects/binutils-2.17/sys/dev/xen/console/console.c projects/binutils-2.17/sys/fs/nfs/nfs.h projects/binutils-2.17/sys/fs/nfs/nfs_commonsubs.c projects/binutils-2.17/sys/fs/nfs/nfs_var.h projects/binutils-2.17/sys/fs/nfsserver/nfs_nfsdport.c projects/binutils-2.17/sys/fs/nfsserver/nfs_nfsdserv.c projects/binutils-2.17/sys/fs/nfsserver/nfs_nfsdsocket.c projects/binutils-2.17/sys/geom/geom_disk.c projects/binutils-2.17/sys/geom/part/g_part_ebr.c projects/binutils-2.17/sys/i386/conf/XBOX projects/binutils-2.17/sys/i386/conf/XEN projects/binutils-2.17/sys/i386/xen/pmap.c projects/binutils-2.17/sys/kern/kern_resource.c projects/binutils-2.17/sys/kern/kern_timeout.c projects/binutils-2.17/sys/kern/kern_umtx.c projects/binutils-2.17/sys/kern/sched_4bsd.c projects/binutils-2.17/sys/kern/sched_ule.c projects/binutils-2.17/sys/kern/sys_pipe.c projects/binutils-2.17/sys/kern/uipc_cow.c projects/binutils-2.17/sys/kern/vfs_bio.c projects/binutils-2.17/sys/kern/vfs_subr.c projects/binutils-2.17/sys/mips/cavium/octeon_machdep.c projects/binutils-2.17/sys/net/bpf_zerocopy.c projects/binutils-2.17/sys/netinet/in_pcb.c projects/binutils-2.17/sys/netinet/sctp_asconf.c projects/binutils-2.17/sys/netinet/sctp_bsd_addr.c projects/binutils-2.17/sys/netinet/sctp_constants.h projects/binutils-2.17/sys/netinet/sctp_indata.c projects/binutils-2.17/sys/netinet/sctp_input.c projects/binutils-2.17/sys/netinet/sctp_output.c projects/binutils-2.17/sys/netinet/sctp_pcb.c projects/binutils-2.17/sys/netinet/sctp_timer.c projects/binutils-2.17/sys/netinet/sctp_usrreq.c projects/binutils-2.17/sys/netinet/sctputil.c projects/binutils-2.17/sys/netinet/tcp_input.c projects/binutils-2.17/sys/netinet/tcp_output.c projects/binutils-2.17/sys/netinet/tcp_sack.c projects/binutils-2.17/sys/netinet/tcp_subr.c projects/binutils-2.17/sys/netinet/tcp_var.h projects/binutils-2.17/sys/nfsserver/nfs_serv.c projects/binutils-2.17/sys/powerpc/aim/moea64_native.c projects/binutils-2.17/sys/sparc64/include/asmacros.h projects/binutils-2.17/sys/sparc64/include/cpufunc.h projects/binutils-2.17/sys/sparc64/include/pmap.h projects/binutils-2.17/sys/sparc64/include/tsb.h projects/binutils-2.17/sys/sparc64/sparc64/exception.S projects/binutils-2.17/sys/sparc64/sparc64/genassym.c projects/binutils-2.17/sys/sparc64/sparc64/mp_machdep.c projects/binutils-2.17/sys/sparc64/sparc64/pmap.c projects/binutils-2.17/sys/sparc64/sparc64/support.S projects/binutils-2.17/sys/sparc64/sparc64/tsb.c projects/binutils-2.17/sys/sys/param.h projects/binutils-2.17/sys/sys/sched.h projects/binutils-2.17/sys/ufs/ffs/ffs_alloc.c projects/binutils-2.17/sys/ufs/ffs/ffs_softdep.c projects/binutils-2.17/sys/ufs/ffs/ffs_vfsops.c projects/binutils-2.17/sys/ufs/ffs/fs.h projects/binutils-2.17/sys/ufs/ffs/softdep.h projects/binutils-2.17/sys/ufs/ufs/ufs_inode.c projects/binutils-2.17/sys/ufs/ufs/ufs_vnops.c projects/binutils-2.17/sys/ufs/ufs/ufsmount.h projects/binutils-2.17/sys/vm/vm_contig.c projects/binutils-2.17/sys/vm/vm_extern.h projects/binutils-2.17/sys/vm/vm_fault.c projects/binutils-2.17/sys/vm/vm_object.c projects/binutils-2.17/sys/vm/vm_object.h projects/binutils-2.17/sys/vm/vm_page.c projects/binutils-2.17/sys/xen/evtchn/evtchn.c projects/binutils-2.17/tools/regression/bin/sh/expansion/plus-minus1.0 projects/binutils-2.17/usr.bin/ar/ar.1 projects/binutils-2.17/usr.bin/c89/c89.1 projects/binutils-2.17/usr.bin/c99/c99.1 projects/binutils-2.17/usr.bin/calendar/calendar.1 projects/binutils-2.17/usr.bin/calendar/calendar.h projects/binutils-2.17/usr.bin/calendar/parsedata.c projects/binutils-2.17/usr.bin/gcore/gcore.1 projects/binutils-2.17/usr.bin/lock/lock.c projects/binutils-2.17/usr.bin/mail/mail.1 projects/binutils-2.17/usr.bin/printf/printf.c projects/binutils-2.17/usr.bin/tar/bsdtar.1 projects/binutils-2.17/usr.sbin/ancontrol/ancontrol.8 Directory Properties: projects/binutils-2.17/ (props changed) projects/binutils-2.17/cddl/contrib/opensolaris/ (props changed) projects/binutils-2.17/contrib/bind9/ (props changed) projects/binutils-2.17/contrib/binutils/ (props changed) projects/binutils-2.17/contrib/bzip2/ (props changed) projects/binutils-2.17/contrib/ee/ (props changed) projects/binutils-2.17/contrib/expat/ (props changed) projects/binutils-2.17/contrib/file/ (props changed) projects/binutils-2.17/contrib/gdb/ (props changed) projects/binutils-2.17/contrib/gdtoa/ (props changed) projects/binutils-2.17/contrib/gnu-sort/ (props changed) projects/binutils-2.17/contrib/groff/ (props changed) projects/binutils-2.17/contrib/less/ (props changed) projects/binutils-2.17/contrib/libpcap/ (props changed) projects/binutils-2.17/contrib/llvm/ (props changed) projects/binutils-2.17/contrib/llvm/tools/clang/ (props changed) projects/binutils-2.17/contrib/ncurses/ (props changed) projects/binutils-2.17/contrib/netcat/ (props changed) projects/binutils-2.17/contrib/ntp/ (props changed) projects/binutils-2.17/contrib/one-true-awk/ (props changed) projects/binutils-2.17/contrib/openbsm/ (props changed) projects/binutils-2.17/contrib/openpam/ (props changed) projects/binutils-2.17/contrib/pf/ (props changed) projects/binutils-2.17/contrib/sendmail/ (props changed) projects/binutils-2.17/contrib/tcpdump/ (props changed) projects/binutils-2.17/contrib/tcsh/ (props changed) projects/binutils-2.17/contrib/top/ (props changed) projects/binutils-2.17/contrib/top/install-sh (props changed) projects/binutils-2.17/contrib/tzcode/stdtime/ (props changed) projects/binutils-2.17/contrib/tzcode/zic/ (props changed) projects/binutils-2.17/contrib/tzdata/ (props changed) projects/binutils-2.17/contrib/wpa/ (props changed) projects/binutils-2.17/contrib/xz/ (props changed) projects/binutils-2.17/crypto/openssh/ (props changed) projects/binutils-2.17/crypto/openssl/ (props changed) projects/binutils-2.17/lib/libc/ (props changed) projects/binutils-2.17/lib/libc/stdtime/ (props changed) projects/binutils-2.17/lib/libutil/ (props changed) projects/binutils-2.17/lib/libz/ (props changed) projects/binutils-2.17/sbin/ (props changed) projects/binutils-2.17/sbin/ipfw/ (props changed) projects/binutils-2.17/share/mk/bsd.arch.inc.mk (props changed) projects/binutils-2.17/share/zoneinfo/ (props changed) projects/binutils-2.17/sys/ (props changed) projects/binutils-2.17/sys/amd64/include/xen/ (props changed) projects/binutils-2.17/sys/cddl/contrib/opensolaris/ (props changed) projects/binutils-2.17/sys/contrib/dev/acpica/ (props changed) projects/binutils-2.17/sys/contrib/octeon-sdk/ (props changed) projects/binutils-2.17/sys/contrib/pf/ (props changed) projects/binutils-2.17/sys/contrib/x86emu/ (props changed) projects/binutils-2.17/usr.bin/calendar/ (props changed) projects/binutils-2.17/usr.bin/csup/ (props changed) projects/binutils-2.17/usr.bin/procstat/ (props changed) projects/binutils-2.17/usr.sbin/zic/ (props changed) Modified: projects/binutils-2.17/Makefile ============================================================================== --- projects/binutils-2.17/Makefile Thu Dec 30 22:33:55 2010 (r216826) +++ projects/binutils-2.17/Makefile Thu Dec 30 23:35:23 2010 (r216827) @@ -350,8 +350,8 @@ KERNCONFS!= cd ${.CURDIR}/sys/${TARGET}/ universe_kernconfs: .for kernel in ${KERNCONFS} TARGET_ARCH_${kernel}!= cd ${.CURDIR}/sys/${TARGET}/conf && \ - config -m ${.CURDIR}/sys/${TARGET}/conf/${kernel} | \ - cut -f 2 + config -m ${.CURDIR}/sys/${TARGET}/conf/${kernel} 2> /dev/null | \ + cut -f 2 universe_kernconfs: universe_kernconf_${TARGET}_${kernel} universe_kernconf_${TARGET}_${kernel}: @(cd ${.CURDIR} && env __MAKE_CONF=/dev/null \ Modified: projects/binutils-2.17/UPDATING ============================================================================== --- projects/binutils-2.17/UPDATING Thu Dec 30 22:33:55 2010 (r216826) +++ projects/binutils-2.17/UPDATING Thu Dec 30 23:35:23 2010 (r216827) @@ -22,6 +22,13 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 9. machines to maximize performance. (To disable malloc debugging, run ln -s aj /etc/malloc.conf.) +20101228: + The TCP stack has been modified to allow Khelp modules to interact with + it via helper hook points and store per-connection data in the TCP + control block. Bump __FreeBSD_version to 900029. User space tools that + rely on the size of struct tcpcb in tcp_var.h (e.g. sockstat) need to + be recompiled. + 20101114: Generic IEEE 802.3 annex 31B full duplex flow control support has been added to mii(4) and bge(4), bce(4), msk(4), nfe(4) and stge(4) along Modified: projects/binutils-2.17/bin/sh/eval.c ============================================================================== --- projects/binutils-2.17/bin/sh/eval.c Thu Dec 30 22:33:55 2010 (r216826) +++ projects/binutils-2.17/bin/sh/eval.c Thu Dec 30 23:35:23 2010 (r216827) @@ -94,6 +94,7 @@ static void evalsubshell(union node *, i static void evalredir(union node *, int); static void expredir(union node *); static void evalpipe(union node *); +static int is_valid_fast_cmdsubst(union node *n); static void evalcommand(union node *, int, struct backcmd *); static void prehash(union node *); @@ -565,6 +566,19 @@ evalpipe(union node *n) +static int +is_valid_fast_cmdsubst(union node *n) +{ + union node *argp; + + if (n->type != NCMD) + return 0; + for (argp = n->ncmd.args ; argp ; argp = argp->narg.next) + if (expandhassideeffects(argp->narg.text)) + return 0; + return 1; +} + /* * Execute a command inside back quotes. If it's a builtin command, we * want to save its output in a block obtained from malloc. Otherwise @@ -578,6 +592,8 @@ evalbackcmd(union node *n, struct backcm int pip[2]; struct job *jp; struct stackmark smark; /* unnecessary */ + struct jmploc jmploc; + struct jmploc *savehandler; setstackmark(&smark); result->fd = -1; @@ -588,9 +604,21 @@ evalbackcmd(union node *n, struct backcm exitstatus = 0; goto out; } - if (n->type == NCMD) { + if (is_valid_fast_cmdsubst(n)) { exitstatus = oexitstatus; - evalcommand(n, EV_BACKCMD, result); + savehandler = handler; + if (setjmp(jmploc.loc)) { + if (exception == EXERROR || exception == EXEXEC) + exitstatus = 2; + else if (exception != 0) { + handler = savehandler; + longjmp(handler->loc, 1); + } + } else { + handler = &jmploc; + evalcommand(n, EV_BACKCMD, result); + } + handler = savehandler; } else { exitstatus = 0; if (pipe(pip) < 0) @@ -615,7 +643,31 @@ out: result->fd, result->buf, result->nleft, result->jp)); } - +/* + * Check if a builtin can safely be executed in the same process, + * even though it should be in a subshell (command substitution). + * Note that jobid, jobs, times and trap can show information not + * available in a child process; this is deliberate. + * The arguments should already have been expanded. + */ +static int +safe_builtin(int idx, int argc, char **argv) +{ + if (idx == BLTINCMD || idx == COMMANDCMD || idx == ECHOCMD || + idx == FALSECMD || idx == JOBIDCMD || idx == JOBSCMD || + idx == KILLCMD || idx == PRINTFCMD || idx == PWDCMD || + idx == TESTCMD || idx == TIMESCMD || idx == TRUECMD || + idx == TYPECMD) + return (1); + if (idx == EXPORTCMD || idx == TRAPCMD || idx == ULIMITCMD || + idx == UMASKCMD) + return (argc <= 1 || (argc == 2 && argv[1][0] == '-')); + if (idx == SETCMD) + return (argc <= 1 || (argc == 2 && (argv[1][0] == '-' || + argv[1][0] == '+') && argv[1][1] == 'o' && + argv[1][2] == '\0')); + return (0); +} /* * Execute a simple command. @@ -833,10 +885,8 @@ evalcommand(union node *cmd, int flags, || ((cmdentry.cmdtype == CMDNORMAL || cmdentry.cmdtype == CMDUNKNOWN) && ((flags & EV_EXIT) == 0 || have_traps())) || ((flags & EV_BACKCMD) != 0 - && (cmdentry.cmdtype != CMDBUILTIN - || cmdentry.u.index == CDCMD - || cmdentry.u.index == DOTCMD - || cmdentry.u.index == EVALCMD))) { + && (cmdentry.cmdtype != CMDBUILTIN || + !safe_builtin(cmdentry.u.index, argc, argv)))) { jp = makejob(cmd, 1); mode = cmd->ncmd.backgnd; if (flags & EV_BACKCMD) { Modified: projects/binutils-2.17/bin/sh/exec.c ============================================================================== --- projects/binutils-2.17/bin/sh/exec.c Thu Dec 30 22:33:55 2010 (r216826) +++ projects/binutils-2.17/bin/sh/exec.c Thu Dec 30 23:35:23 2010 (r216827) @@ -190,9 +190,8 @@ padvance(const char **path, const char * for (p = start; *p && *p != ':' && *p != '%'; p++) ; /* nothing */ len = p - start + strlen(name) + 2; /* "2" is for '/' and '\0' */ - while (stackblocksize() < len) - growstackblock(); - q = stackblock(); + STARTSTACKSTR(q); + CHECKSTRSPACE(len, q); if (p != start) { memcpy(q, start, p - start); q += p - start; Modified: projects/binutils-2.17/bin/sh/expand.c ============================================================================== --- projects/binutils-2.17/bin/sh/expand.c Thu Dec 30 22:33:55 2010 (r216826) +++ projects/binutils-2.17/bin/sh/expand.c Thu Dec 30 23:35:23 2010 (r216827) @@ -502,13 +502,14 @@ expbackq(union node *cmd, int quoted, in if (lastc == '\n') { nnl++; } else { + CHECKSTRSPACE(nnl + 2, dest); while (nnl > 0) { nnl--; - STPUTC('\n', dest); + USTPUTC('\n', dest); } if (quotes && syntax[(int)lastc] == CCTL) - STPUTC(CTLESC, dest); - STPUTC(lastc, dest); + USTPUTC(CTLESC, dest); + USTPUTC(lastc, dest); } } } @@ -1569,6 +1570,78 @@ cvtnum(int num, char *buf) } /* + * Check statically if expanding a string may have side effects. + */ +int +expandhassideeffects(const char *p) +{ + int c; + int arinest; + + arinest = 0; + while ((c = *p++) != '\0') { + switch (c) { + case CTLESC: + p++; + break; + case CTLVAR: + c = *p++; + /* Expanding $! sets the job to remembered. */ + if (*p == '!') + return 1; + if ((c & VSTYPE) == VSASSIGN) + return 1; + /* + * If we are in arithmetic, the parameter may contain + * '=' which may cause side effects. Exceptions are + * the length of a parameter and $$, $# and $? which + * are always numeric. + */ + if ((c & VSTYPE) == VSLENGTH) { + while (*p != '=') + p++; + p++; + break; + } + if ((*p == '$' || *p == '#' || *p == '?') && + p[1] == '=') { + p += 2; + break; + } + if (arinest > 0) + return 1; + break; + case CTLBACKQ: + case CTLBACKQ | CTLQUOTE: + if (arinest > 0) + return 1; + break; + case CTLARI: + arinest++; + break; + case CTLENDARI: + arinest--; + break; + case '=': + if (*p == '=') { + /* Allow '==' operator. */ + p++; + continue; + } + if (arinest > 0) + return 1; + break; + case '!': case '<': case '>': + /* Allow '!=', '<=', '>=' operators. */ + if (*p == '=') + p++; + break; + } + } + return 0; +} + +/* * Do most of the work for wordexp(3). */ Modified: projects/binutils-2.17/bin/sh/expand.h ============================================================================== --- projects/binutils-2.17/bin/sh/expand.h Thu Dec 30 22:33:55 2010 (r216826) +++ projects/binutils-2.17/bin/sh/expand.h Thu Dec 30 23:35:23 2010 (r216827) @@ -63,4 +63,5 @@ void expari(int); int patmatch(const char *, const char *, int); void rmescapes(char *); int casematch(union node *, const char *); +int expandhassideeffects(const char *); int wordexpcmd(int, char **); Modified: projects/binutils-2.17/bin/sh/histedit.c ============================================================================== --- projects/binutils-2.17/bin/sh/histedit.c Thu Dec 30 22:33:55 2010 (r216826) +++ projects/binutils-2.17/bin/sh/histedit.c Thu Dec 30 23:35:23 2010 (r216827) @@ -232,6 +232,7 @@ histcmd(int argc, char **argv) } argc -= optind, argv += optind; + savehandler = handler; /* * If executing... */ @@ -242,7 +243,6 @@ histcmd(int argc, char **argv) * Catch interrupts to reset active counter and * cleanup temp files. */ - savehandler = handler; if (setjmp(jmploc.loc)) { active = 0; if (editfile) @@ -399,6 +399,7 @@ histcmd(int argc, char **argv) --active; if (displayhist) displayhist = 0; + handler = savehandler; return 0; } Modified: projects/binutils-2.17/bin/sh/memalloc.c ============================================================================== --- projects/binutils-2.17/bin/sh/memalloc.c Thu Dec 30 22:33:55 2010 (r216826) +++ projects/binutils-2.17/bin/sh/memalloc.c Thu Dec 30 23:35:23 2010 (r216827) @@ -127,7 +127,7 @@ static struct stack_block *stackp; static struct stackmark *markp; char *stacknxt; int stacknleft; -int sstrnleft; +char *sstrend; static void @@ -146,6 +146,7 @@ stnewblock(int nbytes) sp->prev = stackp; stacknxt = SPACE(sp); stacknleft = allocsize - (stacknxt - (char*)sp); + sstrend = stacknxt + stacknleft; stackp = sp; INTON; } @@ -204,6 +205,7 @@ popstackmark(struct stackmark *mark) } stacknxt = mark->stacknxt; stacknleft = mark->stacknleft; + sstrend = stacknxt + stacknleft; INTON; } @@ -218,8 +220,8 @@ popstackmark(struct stackmark *mark) * part of the block that has been used. */ -void -growstackblock(void) +static void +growstackblock(int min) { char *p; int newlen; @@ -229,8 +231,15 @@ growstackblock(void) struct stack_block *oldstackp; struct stackmark *xmark; - newlen = (stacknleft == 0) ? MINSIZE : stacknleft * 2 + 100; - newlen = ALIGN(newlen); + if (min < stacknleft) + min = stacknleft; + if (min >= INT_MAX / 2 - ALIGN(sizeof(struct stack_block))) + error("Out of space"); + min += stacknleft; + min += ALIGN(sizeof(struct stack_block)); + newlen = 512; + while (newlen < min) + newlen <<= 1; oldspace = stacknxt; oldlen = stacknleft; @@ -243,6 +252,7 @@ growstackblock(void) stackp = sp; stacknxt = SPACE(sp); stacknleft = newlen - (stacknxt - (char*)sp); + sstrend = stacknxt + stacknleft; /* * Stack marks pointing to the start of the old block @@ -257,6 +267,7 @@ growstackblock(void) } INTON; } else { + newlen -= ALIGN(sizeof(struct stack_block)); p = stalloc(newlen); if (oldlen != 0) memcpy(p, oldspace, oldlen); @@ -295,10 +306,9 @@ grabstackblock(int len) */ static char * -growstrstackblock(int n) +growstrstackblock(int n, int min) { - growstackblock(); - sstrnleft = stackblocksize() - n; + growstackblock(min); return stackblock() + n; } @@ -308,7 +318,7 @@ growstackstr(void) int len; len = stackblocksize(); - return growstrstackblock(len); + return (growstrstackblock(len, 0)); } @@ -317,33 +327,21 @@ growstackstr(void) */ char * -makestrspace(void) +makestrspace(int min, char *p) { int len; - len = stackblocksize() - sstrnleft; - return growstrstackblock(len); -} - - - -void -ungrabstackstr(char *s, char *p) -{ - stacknleft += stacknxt - s; - stacknxt = s; - sstrnleft = stacknleft - (p - s); + len = p - stackblock(); + return (growstrstackblock(len, min)); } char * stputbin(const char *data, int len, char *p) { - int i; - - for (i = 0; i < len; i++) - STPUTC(data[i], p); - return (p); + CHECKSTRSPACE(len, p); + memcpy(p, data, len); + return (p + len); } char * Modified: projects/binutils-2.17/bin/sh/memalloc.h ============================================================================== --- projects/binutils-2.17/bin/sh/memalloc.h Thu Dec 30 22:33:55 2010 (r216826) +++ projects/binutils-2.17/bin/sh/memalloc.h Thu Dec 30 23:35:23 2010 (r216827) @@ -45,7 +45,7 @@ struct stackmark { extern char *stacknxt; extern int stacknleft; -extern int sstrnleft; +extern char *sstrend; pointer ckmalloc(size_t); pointer ckrealloc(pointer, int); @@ -55,11 +55,9 @@ pointer stalloc(int); void stunalloc(pointer); void setstackmark(struct stackmark *); void popstackmark(struct stackmark *); -void growstackblock(void); void grabstackblock(int); char *growstackstr(void); -char *makestrspace(void); -void ungrabstackstr(char *, char *); +char *makestrspace(int, char *); char *stputbin(const char *data, int len, char *p); char *stputs(const char *data, char *p); @@ -67,10 +65,10 @@ char *stputs(const char *data, char *p); #define stackblock() stacknxt #define stackblocksize() stacknleft -#define STARTSTACKSTR(p) p = stackblock(), sstrnleft = stackblocksize() -#define STPUTC(c, p) (--sstrnleft >= 0? (*p++ = (c)) : (p = growstackstr(), --sstrnleft, *p++ = (c))) -#define CHECKSTRSPACE(n, p) { if (sstrnleft < n) p = makestrspace(); } -#define USTPUTC(c, p) (--sstrnleft, *p++ = (c)) +#define STARTSTACKSTR(p) p = stackblock() +#define STPUTC(c, p) do { if (p == sstrend) p = growstackstr(); *p++ = (c); } while(0) +#define CHECKSTRSPACE(n, p) { if (sstrend - p < n) p = makestrspace(n, p); } +#define USTPUTC(c, p) (*p++ = (c)) /* * STACKSTRNUL's use is where we want to be able to turn a stack * (non-sentinel, character counting string) into a C string, @@ -78,10 +76,11 @@ char *stputs(const char *data, char *p); * Note: Because of STACKSTRNUL's semantics, STACKSTRNUL cannot be used * on a stack that will grabstackstr()ed. */ -#define STACKSTRNUL(p) (sstrnleft == 0? (p = growstackstr(), *p = '\0') : (*p = '\0')) -#define STUNPUTC(p) (++sstrnleft, --p) +#define STACKSTRNUL(p) (p == sstrend ? (p = growstackstr(), *p = '\0') : (*p = '\0')) +#define STUNPUTC(p) (--p) #define STTOPC(p) p[-1] -#define STADJUST(amount, p) (p += (amount), sstrnleft -= (amount)) -#define grabstackstr(p) stalloc(stackblocksize() - sstrnleft) +#define STADJUST(amount, p) (p += (amount)) +#define grabstackstr(p) stalloc((char *)p - stackblock()) +#define ungrabstackstr(s, p) stunalloc((s)) #define STPUTBIN(s, len, p) p = stputbin((s), (len), p) #define STPUTS(s, p) p = stputs((s), p) Modified: projects/binutils-2.17/bin/sh/parser.c ============================================================================== --- projects/binutils-2.17/bin/sh/parser.c Thu Dec 30 22:33:55 2010 (r216826) +++ projects/binutils-2.17/bin/sh/parser.c Thu Dec 30 23:35:23 2010 (r216827) @@ -1093,9 +1093,8 @@ done: popfile(); tokpushback = 0; } - while (stackblocksize() <= savelen) - growstackblock(); STARTSTACKSTR(out); + CHECKSTRSPACE(savelen + 1, out); INTOFF; if (str) { memcpy(out, str, savelen); Modified: projects/binutils-2.17/etc/portsnap.conf ============================================================================== --- projects/binutils-2.17/etc/portsnap.conf Thu Dec 30 22:33:55 2010 (r216826) +++ projects/binutils-2.17/etc/portsnap.conf Thu Dec 30 23:35:23 2010 (r216827) @@ -30,6 +30,5 @@ KEYPRINT=9b5feee6d69f170e3dd0a2c8e469ddb # REFUSE korean polish portuguese russian ukrainian vietnamese # List of INDEX files to build and the DESCRIBE file to use for each -INDEX INDEX-6 DESCRIBE.6 INDEX INDEX-7 DESCRIBE.7 INDEX INDEX-8 DESCRIBE.8 Modified: projects/binutils-2.17/etc/rc.d/devd ============================================================================== --- projects/binutils-2.17/etc/rc.d/devd Thu Dec 30 22:33:55 2010 (r216826) +++ projects/binutils-2.17/etc/rc.d/devd Thu Dec 30 23:35:23 2010 (r216827) @@ -13,11 +13,17 @@ name="devd" rcvar=`set_rcvar` command="/sbin/${name}" +pidfile=/var/run/${name}.pid + +start_precmd=${name}_prestart + +devd_prestart () +{ + # If devd is disabled, turn it off in the kernel to avoid memory leaks. + if ! checkyesno ${rcvar}; then + $SYSCTL hw.bus.devctl_disable=1 + fi +} load_rc_config $name run_rc_command "$1" - -# If devd is disabled, turn it off in the kernel to avoid memory leaks. -if ! checkyesno ${rcvar}; then - sysctl hw.bus.devctl_disable=1 -fi Modified: projects/binutils-2.17/gnu/lib/libgcc/Makefile ============================================================================== --- projects/binutils-2.17/gnu/lib/libgcc/Makefile Thu Dec 30 22:33:55 2010 (r216826) +++ projects/binutils-2.17/gnu/lib/libgcc/Makefile Thu Dec 30 23:35:23 2010 (r216827) @@ -15,7 +15,7 @@ MK_SSP= no .include "${.CURDIR}/../../usr.bin/cc/Makefile.tgt" -.if ${TARGET_CPUARCH} == "sparc64" +.if ${TARGET_CPUARCH} == "sparc64" || ${TARGET_CPUARCH} == "mips" LIB= gcc .endif Modified: projects/binutils-2.17/lib/libc/locale/mbrtowc.3 ============================================================================== --- projects/binutils-2.17/lib/libc/locale/mbrtowc.3 Thu Dec 30 22:33:55 2010 (r216826) +++ projects/binutils-2.17/lib/libc/locale/mbrtowc.3 Thu Dec 30 23:35:23 2010 (r216827) @@ -69,7 +69,7 @@ was .Dv NULL , .Fa s was an empty string -.Pq Qq \& +.Pq Qq and .Fa n was 1. Modified: projects/binutils-2.17/lib/libc/rpc/publickey.3 ============================================================================== --- projects/binutils-2.17/lib/libc/rpc/publickey.3 Thu Dec 30 22:33:55 2010 (r216826) +++ projects/binutils-2.17/lib/libc/rpc/publickey.3 Thu Dec 30 23:35:23 2010 (r216827) @@ -44,7 +44,7 @@ fails to decrypt the secret key, the rou argument will be a .Dv NULL string -.Pq Dq \& . +.Pq Dq . .Sh SEE ALSO .Xr publickey 5 .Pp Modified: projects/binutils-2.17/lib/libcompiler_rt/Makefile ============================================================================== --- projects/binutils-2.17/lib/libcompiler_rt/Makefile Thu Dec 30 22:33:55 2010 (r216826) +++ projects/binutils-2.17/lib/libcompiler_rt/Makefile Thu Dec 30 23:35:23 2010 (r216827) @@ -147,7 +147,7 @@ SRCS+= ${file}.c . endif .endfor -.if ${MACHINE_CPUARCH} != "sparc64" +.if ${MACHINE_CPUARCH} != "sparc64" && ${MACHINE_CPUARCH} != "mips" . if ${MK_INSTALLLIB} != "no" SYMLINKS+=libcompiler_rt.a ${LIBDIR}/libgcc.a . endif Modified: projects/binutils-2.17/lib/libkvm/kvm_getloadavg.3 ============================================================================== --- projects/binutils-2.17/lib/libkvm/kvm_getloadavg.3 Thu Dec 30 22:33:55 2010 (r216826) +++ projects/binutils-2.17/lib/libkvm/kvm_getloadavg.3 Thu Dec 30 23:35:23 2010 (r216827) @@ -50,7 +50,7 @@ averaged over various periods of time. Up to .Fa nelem samples are retrieved and assigned to successive elements of -.Fa loadavg Ns Bq \& . +.Fa loadavg Ns Bq . The system imposes a maximum of 3 samples, representing averages over the last 1, 5, and 15 minutes, respectively. .Sh DIAGNOSTICS Modified: projects/binutils-2.17/lib/libthr/thread/thr_mutex.c ============================================================================== --- projects/binutils-2.17/lib/libthr/thread/thr_mutex.c Thu Dec 30 22:33:55 2010 (r216826) +++ projects/binutils-2.17/lib/libthr/thread/thr_mutex.c Thu Dec 30 23:35:23 2010 (r216827) @@ -653,7 +653,7 @@ mutex_unlock_common(struct pthread_mutex m->m_count > 0)) { m->m_count--; } else { - if (curthread->will_sleep == 0 && (m->m_flags & PMUTEX_FLAG_DEFERED) != 0) { + if ((m->m_flags & PMUTEX_FLAG_DEFERED) != 0) { defered = 1; m->m_flags &= ~PMUTEX_FLAG_DEFERED; } else @@ -662,7 +662,7 @@ mutex_unlock_common(struct pthread_mutex DEQUEUE_MUTEX(curthread, m); _thr_umutex_unlock(&m->m_lock, id); - if (defered) { + if (curthread->will_sleep == 0 && defered) { _thr_wake_all(curthread->defer_waiters, curthread->nwaiter_defer); curthread->nwaiter_defer = 0; Modified: projects/binutils-2.17/libexec/rtld-elf/Makefile ============================================================================== --- projects/binutils-2.17/libexec/rtld-elf/Makefile Thu Dec 30 22:33:55 2010 (r216826) +++ projects/binutils-2.17/libexec/rtld-elf/Makefile Thu Dec 30 23:35:23 2010 (r216827) @@ -34,7 +34,7 @@ CFLAGS+= -fPIC .else CFLAGS+= -fpic .endif -CFLAGS+= -DPIC +CFLAGS+= -DPIC $(DEBUG) LDFLAGS+= -shared -Wl,-Bsymbolic DPADD= ${LIBC_PIC} LDADD= -lc_pic -lssp_nonshared Modified: projects/binutils-2.17/libexec/rtld-elf/amd64/reloc.c ============================================================================== --- projects/binutils-2.17/libexec/rtld-elf/amd64/reloc.c Thu Dec 30 22:33:55 2010 (r216826) +++ projects/binutils-2.17/libexec/rtld-elf/amd64/reloc.c Thu Dec 30 23:35:23 2010 (r216827) @@ -69,23 +69,28 @@ do_copy_relocations(Obj_Entry *dstobj) void *dstaddr; const Elf_Sym *dstsym; const char *name; - unsigned long hash; size_t size; const void *srcaddr; const Elf_Sym *srcsym; - Obj_Entry *srcobj; - const Ver_Entry *ve; + const Obj_Entry *srcobj, *defobj; + SymLook req; + int res; dstaddr = (void *) (dstobj->relocbase + rela->r_offset); dstsym = dstobj->symtab + ELF_R_SYM(rela->r_info); name = dstobj->strtab + dstsym->st_name; - hash = elf_hash(name); size = dstsym->st_size; - ve = fetch_ventry(dstobj, ELF_R_SYM(rela->r_info)); + symlook_init(&req, name); + req.ventry = fetch_ventry(dstobj, ELF_R_SYM(rela->r_info)); - for (srcobj = dstobj->next; srcobj != NULL; srcobj = srcobj->next) - if ((srcsym = symlook_obj(name, hash, srcobj, ve, 0)) != NULL) + for (srcobj = dstobj->next; srcobj != NULL; srcobj = srcobj->next) { + res = symlook_obj(&req, srcobj); + if (res == 0) { + srcsym = req.sym_out; + defobj = req.defobj_out; break; + } + } if (srcobj == NULL) { _rtld_error("Undefined symbol \"%s\" referenced from COPY" @@ -93,7 +98,7 @@ do_copy_relocations(Obj_Entry *dstobj) return -1; } - srcaddr = (const void *) (srcobj->relocbase + srcsym->st_value); + srcaddr = (const void *) (defobj->relocbase + srcsym->st_value); memcpy(dstaddr, srcaddr, size); } } @@ -113,7 +118,7 @@ init_pltgot(Obj_Entry *obj) /* Process the non-PLT relocations. */ int -reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld) +reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld, RtldLockState *lockstate) { const Elf_Rela *relalim; const Elf_Rela *rela; @@ -146,7 +151,7 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry const Obj_Entry *defobj; def = find_symdef(ELF_R_SYM(rela->r_info), obj, &defobj, - false, cache); + false, cache, lockstate); if (def == NULL) goto done; @@ -165,7 +170,7 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry const Obj_Entry *defobj; def = find_symdef(ELF_R_SYM(rela->r_info), obj, &defobj, - false, cache); + false, cache, lockstate); if (def == NULL) goto done; @@ -195,7 +200,7 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry const Obj_Entry *defobj; def = find_symdef(ELF_R_SYM(rela->r_info), obj, &defobj, - false, cache); + false, cache, lockstate); if (def == NULL) goto done; @@ -209,7 +214,7 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry const Obj_Entry *defobj; def = find_symdef(ELF_R_SYM(rela->r_info), obj, &defobj, - false, cache); + false, cache, lockstate); if (def == NULL) goto done; @@ -240,7 +245,7 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry const Obj_Entry *defobj; def = find_symdef(ELF_R_SYM(rela->r_info), obj, &defobj, - false, cache); + false, cache, lockstate); if (def == NULL) goto done; @@ -272,7 +277,7 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry const Obj_Entry *defobj; def = find_symdef(ELF_R_SYM(rela->r_info), obj, &defobj, - false, cache); + false, cache, lockstate); if (def == NULL) goto done; @@ -286,7 +291,7 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry const Obj_Entry *defobj; def = find_symdef(ELF_R_SYM(rela->r_info), obj, &defobj, - false, cache); + false, cache, lockstate); if (def == NULL) goto done; @@ -300,7 +305,7 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry const Obj_Entry *defobj; def = find_symdef(ELF_R_SYM(rela->r_info), obj, &defobj, - false, cache); + false, cache, lockstate); if (def == NULL) goto done; @@ -350,7 +355,7 @@ reloc_plt(Obj_Entry *obj) /* Relocate the jump slots in an object. */ int -reloc_jmpslots(Obj_Entry *obj) +reloc_jmpslots(Obj_Entry *obj, RtldLockState *lockstate) { const Elf_Rela *relalim; const Elf_Rela *rela; @@ -365,7 +370,8 @@ reloc_jmpslots(Obj_Entry *obj) assert(ELF_R_TYPE(rela->r_info) == R_X86_64_JMP_SLOT); where = (Elf_Addr *)(obj->relocbase + rela->r_offset); - def = find_symdef(ELF_R_SYM(rela->r_info), obj, &defobj, true, NULL); + def = find_symdef(ELF_R_SYM(rela->r_info), obj, &defobj, true, NULL, + lockstate); if (def == NULL) return -1; target = (Elf_Addr)(defobj->relocbase + def->st_value + rela->r_addend); Modified: projects/binutils-2.17/libexec/rtld-elf/arm/reloc.c ============================================================================== --- projects/binutils-2.17/libexec/rtld-elf/arm/reloc.c Thu Dec 30 22:33:55 2010 (r216826) +++ projects/binutils-2.17/libexec/rtld-elf/arm/reloc.c Thu Dec 30 23:35:23 2010 (r216827) @@ -36,31 +36,39 @@ do_copy_relocations(Obj_Entry *dstobj) void *dstaddr; const Elf_Sym *dstsym; const char *name; - unsigned long hash; size_t size; const void *srcaddr; const Elf_Sym *srcsym; - Obj_Entry *srcobj; - const Ver_Entry *ve; + const Obj_Entry *srcobj, *defobj; + SymLook req; + int res; dstaddr = (void *) (dstobj->relocbase + rel->r_offset); dstsym = dstobj->symtab + ELF_R_SYM(rel->r_info); name = dstobj->strtab + dstsym->st_name; - hash = elf_hash(name); size = dstsym->st_size; - ve = fetch_ventry(dstobj, ELF_R_SYM(rel->r_info)); - - for (srcobj = dstobj->next; srcobj != NULL; srcobj = srcobj->next) - if ((srcsym = symlook_obj(name, hash, srcobj, ve, 0)) != NULL) + + symlook_init(&req, name); + req.ventry = fetch_ventry(dstobj, + ELF_R_SYM(rel->r_info)); + for (srcobj = dstobj->next; srcobj != NULL; + srcobj = srcobj->next) { + res = symlook_obj(&req, srcobj); + if (res == 0) { + srcsym = req.sym_out; + defobj = req.defobj_out; break; - + } + } if (srcobj == NULL) { - _rtld_error("Undefined symbol \"%s\" referenced from COPY" - " relocation in %s", name, dstobj->path); - return -1; + _rtld_error( +"Undefined symbol \"%s\" referenced from COPY relocation in %s", + name, dstobj->path); + return (-1); } - srcaddr = (const void *) (srcobj->relocbase + srcsym->st_value); + srcaddr = (const void *)(defobj->relocbase + + srcsym->st_value); memcpy(dstaddr, srcaddr, size); } } @@ -123,7 +131,8 @@ store_ptr(void *where, Elf_Addr val) } static int -reloc_nonplt_object(Obj_Entry *obj, const Elf_Rel *rel, SymCache *cache) +reloc_nonplt_object(Obj_Entry *obj, const Elf_Rel *rel, SymCache *cache, + RtldLockState *lockstate) { Elf_Addr *where; const Elf_Sym *def; @@ -149,7 +158,8 @@ reloc_nonplt_object(Obj_Entry *obj, cons if (addend & 0x00800000) addend |= 0xff000000; - def = find_symdef(symnum, obj, &defobj, false, cache); + def = find_symdef(symnum, obj, &defobj, false, cache, + lockstate); if (def == NULL) return -1; tmp = (Elf_Addr)obj->relocbase + def->st_value @@ -175,7 +185,8 @@ reloc_nonplt_object(Obj_Entry *obj, cons case R_ARM_ABS32: /* word32 B + S + A */ case R_ARM_GLOB_DAT: /* word32 B + S */ - def = find_symdef(symnum, obj, &defobj, false, cache); + def = find_symdef(symnum, obj, &defobj, false, cache, + lockstate); if (def == NULL) return -1; if (__predict_true(RELOC_ALIGNED_P(where))) { @@ -240,7 +251,7 @@ reloc_nonplt_object(Obj_Entry *obj, cons * * Process non-PLT relocations * */ int -reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld) +reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld, RtldLockState *lockstate) { const Elf_Rel *rellim; const Elf_Rel *rel; @@ -259,7 +270,7 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry rellim = (const Elf_Rel *)((caddr_t)obj->rel + obj->relsize); for (rel = obj->rel; rel < rellim; rel++) { - if (reloc_nonplt_object(obj, rel, cache) < 0) + if (reloc_nonplt_object(obj, rel, cache, lockstate) < 0) goto done; } r = 0; @@ -296,7 +307,7 @@ reloc_plt(Obj_Entry *obj) * * LD_BIND_NOW was set - force relocation for all jump slots * */ int -reloc_jmpslots(Obj_Entry *obj) +reloc_jmpslots(Obj_Entry *obj, RtldLockState *lockstate) { const Obj_Entry *defobj; const Elf_Rel *rellim; @@ -310,7 +321,7 @@ reloc_jmpslots(Obj_Entry *obj) assert(ELF_R_TYPE(rel->r_info) == R_ARM_JUMP_SLOT); where = (Elf_Addr *)(obj->relocbase + rel->r_offset); def = find_symdef(ELF_R_SYM(rel->r_info), obj, &defobj, - true, NULL); + true, NULL, lockstate); if (def == NULL) { dbg("reloc_jmpslots: sym not found"); return (-1); Modified: projects/binutils-2.17/libexec/rtld-elf/i386/reloc.c ============================================================================== --- projects/binutils-2.17/libexec/rtld-elf/i386/reloc.c Thu Dec 30 22:33:55 2010 (r216826) +++ projects/binutils-2.17/libexec/rtld-elf/i386/reloc.c Thu Dec 30 23:35:23 2010 (r216827) @@ -70,23 +70,28 @@ do_copy_relocations(Obj_Entry *dstobj) void *dstaddr; const Elf_Sym *dstsym; const char *name; - unsigned long hash; size_t size; const void *srcaddr; const Elf_Sym *srcsym; - const Ver_Entry *ve; - Obj_Entry *srcobj; + const Obj_Entry *srcobj, *defobj; + SymLook req; + int res; dstaddr = (void *) (dstobj->relocbase + rel->r_offset); dstsym = dstobj->symtab + ELF_R_SYM(rel->r_info); name = dstobj->strtab + dstsym->st_name; - hash = elf_hash(name); size = dstsym->st_size; - ve = fetch_ventry(dstobj, ELF_R_SYM(rel->r_info)); + symlook_init(&req, name); + req.ventry = fetch_ventry(dstobj, ELF_R_SYM(rel->r_info)); - for (srcobj = dstobj->next; srcobj != NULL; srcobj = srcobj->next) - if ((srcsym = symlook_obj(name, hash, srcobj, ve, 0)) != NULL) + for (srcobj = dstobj->next; srcobj != NULL; srcobj = srcobj->next) { + res = symlook_obj(&req, srcobj); + if (res == 0) { + srcsym = req.sym_out; + defobj = req.defobj_out; break; + } + } if (srcobj == NULL) { _rtld_error("Undefined symbol \"%s\" referenced from COPY" @@ -94,7 +99,7 @@ do_copy_relocations(Obj_Entry *dstobj) return -1; } - srcaddr = (const void *) (srcobj->relocbase + srcsym->st_value); + srcaddr = (const void *) (defobj->relocbase + srcsym->st_value); memcpy(dstaddr, srcaddr, size); } } @@ -114,7 +119,7 @@ init_pltgot(Obj_Entry *obj) /* Process the non-PLT relocations. */ int -reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld) +reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld, RtldLockState *lockstate) { const Elf_Rel *rellim; const Elf_Rel *rel; @@ -146,7 +151,7 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry const Obj_Entry *defobj; def = find_symdef(ELF_R_SYM(rel->r_info), obj, &defobj, - false, cache); + false, cache, lockstate); if (def == NULL) goto done; @@ -165,7 +170,7 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry const Obj_Entry *defobj; def = find_symdef(ELF_R_SYM(rel->r_info), obj, &defobj, - false, cache); + false, cache, lockstate); if (def == NULL) goto done; @@ -195,7 +200,7 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry const Obj_Entry *defobj; def = find_symdef(ELF_R_SYM(rel->r_info), obj, &defobj, - false, cache); + false, cache, lockstate); if (def == NULL) goto done; @@ -213,7 +218,7 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry const Obj_Entry *defobj; def = find_symdef(ELF_R_SYM(rel->r_info), obj, &defobj, - false, cache); + false, cache, lockstate); if (def == NULL) goto done; @@ -243,7 +248,7 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry const Obj_Entry *defobj; def = find_symdef(ELF_R_SYM(rel->r_info), obj, &defobj, - false, cache); + false, cache, lockstate); if (def == NULL) goto done; @@ -257,7 +262,7 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry const Obj_Entry *defobj; def = find_symdef(ELF_R_SYM(rel->r_info), obj, &defobj, - false, cache); + false, cache, lockstate); if (def == NULL) goto done; @@ -301,7 +306,7 @@ reloc_plt(Obj_Entry *obj) /* Relocate the jump slots in an object. */ int -reloc_jmpslots(Obj_Entry *obj) +reloc_jmpslots(Obj_Entry *obj, RtldLockState *lockstate) { const Elf_Rel *rellim; const Elf_Rel *rel; @@ -316,7 +321,8 @@ reloc_jmpslots(Obj_Entry *obj) assert(ELF_R_TYPE(rel->r_info) == R_386_JMP_SLOT); where = (Elf_Addr *)(obj->relocbase + rel->r_offset); - def = find_symdef(ELF_R_SYM(rel->r_info), obj, &defobj, true, NULL); + def = find_symdef(ELF_R_SYM(rel->r_info), obj, &defobj, true, NULL, *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201012302335.oBUNZNvj054128>