Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > gnu.bash.bug > #16566

Re: Segfault in Bash

Path csiph.com!xmission!news.snarked.org!news.linkpendium.com!news.linkpendium.com!panix!usenet.stanford.edu!not-for-mail
From Greg Wooledge <wooledg@eeg.ccf.org>
Newsgroups gnu.bash.bug
Subject Re: Segfault in Bash
Date Tue, 14 Jul 2020 07:49:07 -0400
Lines 58
Approved bug-bash@gnu.org
Message-ID <mailman.188.1594727381.2306.bug-bash@gnu.org> (permalink)
References <CAH8yC8nB5fhvvdD1bCUsgNzNTni4ixkjDbfeKQLNVqZ71HpxBg@mail.gmail.com> <20200714114907.GZ22833@eeg.ccf.org>
NNTP-Posting-Host lists.gnu.org
Mime-Version 1.0
Content-Type text/plain; charset=us-ascii
X-Trace usenet.stanford.edu 1594727382 6356 209.51.188.17 (14 Jul 2020 11:49:42 GMT)
X-Complaints-To action@cs.stanford.edu
To bug-bash@gnu.org
Envelope-to bug-bash@gnu.org
Mail-Followup-To bug-bash@gnu.org
Content-Disposition inline
In-Reply-To <CAH8yC8nB5fhvvdD1bCUsgNzNTni4ixkjDbfeKQLNVqZ71HpxBg@mail.gmail.com>
User-Agent Mutt/1.10.1 (2018-07-13)
Received-SPF none client-ip=139.137.100.1; envelope-from=wooledg@eeg.ccf.org; helo=mail.eeg.ccf.org
X-detected-operating-system by eggs.gnu.org: First seen = 2020/07/14 07:49:08
X-ACL-Warn Detected OS = Linux 2.2.x-3.x [generic] [fuzzy]
X-Spam_score_int -8
X-Spam_score -0.9
X-Spam_bar /
X-Spam_report (-0.9 / 5.0 requ) BAYES_00=-1.9, KHOP_HELO_FCRDNS=1, SPF_HELO_NONE=0.001, SPF_NONE=0.001, URIBL_BLOCKED=0.001 autolearn=no autolearn_force=no
X-Spam_action no action
X-BeenThere bug-bash@gnu.org
X-Mailman-Version 2.1.23
Precedence list
List-Id Bug reports for the GNU Bourne Again SHell <bug-bash.gnu.org>
List-Unsubscribe <https://lists.gnu.org/mailman/options/bug-bash>, <mailto:bug-bash-request@gnu.org?subject=unsubscribe>
List-Archive <https://lists.gnu.org/archive/html/bug-bash>
List-Post <mailto:bug-bash@gnu.org>
List-Help <mailto:bug-bash-request@gnu.org?subject=help>
List-Subscribe <https://lists.gnu.org/mailman/listinfo/bug-bash>, <mailto:bug-bash-request@gnu.org?subject=subscribe>
X-Mailman-Original-Message-ID <20200714114907.GZ22833@eeg.ccf.org>
X-Mailman-Original-References <CAH8yC8nB5fhvvdD1bCUsgNzNTni4ixkjDbfeKQLNVqZ71HpxBg@mail.gmail.com>
Xref csiph.com gnu.bash.bug:16566

Show key headers only | View raw


On Tue, Jul 14, 2020 at 06:32:44AM -0400, Jeffrey Walton wrote:
> $ ./audit-libs.sh /home/jwalton/tmp/ok2delete/lib
> ./audit-libs.sh: line 17: 22929 Segmentation fault      (core dumped)
> $(echo "$file" | grep -E "*.so$")

This grep regular expression is not valid.  The * symbol in a regular
expression means "0 or more of the previous thing", so you can never
begin a regular expression with a * character.

Also, the . character in a regex means "any one character", not a
literal dot.

If for some reason you actually wanted to grep for lines that end
with the string ".so", it would be:

grep '\.so$'

However, the *use* of grep here is also incorrect.

> My code is broken at the moment. I know I am the cause of Bash's
> crash. But I feel like Bash should not segfault.
> 
> IFS="" find "$dir" -name '*.so' -print | while read -r file
> do
>     if ! $(echo "$file" | grep -E "*.so$"); then continue; fi
>     echo "library: $file"
> 
> done

I don't even understand what the grep is supposed to be *doing* here.
You already know that each file processed by that check ends with .so
because of the find command that you used.  You could simply remove
the "if" line altogether.

IFS isn't actually doing anything, either.  It only applies to the
find command, not the other half of the pipeline.  And of course, find
(an external command) will just ignore it.

What you really want is simply:

find "$dir" -type f -name '*.so' -exec printf 'library: %s\n' {} +

If your code is "just an example" (bashphorism 9), and you actually
wanted to do MORE than print each filename, and thus you really did
want a bash loop to process each file within the script, then you
need to change a few things.  Your existing loop will blow up on any
filenames containing newlines.  Also, because you used a pipeline,
the loop runs in a subshell, so you can't set any variables and have
them survive -- this may or may not be a problem, and we can't know
because we don't know what the actual goal of the script is.

A proper while loop to process the pathnames emitted by grep would look
something like:

while IFS= read -r -d '' f; do
  : secret stuff here
done < <(find "$dir" -type f -name '*.so' -print0)

Back to gnu.bash.bug | Previous | Next | Find similar


Thread

Re: Segfault in Bash Greg Wooledge <wooledg@eeg.ccf.org> - 2020-07-14 07:49 -0400

csiph-web