summaryrefslogtreecommitdiffstats
path: root/SOURCES/bash-4.0-security.patch
blob: 2b60b9dae197203d35ba74276cd2df9f7c64e769 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
Index: variables.c
===================================================================
--- variables.c.orig
+++ variables.c
@@ -1203,6 +1203,7 @@ init_seconds_var ()
   return v;      
 }
      
+#if !defined(linux)
 /* The random number seed.  You can change this by setting RANDOM. */
 static unsigned long rseed = 1;
 static int last_random_value;
@@ -1256,6 +1257,24 @@ seedrand ()
   sbrand (tv.tv_sec ^ tv.tv_usec ^ getpid ());
 }
 
+#else
+
+static int last_sbrand_pid;
+
+static int brand ()
+{
+  return random() & 32767;
+}
+
+static void sbrand (unsigned long seed)
+{
+  srandom(seed);
+}
+
+static void
+seedrand () {}
+#endif
+
 static SHELL_VAR *
 assign_random (self, value, unused, key)
      SHELL_VAR *self;
@@ -1264,8 +1283,10 @@ assign_random (self, value, unused, key)
      char *key;
 {
   sbrand (strtoul (value, (char **)NULL, 10));
+#if !defined(linux)
   if (subshell_environment)
     seeded_subshell = getpid ();
+#endif
   return (self);
 }
 
@@ -1274,6 +1295,7 @@ get_random_number ()
 {
   int rv, pid;
 
+#if !defined(linux)
   /* Reset for command and process substitution. */
   pid = getpid ();
   if (subshell_environment && seeded_subshell != pid)
@@ -1285,6 +1307,18 @@ get_random_number ()
   do
     rv = brand ();
   while (rv == last_random_value);
+#else
+  if (subshell_environment)
+    {
+      int mypid = getpid();
+      if (mypid != last_sbrand_pid)
+	{
+	  last_sbrand_pid = mypid;
+	  sbrand (mypid + NOW);
+	}
+    }
+  rv = brand();
+#endif
   return rv;
 }
 
@@ -1296,7 +1330,9 @@ get_random (var)
   char *p;
 
   rv = get_random_number ();
+#if !defined(linux)
   last_random_value = rv;
+#endif
   p = itos (rv);
 
   FREE (value_cell (var));