Re: Segfault in Bash

2020-07-14 Thread Ilkka Virta

On 14.7. 16:08, Chet Ramey wrote:

On 7/14/20 6:32 AM, Jeffrey Walton wrote:

./audit-libs.sh: line 17: 22929 Segmentation fault  (core dumped)
$(echo "$file" | grep -E "*.so$")


Bash is reporting that a process exited due to a seg fault, but it is
not necessarily a bash process.


As a suggestion: it might be useful if the error message showed the 
actual command that ran, after expansions. Here it shows the same 
command each time, and if only one of them crashed, you wouldn't 
immediately know which one it was. The un-expanded source line is in any 
case available in the script itself.


The message also seems to be much briefer for an interactive shell or a 
-c script. At least the latter ones might also benefit from the longer 
error message.


--
Ilkka Virta / itvi...@iki.fi



Re: Segfault in Bash

2020-07-14 Thread Ilkka Virta

On 14.7. 13:32, Jeffrey Walton wrote:

Hi Everyone,

I'm working on a script to find all shared objects in a directory. A
filename should match the RE '*.so$'. I thought I would pipe it to
grep:



IFS="" find "$dir" -name '*.so' -print | while read -r file
do
 if ! $(echo "$file" | grep -E "*.so$"); then continue; fi
 echo "library: $file"

done


Are you trying to find the .so files, or run them for some tests? 
Because it looks to me that you're running whatever that command 
substitution outputs, and not all dynamic libraries are made for that.



--
Ilkka Virta / itvi...@iki.fi



Re: Segfault in Bash

2020-07-14 Thread Chet Ramey
On 7/14/20 6:32 AM, Jeffrey Walton wrote:
> Hi Everyone,
> 
> I'm working on a script to find all shared objects in a directory. A
> filename should match the RE '*.so$'. I thought I would pipe it to
> grep:
> 
> $ ./audit-libs.sh /home/jwalton/tmp/ok2delete/lib
> ./audit-libs.sh: line 17: 22929 Segmentation fault  (core dumped)
> $(echo "$file" | grep -E "*.so$")
> ./audit-libs.sh: line 17: 22934 Segmentation fault  (core dumped)
> $(echo "$file" | grep -E "*.so$")
> ./audit-libs.sh: line 17: 22939 Segmentation fault  (core dumped)
> $(echo "$file" | grep -E "*.so$")
> ...
> 
> 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.

Bash is reporting that a process exited due to a seg fault, but it is
not necessarily a bash process.

Since the message is reporting a core dump, a backtrace from that would
tell you what's faulting.


-- 
``The lyf so short, the craft so long to lerne.'' - Chaucer
 ``Ars longa, vita brevis'' - Hippocrates
Chet Ramey, UTech, CWRUc...@case.eduhttp://tiswww.cwru.edu/~chet/



Re: Segfault in Bash

2020-07-14 Thread Greg Wooledge
> > IFS="" find "$dir" -name '*.so' -print | while read -r file
> > do
> > if ! $(echo "$file" | grep -E "*.so$"); then continue; fi
> > echo "library: $file"
> > 
> > done

Also, I forgot to point out: your "if" line is executing each of
the shared libraries that you find.  Every one of them matches the
grep check, and since you enclosed the check in a command substitution,
the output of grep (which is the pathname) is *executed* as a command.

That's probably where your segfault is happening.

Once you remove this completely unnecessary and incorrectly written
check, the segfaults from running random shared library files as
commands will stop happening.



Re: Segfault in Bash

2020-07-14 Thread Greg Wooledge
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)



Segfault in Bash

2020-07-14 Thread Jeffrey Walton
Hi Everyone,

I'm working on a script to find all shared objects in a directory. A
filename should match the RE '*.so$'. I thought I would pipe it to
grep:

$ ./audit-libs.sh /home/jwalton/tmp/ok2delete/lib
./audit-libs.sh: line 17: 22929 Segmentation fault  (core dumped)
$(echo "$file" | grep -E "*.so$")
./audit-libs.sh: line 17: 22934 Segmentation fault  (core dumped)
$(echo "$file" | grep -E "*.so$")
./audit-libs.sh: line 17: 22939 Segmentation fault  (core dumped)
$(echo "$file" | grep -E "*.so$")
...

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

Are you guys interested in the segfault?