From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 27535 invoked by alias); 20 Jan 2015 20:40:21 -0000 Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Workers List List-Post: List-Help: X-Seq: 34331 Received: (qmail 23824 invoked from network); 20 Jan 2015 20:40:16 -0000 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.2 X-Originating-IP: [86.6.153.127] X-Spam: 0 X-Authority: v=2.1 cv=S8BXwecP c=1 sm=1 tr=0 a=39NrsSuza2clQiZR/7fYWQ==:117 a=39NrsSuza2clQiZR/7fYWQ==:17 a=kj9zAlcOel0A:10 a=NLZqzBF-AAAA:8 a=q2GGsy2AAAAA:8 a=Hv2oBLhKwWUW2OCVwdQA:9 a=CjuIK1q_8ugA:10 Date: Tue, 20 Jan 2015 20:34:36 +0000 From: Peter Stephenson To: zsh-workers@zsh.org Subject: Re: 'cd' built-in crashed zsh on a broken file system Message-ID: <20150120203436.4bf346a4@ntlworld.com> In-Reply-To: <150120102810.ZM28542@torch.brasslantern.com> References: <1874234.7FAblKt7ne@kdudka.brq.redhat.com> <150120102810.ZM28542@torch.brasslantern.com> MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit On Tue, 20 Jan 2015 10:28:10 -0800 Bart Schaefer wrote: > On Jan 20, 1:35pm, Kamil Dudka wrote: > } Subject: 'cd' built-in crashed zsh on a broken file system > } > } It is not clear to me why pwd was NULL after the return from cd_new_pwd() > > xsymlink() in utils.c: > > if (*s != '/') > return NULL; > > called from findpwd() also utils.c, which in turn is only called if you > have CHASE_LINKS set. > > I'm not sure if the right thing to do is test the return of xsymlink() > down in findpwd(), or to check the return of findpwd() in cd_new_pwd(). I'd say the latter: dealing with an I'm-sorry-dave-I-can't-do-that is a bit neater higher up otherwise the intermediate return values are in some sort of limbo. I don't think there's any point in printing an error message: we don't know what happened, so just pretend it didn't. How about this? diff --git a/Src/builtin.c b/Src/builtin.c index 1818941..08be1ac 100644 --- a/Src/builtin.c +++ b/Src/builtin.c @@ -1156,9 +1156,11 @@ cd_new_pwd(int func, LinkNode dir, int quiet) zsfree(getlinknode(dirstack)); if (chasinglinks) { - s = new_pwd; - new_pwd = findpwd(s); - zsfree(s); + s = findpwd(new_pwd); + if (s) { + zsfree(new_pwd); + new_pwd = s; + } } if (isset(PUSHDIGNOREDUPS)) { LinkNode n; diff --git a/Src/utils.c b/Src/utils.c index 4561b5e..cf18f12 100644 --- a/Src/utils.c +++ b/Src/utils.c @@ -1108,10 +1108,13 @@ getnameddir(char *name) if ((pw = getpwnam(name))) { char *dir = isset(CHASELINKS) ? xsymlink(pw->pw_dir) : ztrdup(pw->pw_dir); - adduserdir(name, dir, ND_USERNAME, 1); - str = dupstring(dir); - zsfree(dir); - return str; + if (dir) { + adduserdir(name, dir, ND_USERNAME, 1); + str = dupstring(dir); + zsfree(dir); + return str; + } else + return ztrdup(pw->pw_dir); } } #endif /* HAVE_GETPWNAM */ pws