From owner-freebsd-bugs@FreeBSD.ORG Wed Oct 30 14:30:01 2013 Return-Path: Delivered-To: freebsd-bugs@smarthost.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id D0697616 for ; Wed, 30 Oct 2013 14:30:01 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:1900:2254:206c::16:87]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id B488B25E9; Wed, 30 Oct 2013 14:30:01 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.7/8.14.7) with ESMTP id r9UEU1jX015862; Wed, 30 Oct 2013 14:30:01 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.7/8.14.7/Submit) id r9UEU1XX015861; Wed, 30 Oct 2013 14:30:01 GMT (envelope-from gnats) Resent-Date: Wed, 30 Oct 2013 14:30:01 GMT Resent-Message-Id: <201310301430.r9UEU1XX015861@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-bugs@FreeBSD.org Resent-Cc: kib@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, Stefan Neudorf Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id BB891283 for ; Wed, 30 Oct 2013 14:21:22 +0000 (UTC) (envelope-from BM-2cXppXU4T67w7j6NCir9T1WdzBHmFgBnLj@bitmessage.ch) Received: from mail.bitmessage.ch (mail.bitmessage.ch [146.228.112.252]) by mx1.freebsd.org (Postfix) with SMTP id 29F802560 for ; Wed, 30 Oct 2013 14:21:21 +0000 (UTC) Received: from nil ([127.0.0.1]) by mail.bitmessage.ch ; Wed, 30 Oct 2013 15:21:13 +0100 Message-Id: <20131030.86li1aq1qz@bitmessage.ch> Date: Wed, 30 Oct 2013 15:20:20 +0100 From: Stefan Neudorf To: FreeBSD-gnats-submit@freebsd.org X-GNATS-Notify: kib@FreeBSD.org Subject: bin/183484: [PATCH] usr.bin/limits: make -e work without /proc X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 30 Oct 2013 14:30:02 -0000 >Number: 183484 >Category: bin >Synopsis: [PATCH] usr.bin/limits: make -e work without /proc >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Wed Oct 30 14:30:00 UTC 2013 >Closed-Date: >Last-Modified: >Originator: Stefan Neudorf >Release: >Organization: >Environment: >Description: >How-To-Repeat: $ tcsh > limits -e ulimit -t unlimited; ulimit -f unlimited; ulimit -d 33554432; ulimit -s 524288; ulimit -c unlimited; ulimit -m unlimited; ulimit -l 64; ulimit -u 8528; ulimit -n 117585; ulimit -b unlimited; ulimit -v unlimited; ulimit -p unlimited; ulimit -w unlimited; ulimit -k unlimited; > sudo mount /proc > limits -e limit cputime unlimited; limit filesize unlimited; limit datasize 33554432; limit stacksize 524288; limit coredumpsize unlimited; limit memoryuse unlimited; limit memorylocked 64; limit maxproc 8528; limit descriptors 117585; limit sbsize unlimited; limit vmemoryuse unlimited; limit pseudoterminals unlimited; limit swapuse unlimited; limit kqueues unlimited; >Fix: --- noprocdir.diff begins here --- Index: usr.bin/limits/limits.c =================================================================== --- usr.bin/limits/limits.c (revision 257346) +++ usr.bin/limits/limits.c (working copy) @@ -30,6 +30,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -704,27 +705,31 @@ getshelltype(void) pid_t ppid = getppid(); if (ppid != 1) { - FILE * fp; + struct kinfo_proc kp; struct stat st; - char procdir[MAXPATHLEN], buf[128]; - int l = sprintf(procdir, "/proc/%ld/", (long)ppid); + char path[MAXPATHLEN]; char * shell = getenv("SHELL"); + int mib[4]; + size_t len; if (shell != NULL && stat(shell, &st) != -1) { struct stat st1; - strcpy(procdir+l, "file"); + mib[0] = CTL_KERN; + mib[1] = KERN_PROC; + mib[2] = KERN_PROC_PATHNAME; + mib[3] = ppid; + len = sizeof(path); + sysctl(mib, 4, path, &len, NULL, 0); /* $SHELL is actual shell? */ - if (stat(procdir, &st1) != -1 && memcmp(&st, &st1, sizeof st) == 0) + if (stat(path, &st1) != -1 && memcmp(&st, &st1, sizeof st) == 0) return getshellbyname(shell); } - strcpy(procdir+l, "status"); - if (stat(procdir, &st) == 0 && (fp = fopen(procdir, "r")) != NULL) { - char * p = fgets(buf, sizeof buf, fp)==NULL ? NULL : strtok(buf, " \t"); - fclose(fp); - if (p != NULL) - return getshellbyname(p); - } + mib[2] = KERN_PROC_PID; + len = sizeof(kp); + sysctl(mib, 4, &kp, &len, NULL, 0); + if (kp.ki_comm != NULL) + return getshellbyname(kp.ki_comm); } return SH_SH; } --- noprocdir.diff ends here --- >Release-Note: >Audit-Trail: >Unformatted: