[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

$RANDOM and here-string and here-doc

From: Jurij Mihelič
Subject: $RANDOM and here-string and here-doc
Date: Tue, 20 Mar 2012 17:37:59 +0100

Configuration Information [Automatically generated, do not change]:
Machine: i686
OS: linux-gnu
Compiler: gcc
Compilation CFLAGS:  -DPROGRAM='bash' -DCONF_HOSTTYPE='i686' 
-DCONF_OSTYPE='linux-gnu' -DCONF_MACHTYPE='i686-pc-linux-gnu' -DC$
uname output: Linux lalgec 3.0.0-16-generic-pae #29-Ubuntu SMP Tue Feb 14 
13:56:31 UTC 2012 i686 i686 i386 GNU/Linux
Machine Type: i686-pc-linux-gnu

Bash Version: 4.2
Patch Level: 10
Release Status: release

Hi. I think there is a bug when using $RANDOM in combination with here document 
or here string. When using here-doc/str one random number is consumed for 
generating filename for temporary file used in the redirection. Probably the 
bug also shows up always when temporay files are created with sh_mktmpfd().

If random seed is also set (e.g. RANDOM=42) and then different combinations are 
repeatedly tried: without redirection, here-doc, ..., different random 
sequences are obtained. In the case of here-doc/str the sequence is shifted one 
place left. Obviously one random number is consumed.

It think this is more a bug than a feature. However, you decide. See attached 
script random.sh which explores different cases.


1) In lib/sh/tmpfile.c in function sh_mktmpfd() replace get_random_number() 
with C's random(). Probably the same should be done in sh_mktmpname(). This fix 
is sufficient to fix the described bug. And also tested on Mac OS an Linux.

2) Another suggestion. Why not use pipes instead of temporay files? In redir.c 
a function here_document_to_fd() could be changed to something similar as:
static int
here_document_to_fd (redirectee, ri)
     WORD_DESC *redirectee;
     enum r_instruction ri;
  int r, fds[2];
  errno = r = 0;                /* XXX */

  if (pipe(fds) < 0)
        return -1;

  /* write_here_document returns 0 on success, errno on failure. */
  if (redirectee->word)
    r = (ri != r_reading_string) ? write_here_document (fds[1], redirectee)
                                 : write_here_string (fds[1], redirectee);

  close (fds[1]);
  if (r)
      close (fds[0]);
      return (-1);

  return (fds[0]);
This fixes the bug and also does not use temporay files which sometimes are not 
cleaned properly (tested on Linux), e.g. cat <<< $(sleep 42) and press Ctrl+C.

Jurij Mihelič

Attachment: random.sh
Description: Binary data

reply via email to

[Prev in Thread] Current Thread [Next in Thread]