PERFORCE change 177589 for review
Alexander Motin
mav at FreeBSD.org
Sun May 2 10:22:41 UTC 2010
http://p4web.freebsd.org/@@177589?ac=10
Change 177589 by mav at mav_mavtest on 2010/05/02 10:22:03
IFC
Affected files ...
.. //depot/projects/scottl-camlock/src/lib/libpmc/libpmc.c#10 integrate
.. //depot/projects/scottl-camlock/src/lib/libufs/cgroup.c#4 integrate
.. //depot/projects/scottl-camlock/src/sys/amd64/amd64/trap.c#27 integrate
.. //depot/projects/scottl-camlock/src/sys/cam/cam_xpt.c#156 integrate
.. //depot/projects/scottl-camlock/src/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/txg.c#3 integrate
.. //depot/projects/scottl-camlock/src/sys/conf/NOTES#57 integrate
.. //depot/projects/scottl-camlock/src/sys/conf/options#42 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/ath/ath_hal/ar5212/ar5212_reset.c#2 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/hwpmc/hwpmc_mod.c#16 integrate
.. //depot/projects/scottl-camlock/src/sys/kern/kern_resource.c#18 integrate
.. //depot/projects/scottl-camlock/src/sys/kern/uipc_mbuf.c#18 integrate
.. //depot/projects/scottl-camlock/src/sys/mips/conf/AR71XX#6 integrate
.. //depot/projects/scottl-camlock/src/sys/vm/vm_map.c#31 integrate
.. //depot/projects/scottl-camlock/src/usr.bin/pathchk/pathchk.1#2 integrate
.. //depot/projects/scottl-camlock/src/usr.bin/pathchk/pathchk.c#2 integrate
Differences ...
==== //depot/projects/scottl-camlock/src/lib/libpmc/libpmc.c#10 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/lib/libpmc/libpmc.c,v 1.26 2010/04/02 13:23:49 fabient Exp $");
+__FBSDID("$FreeBSD: src/lib/libpmc/libpmc.c,v 1.27 2010/05/01 21:59:06 rstone Exp $");
#include <sys/types.h>
#include <sys/module.h>
@@ -737,9 +737,16 @@
case PMC_EV_IAP_EVENT_40H: /* Core */
case PMC_EV_IAP_EVENT_41H: /* Core */
case PMC_EV_IAP_EVENT_42H: /* Core, Core2, Atom */
- case PMC_EV_IAP_EVENT_77H: /* Core */
if (cachestate == 0)
cachestate = (0xF << 8);
+ break;
+ case PMC_EV_IAP_EVENT_77H: /* Atom */
+ /* IAP_EVENT_77H only accepts a cachestate qualifier on the
+ * Atom processor
+ */
+ if(cpu_info.pm_cputype == PMC_CPU_INTEL_ATOM && cachestate == 0)
+ cachestate = (0xF << 8);
+ break;
default:
break;
}
==== //depot/projects/scottl-camlock/src/lib/libufs/cgroup.c#4 (text+ko) ====
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/lib/libufs/cgroup.c,v 1.6 2010/04/24 07:05:35 jeff Exp $");
+__FBSDID("$FreeBSD: src/lib/libufs/cgroup.c,v 1.7 2010/05/01 18:56:45 emaste Exp $");
#include <sys/param.h>
#include <sys/mount.h>
@@ -145,7 +145,7 @@
fs = &disk->d_fs;
cgp = &disk->d_cg;
inosused = cg_inosused(cgp);
- for (ino = 0; ino < fs->fs_ipg / NBBY; ino++)
+ for (ino = 0; ino < fs->fs_ipg; ino++)
if (isclr(inosused, ino))
goto gotit;
return (0);
==== //depot/projects/scottl-camlock/src/sys/amd64/amd64/trap.c#27 (text+ko) ====
@@ -38,7 +38,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/trap.c,v 1.341 2010/04/13 10:12:58 kib Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/trap.c,v 1.342 2010/05/01 13:15:35 kib Exp $");
/*
* AMD64 Trap and System call handling
@@ -172,52 +172,6 @@
extern char *syscallnames[];
-/* #define DEBUG 1 */
-#ifdef DEBUG
-static void
-report_seg_fault(const char *segn, struct trapframe *frame)
-{
- struct proc_ldt *pldt;
- struct trapframe *pf;
-
- pldt = curproc->p_md.md_ldt;
- printf("%d: %s load fault %lx %p %d\n",
- curproc->p_pid, segn, frame->tf_err,
- pldt != NULL ? pldt->ldt_base : NULL,
- pldt != NULL ? pldt->ldt_refcnt : 0);
- kdb_backtrace();
- pf = (struct trapframe *)frame->tf_rsp;
- printf("rdi %lx\n", pf->tf_rdi);
- printf("rsi %lx\n", pf->tf_rsi);
- printf("rdx %lx\n", pf->tf_rdx);
- printf("rcx %lx\n", pf->tf_rcx);
- printf("r8 %lx\n", pf->tf_r8);
- printf("r9 %lx\n", pf->tf_r9);
- printf("rax %lx\n", pf->tf_rax);
- printf("rbx %lx\n", pf->tf_rbx);
- printf("rbp %lx\n", pf->tf_rbp);
- printf("r10 %lx\n", pf->tf_r10);
- printf("r11 %lx\n", pf->tf_r11);
- printf("r12 %lx\n", pf->tf_r12);
- printf("r13 %lx\n", pf->tf_r13);
- printf("r14 %lx\n", pf->tf_r14);
- printf("r15 %lx\n", pf->tf_r15);
- printf("fs %x\n", pf->tf_fs);
- printf("gs %x\n", pf->tf_gs);
- printf("es %x\n", pf->tf_es);
- printf("ds %x\n", pf->tf_ds);
- printf("tno %x\n", pf->tf_trapno);
- printf("adr %lx\n", pf->tf_addr);
- printf("flg %x\n", pf->tf_flags);
- printf("err %lx\n", pf->tf_err);
- printf("rip %lx\n", pf->tf_rip);
- printf("cs %lx\n", pf->tf_cs);
- printf("rfl %lx\n", pf->tf_rflags);
- printf("rsp %lx\n", pf->tf_rsp);
- printf("ss %lx\n", pf->tf_ss);
-}
-#endif
-
/*
* Exception, fault, and trap interface to the FreeBSD kernel.
* This common code is called from assembly language IDT gate entry
@@ -314,9 +268,7 @@
*/
printf("kernel trap %d with interrupts disabled\n",
type);
-#ifdef DEBUG
- report_seg_fault("hlt", frame);
-#endif
+
/*
* We shouldn't enable interrupts while holding a
* spin lock or servicing an NMI.
@@ -535,33 +487,21 @@
goto out;
}
if (frame->tf_rip == (long)ld_ds) {
-#ifdef DEBUG
- report_seg_fault("ds", frame);
-#endif
frame->tf_rip = (long)ds_load_fault;
frame->tf_ds = _udatasel;
goto out;
}
if (frame->tf_rip == (long)ld_es) {
-#ifdef DEBUG
- report_seg_fault("es", frame);
-#endif
frame->tf_rip = (long)es_load_fault;
frame->tf_es = _udatasel;
goto out;
}
if (frame->tf_rip == (long)ld_fs) {
-#ifdef DEBUG
- report_seg_fault("fs", frame);
-#endif
frame->tf_rip = (long)fs_load_fault;
frame->tf_fs = _ufssel;
goto out;
}
if (frame->tf_rip == (long)ld_gs) {
-#ifdef DEBUG
- report_seg_fault("gs", frame);
-#endif
frame->tf_rip = (long)gs_load_fault;
frame->tf_gs = _ugssel;
goto out;
@@ -667,30 +607,6 @@
ksi.ksi_addr = (void *)addr;
trapsignal(td, &ksi);
-#ifdef DEBUG
-{
- register_t rg,rgk, rf;
-
- if (type <= MAX_TRAP_MSG) {
- uprintf("fatal process exception: %s",
- trap_msg[type]);
- if ((type == T_PAGEFLT) || (type == T_PROTFLT))
- uprintf(", fault VA = 0x%lx", frame->tf_addr);
- uprintf("\n");
- }
- rf = rdmsr(0xc0000100);
- rg = rdmsr(0xc0000101);
- rgk = rdmsr(0xc0000102);
- uprintf("pid %d TRAP %d rip %lx err %lx addr %lx cs %lx ss %lx ds %x "
- "es %x fs %x fsbase %lx %lx gs %x gsbase %lx %lx %lx\n",
- curproc->p_pid, type, frame->tf_rip, frame->tf_err,
- frame->tf_addr,
- frame->tf_cs, frame->tf_ss, frame->tf_ds, frame->tf_es,
- frame->tf_fs, td->td_pcb->pcb_fsbase, rf,
- frame->tf_gs, td->td_pcb->pcb_gsbase, rg, rgk);
-}
-#endif
-
user:
userret(td, frame);
mtx_assert(&Giant, MA_NOTOWNED);
==== //depot/projects/scottl-camlock/src/sys/cam/cam_xpt.c#156 (text+ko) ====
@@ -28,7 +28,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/cam/cam_xpt.c,v 1.247 2010/04/30 08:57:03 mav Exp $");
+__FBSDID("$FreeBSD: src/sys/cam/cam_xpt.c,v 1.248 2010/05/02 04:16:39 mav Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -4874,6 +4874,8 @@
if ((dev->flags & CAM_DEV_TAG_AFTER_COUNT) != 0
&& (--dev->tag_delay_count == 0))
xpt_start_tags(ccb_h->path);
+ if (!device_is_send_queued(dev))
+ xpt_schedule_dev_sendq(ccb_h->path->bus, dev);
}
if (ccb_h->status & CAM_RELEASE_SIMQ) {
==== //depot/projects/scottl-camlock/src/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/txg.c#3 (text+ko) ====
@@ -38,15 +38,22 @@
int zfs_txg_timeout = 30; /* max seconds worth of delta per txg */
extern int zfs_txg_synctime;
+extern uint64_t zfs_write_limit_override;
SYSCTL_DECL(_vfs_zfs);
-SYSCTL_NODE(_vfs_zfs, OID_AUTO, txg, CTLFLAG_RW, 0, "ZFS TXG");
+SYSCTL_NODE(_vfs_zfs, OID_AUTO, txg, CTLFLAG_RW, 0,
+ "ZFS transaction groups (TXG)");
TUNABLE_INT("vfs.zfs.txg.timeout", &zfs_txg_timeout);
SYSCTL_INT(_vfs_zfs_txg, OID_AUTO, timeout, CTLFLAG_RDTUN, &zfs_txg_timeout, 0,
"Maximum seconds worth of delta per txg");
TUNABLE_INT("vfs.zfs.txg.synctime", &zfs_txg_synctime);
SYSCTL_INT(_vfs_zfs_txg, OID_AUTO, synctime, CTLFLAG_RDTUN, &zfs_txg_synctime,
0, "Target seconds to sync a txg");
+TUNABLE_QUAD("vfs.zfs.txg.write_limit_override", &zfs_write_limit_override);
+SYSCTL_QUAD(_vfs_zfs_txg, OID_AUTO, write_limit_override, CTLFLAG_RW,
+ &zfs_write_limit_override, 0,
+ "Override maximum size of a txg to this size in bytes, "
+ "value of 0 means don't override");
/*
* Prepare the txg subsystem.
==== //depot/projects/scottl-camlock/src/sys/conf/NOTES#57 (text+ko) ====
@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/conf/NOTES,v 1.1581 2010/04/14 20:45:33 yongari Exp $
+# $FreeBSD: src/sys/conf/NOTES,v 1.1582 2010/05/01 16:36:14 imp Exp $
#
# NOTES -- Lines that can be cut/pasted into kernel and hints configs.
#
@@ -2093,6 +2093,15 @@
#device ath_rf5413
#device ath_ar5416 # AR5416 chips
options AH_SUPPORT_AR5416 # enable AR5416 tx/rx descriptors
+# All of the AR5212 parts have a problem when paired with the AR71xx
+# CPUS. These parts have a bug that triggers a fatal bus error on the AR71xx
+# only. Details of the exact nature of the bug are sketchy, but some can be
+# found at https://forum.openwrt.org/viewtopic.php?pid=70060 on pages 4, 5 and
+# 6. This option enables this workaround. There is a performance penalty
+# for this work around, but without it things don't work at all. The DMA
+# from the card usually bursts 128 bytes, but on the affected CPUs, only
+# 4 are safe.
+options AH_RXCFG_SDMAMW_4BYTES
#device ath_ar9160 # AR9160 chips
#device ath_ar9280 # AR9280 chips
#device ath_ar9285 # AR9285 chips
==== //depot/projects/scottl-camlock/src/sys/conf/options#42 (text+ko) ====
@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/conf/options,v 1.701 2010/03/24 20:02:40 rrs Exp $
+# $FreeBSD: src/sys/conf/options,v 1.702 2010/05/01 16:36:14 imp Exp $
#
# On the handling of kernel options
#
@@ -771,6 +771,7 @@
AH_NEED_DESC_SWAP opt_ah.h
AH_USE_INIPDGAIN opt_ah.h
AH_MAXCHAN opt_ah.h
+AH_RXCFG_SDMAMW_4BYTES opt_ah.h
# options for the Broadcom BCM43xx driver (bwi)
BWI_DEBUG opt_bwi.h
==== //depot/projects/scottl-camlock/src/sys/dev/ath/ath_hal/ar5212/ar5212_reset.c#2 (text+ko) ====
@@ -14,7 +14,7 @@
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
- * $FreeBSD: src/sys/dev/ath/ath_hal/ar5212/ar5212_reset.c,v 1.9 2009/02/24 01:07:06 sam Exp $
+ * $FreeBSD: src/sys/dev/ath/ath_hal/ar5212/ar5212_reset.c,v 1.10 2010/05/01 16:36:14 imp Exp $
*/
#include "opt_ah.h"
@@ -283,6 +283,14 @@
regWrites = ath_hal_ini_write(ah, &ahp->ah_ini_modes, modesIndex, 0);
regWrites = write_common(ah, &ahp->ah_ini_common, bChannelChange,
regWrites);
+#ifdef AH_RXCFG_SDMAMW_4BYTES
+ /*
+ * Nala doesn't work with 128 byte bursts on pb42(hydra) (ar71xx),
+ * use 4 instead. Enabling it on all platforms would hurt performance,
+ * so we only enable it on the ones that are affected by it.
+ */
+ OS_REG_WRITE(ah, AR_RXCFG, 0);
+#endif
ahp->ah_rfHal->writeRegs(ah, modesIndex, freqIndex, regWrites);
OS_MARK(ah, AH_MARK_RESET_LINE, __LINE__);
==== //depot/projects/scottl-camlock/src/sys/dev/hwpmc/hwpmc_mod.c#16 (text+ko) ====
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/hwpmc/hwpmc_mod.c,v 1.49 2010/03/31 20:00:44 fabient Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/hwpmc/hwpmc_mod.c,v 1.50 2010/05/01 22:04:58 rstone Exp $");
#include <sys/param.h>
#include <sys/eventhandler.h>
@@ -2675,16 +2675,16 @@
PMCDBG(PMC,OPS,1, "po=%p in global list", po);
}
po->po_sscount++;
- }
- /*
- * Log mapping information for all existing processes in the
- * system. Subsequent mappings are logged as they happen;
- * see pmc_process_mmap().
- */
- if (po->po_logprocmaps == 0) {
- pmc_log_all_process_mappings(po);
- po->po_logprocmaps = 1;
+ /*
+ * Log mapping information for all existing processes in the
+ * system. Subsequent mappings are logged as they happen;
+ * see pmc_process_mmap().
+ */
+ if (po->po_logprocmaps == 0) {
+ pmc_log_all_process_mappings(po);
+ po->po_logprocmaps = 1;
+ }
}
/*
==== //depot/projects/scottl-camlock/src/sys/kern/kern_resource.c#18 (text+ko) ====
@@ -35,7 +35,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/kern_resource.c,v 1.195 2010/03/03 21:46:51 rrs Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/kern_resource.c,v 1.196 2010/05/01 14:46:17 kib Exp $");
#include "opt_compat.h"
@@ -76,6 +76,7 @@
struct timeval *up, struct timeval *sp);
static int donice(struct thread *td, struct proc *chgp, int n);
static struct uidinfo *uilookup(uid_t uid);
+static void ruxagg_tlock(struct proc *p, struct thread *td);
/*
* Resource controls and accounting.
@@ -629,9 +630,7 @@
return;
PROC_SLOCK(p);
FOREACH_THREAD_IN_PROC(p, td) {
- thread_lock(td);
- ruxagg(&p->p_rux, td);
- thread_unlock(td);
+ ruxagg_tlock(p, td);
}
PROC_SUNLOCK(p);
if (p->p_rux.rux_runtime > p->p_cpulimit * cpu_tickrate()) {
@@ -842,9 +841,7 @@
FOREACH_THREAD_IN_PROC(p, td) {
if (td->td_incruntime == 0)
continue;
- thread_lock(td);
- ruxagg(&p->p_rux, td);
- thread_unlock(td);
+ ruxagg_tlock(p, td);
}
calcru1(p, &p->p_rux, up, sp);
}
@@ -945,10 +942,7 @@
}
int
-kern_getrusage(td, who, rup)
- struct thread *td;
- int who;
- struct rusage *rup;
+kern_getrusage(struct thread *td, int who, struct rusage *rup)
{
struct proc *p;
int error;
@@ -1022,6 +1016,15 @@
td->td_sticks = 0;
}
+static void
+ruxagg_tlock(struct proc *p, struct thread *td)
+{
+
+ thread_lock(td);
+ ruxagg(&p->p_rux, td);
+ thread_unlock(td);
+}
+
/*
* Update the rusage_ext structure and fetch a valid aggregate rusage
* for proc p if storage for one is supplied.
@@ -1036,9 +1039,7 @@
*ru = p->p_ru;
if (p->p_numthreads > 0) {
FOREACH_THREAD_IN_PROC(p, td) {
- thread_lock(td);
- ruxagg(&p->p_rux, td);
- thread_unlock(td);
+ ruxagg_tlock(p, td);
rucollect(ru, &td->td_ru);
}
}
==== //depot/projects/scottl-camlock/src/sys/kern/uipc_mbuf.c#18 (text+ko) ====
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/uipc_mbuf.c,v 1.185 2009/06/22 22:20:38 andre Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/uipc_mbuf.c,v 1.186 2010/05/01 18:34:50 zec Exp $");
#include "opt_param.h"
#include "opt_mbuf_stress_test.h"
@@ -948,9 +948,8 @@
len = 0;
}
}
- m = mp;
if (mp->m_flags & M_PKTHDR)
- m->m_pkthdr.len -= (req_len - len);
+ mp->m_pkthdr.len -= (req_len - len);
} else {
/*
* Trim from tail. Scan the mbuf chain,
==== //depot/projects/scottl-camlock/src/sys/mips/conf/AR71XX#6 (text+ko) ====
@@ -1,7 +1,7 @@
#
# AR71XX -- Kernel configuration file for FreeBSD/mips for Atheros 71xx systems
#
-# $FreeBSD: src/sys/mips/conf/AR71XX,v 1.5 2010/03/29 22:03:55 imp Exp $
+# $FreeBSD: src/sys/mips/conf/AR71XX,v 1.7 2010/05/01 16:39:46 imp Exp $
#
ident AR71XX
@@ -29,11 +29,11 @@
# options NFS_LEGACYRPC
# Debugging for use in -current
-# options DEADLKRES
-# options INVARIANTS
-# options INVARIANT_SUPPORT
-# options WITNESS
-# options WITNESS_SKIPSPIN
+options DEADLKRES
+options INVARIANTS
+options INVARIANT_SUPPORT
+options WITNESS
+options WITNESS_SKIPSPIN
options FFS #Berkeley Fast Filesystem
options SOFTUPDATES #Enable FFS soft updates support
options UFS_ACL #Support for access control lists
@@ -62,6 +62,7 @@
options ATH_DEBUG
device ath_hal
option AH_SUPPORT_AR5416
+option AH_RXCFG_SDMAMW_4BYTES # See NOTES for details of this WAR
device ath_rate_sample
device mii
==== //depot/projects/scottl-camlock/src/sys/vm/vm_map.c#31 (text+ko) ====
@@ -63,7 +63,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/vm/vm_map.c,v 1.428 2010/04/18 22:32:07 jmallett Exp $");
+__FBSDID("$FreeBSD: src/sys/vm/vm_map.c,v 1.429 2010/05/02 01:25:03 alc Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -1412,7 +1412,11 @@
}
result = vm_map_insert(map, object, offset, start, start +
length, prot, max, cow);
- } while (result == KERN_NO_SPACE && find_space == VMFS_ALIGNED_SPACE);
+ } while (result == KERN_NO_SPACE && (find_space == VMFS_ALIGNED_SPACE
+#ifdef VMFS_TLB_ALIGNED_SPACE
+ || find_space == VMFS_TLB_ALIGNED_SPACE
+#endif
+ ));
vm_map_unlock(map);
return (result);
}
==== //depot/projects/scottl-camlock/src/usr.bin/pathchk/pathchk.1#2 (text+ko) ====
@@ -25,9 +25,9 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" $FreeBSD: src/usr.bin/pathchk/pathchk.1,v 1.5 2005/01/18 13:43:52 ru Exp $
+.\" $FreeBSD: src/usr.bin/pathchk/pathchk.1,v 1.7 2010/05/01 22:10:45 jilles Exp $
.\"
-.Dd May 21, 2002
+.Dd May 1, 2010
.Dt PATHCHK 1
.Os
.Sh NAME
@@ -35,7 +35,7 @@
.Nd check pathnames
.Sh SYNOPSIS
.Nm
-.Op Fl p
+.Op Fl pP
.Ar pathname ...
.Sh DESCRIPTION
The
@@ -95,6 +95,16 @@
.Pq Ql \&-
character.
.El
+.It Fl P
+In addition to the default or
+.Fl p
+checks, write a diagnostic for each argument that:
+.Bl -bullet
+.It
+Is empty.
+.It
+Contains a component that starts with a hyphen.
+.El
.El
.Sh EXIT STATUS
.Ex -std
@@ -104,7 +114,7 @@
.Tn POSIX
systems:
.Pp
-.Dl "find . -print | xargs pathchk -p"
+.Dl "find . -exec pathchk -p -- {} +"
.Sh SEE ALSO
.Xr getconf 1 ,
.Xr pathconf 2 ,
==== //depot/projects/scottl-camlock/src/usr.bin/pathchk/pathchk.c#2 (text+ko) ====
@@ -33,7 +33,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/usr.bin/pathchk/pathchk.c,v 1.5 2005/05/21 09:55:07 ru Exp $");
+__FBSDID("$FreeBSD: src/usr.bin/pathchk/pathchk.c,v 1.6 2010/05/01 22:00:28 jilles Exp $");
#include <sys/types.h>
#include <sys/stat.h>
@@ -51,6 +51,7 @@
static void usage(void);
static int pflag; /* Perform portability checks */
+static int Pflag; /* Check for empty paths, leading '-' */
int
main(int argc, char *argv[])
@@ -58,11 +59,14 @@
int ch, rval;
const char *arg;
- while ((ch = getopt(argc, argv, "p")) > 0) {
+ while ((ch = getopt(argc, argv, "pP")) > 0) {
switch (ch) {
case 'p':
pflag = 1;
break;
+ case 'P':
+ Pflag = 1;
+ break;
default:
usage();
/*NOTREACHED*/
@@ -102,6 +106,15 @@
p = pathd;
+ if (Pflag && *p == '\0') {
+ warnx("%s: empty pathname", path);
+ goto bad;
+ }
+ if ((Pflag || pflag) && (*p == '-' || strstr(p, "/-") != NULL)) {
+ warnx("%s: contains a component starting with '-'", path);
+ goto bad;
+ }
+
if (!pflag) {
errno = 0;
namemax = pathconf(*p == '/' ? "/" : ".", _PC_NAME_MAX);
@@ -182,9 +195,6 @@
"0123456789._-";
long s;
- if (*path == '-')
- return (*path);
-
s = strspn(path, charset);
if (path[s] != '\0')
return (path[s]);
More information about the p4-projects
mailing list