* mirbsdksh and mirosksh != rksh
* use arc4random familiy for randomness, if exists * feed back randomness on reseed and variable assignments
This commit is contained in:
9
ksh.1tbl
9
ksh.1tbl
@ -1,4 +1,4 @@
|
|||||||
.\" $MirBSD: ksh.1tbl,v 1.21 2004/04/26 18:38:19 tg Exp $
|
.\" $MirBSD: ksh.1tbl,v 1.22 2004/04/27 19:59:55 tg Exp $
|
||||||
.\" $OpenBSD: ksh.1tbl,v 1.65 2004/01/23 23:08:45 jmc Exp $
|
.\" $OpenBSD: ksh.1tbl,v 1.65 2004/01/23 23:08:45 jmc Exp $
|
||||||
.\"
|
.\"
|
||||||
.\" Copyright (c) 1980, 1990, 1993
|
.\" Copyright (c) 1980, 1990, 1993
|
||||||
@ -1565,6 +1565,13 @@ The point in the series can be set by assigning a number to
|
|||||||
.Ev RANDOM
|
.Ev RANDOM
|
||||||
(see
|
(see
|
||||||
.Xr rand 3 ) .
|
.Xr rand 3 ) .
|
||||||
|
.Pp
|
||||||
|
On systems which provide the
|
||||||
|
.Xr arc4random 3
|
||||||
|
function, the random value is seeded on start by the arcfour
|
||||||
|
random number generator.
|
||||||
|
If a feedback function is provided, changed values are propagated
|
||||||
|
back to the arcfour random number generator.
|
||||||
.It Ev REPLY
|
.It Ev REPLY
|
||||||
Default parameter for the
|
Default parameter for the
|
||||||
.Ic read
|
.Ic read
|
||||||
|
14
main.c
14
main.c
@ -1,4 +1,4 @@
|
|||||||
/* $MirBSD: main.c,v 1.5 2004/04/26 18:38:20 tg Exp $ */
|
/* $MirBSD: main.c,v 1.6 2004/04/27 19:59:56 tg Exp $ */
|
||||||
/* $OpenBSD: main.c,v 1.26 2004/01/08 05:43:14 jmc Exp $ */
|
/* $OpenBSD: main.c,v 1.26 2004/01/08 05:43:14 jmc Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -94,6 +94,9 @@ main(int argc, char *argv[])
|
|||||||
char **wp;
|
char **wp;
|
||||||
struct env env;
|
struct env env;
|
||||||
pid_t ppid;
|
pid_t ppid;
|
||||||
|
#ifdef KSH
|
||||||
|
long trnd;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef MEM_DEBUG
|
#ifdef MEM_DEBUG
|
||||||
chmem_set_defaults("ct", 1);
|
chmem_set_defaults("ct", 1);
|
||||||
@ -115,6 +118,9 @@ main(int argc, char *argv[])
|
|||||||
argc = 1;
|
argc = 1;
|
||||||
}
|
}
|
||||||
kshname = *argv;
|
kshname = *argv;
|
||||||
|
#ifdef KSH
|
||||||
|
trnd = *((long *)kshname);
|
||||||
|
#endif
|
||||||
|
|
||||||
ainit(&aperm); /* initialize permanent Area */
|
ainit(&aperm); /* initialize permanent Area */
|
||||||
|
|
||||||
@ -256,7 +262,8 @@ main(int argc, char *argv[])
|
|||||||
ppid = getppid();
|
ppid = getppid();
|
||||||
setint(global("PPID"), (long) ppid);
|
setint(global("PPID"), (long) ppid);
|
||||||
#ifdef KSH
|
#ifdef KSH
|
||||||
setint(global("RANDOM"), (long) (time((time_t *)0) * kshpid * ppid));
|
trnd ^= ((long) (time((time_t *)0) * kshpid * ppid));
|
||||||
|
setint(global("RANDOM"), prng_seed(trnd));
|
||||||
#endif /* KSH */
|
#endif /* KSH */
|
||||||
/* setstr can't fail here */
|
/* setstr can't fail here */
|
||||||
setstr(global(version_param), ksh_version, KSH_RETURN_ERROR);
|
setstr(global(version_param), ksh_version, KSH_RETURN_ERROR);
|
||||||
@ -848,7 +855,8 @@ is_restricted(name)
|
|||||||
if ((p = ksh_strrchr_dirsep(name)))
|
if ((p = ksh_strrchr_dirsep(name)))
|
||||||
name = p;
|
name = p;
|
||||||
/* accepts rsh, rksh, rpdksh, pdrksh, etc. */
|
/* accepts rsh, rksh, rpdksh, pdrksh, etc. */
|
||||||
return (p = strchr(name, 'r')) && strstr(p, "sh");
|
return (p = strchr(name, 'r')) && strstr(p, "sh")
|
||||||
|
&& !strstr(p-2, "mirbsdksh") && !strstr(p-2, "mirosksh");
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
2
proto.h
2
proto.h
@ -1,3 +1,4 @@
|
|||||||
|
/* $MirBSD: proto.h,v 1.2 2004/04/27 19:59:57 tg Exp $ */
|
||||||
/* $OpenBSD: proto.h,v 1.11 2003/05/16 19:58:57 jsyn Exp $ */
|
/* $OpenBSD: proto.h,v 1.11 2003/05/16 19:58:57 jsyn Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -275,6 +276,7 @@ void change_random ARGS((void));
|
|||||||
int array_ref_len ARGS((const char *cp));
|
int array_ref_len ARGS((const char *cp));
|
||||||
char * arrayname ARGS((const char *str));
|
char * arrayname ARGS((const char *str));
|
||||||
void set_array ARGS((const char *var, int reset, char **vals));
|
void set_array ARGS((const char *var, int reset, char **vals));
|
||||||
|
long prng_seed ARGS((long));
|
||||||
/* version.c */
|
/* version.c */
|
||||||
/* vi.c: see edit.h */
|
/* vi.c: see edit.h */
|
||||||
|
|
||||||
|
38
var.c
38
var.c
@ -1,4 +1,4 @@
|
|||||||
/* $MirBSD: var.c,v 1.2 2004/04/17 00:47:20 tg Exp $ */
|
/* $MirBSD: var.c,v 1.3 2004/04/27 19:59:57 tg Exp $ */
|
||||||
/* $OpenBSD: var.c,v 1.16 2003/08/05 20:52:27 millert Exp $ */
|
/* $OpenBSD: var.c,v 1.16 2003/08/05 20:52:27 millert Exp $ */
|
||||||
|
|
||||||
#include "sh.h"
|
#include "sh.h"
|
||||||
@ -891,7 +891,7 @@ makenv()
|
|||||||
void
|
void
|
||||||
change_random()
|
change_random()
|
||||||
{
|
{
|
||||||
rand();
|
prng_seed(rand());
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1046,7 +1046,8 @@ setspec(vp)
|
|||||||
break;
|
break;
|
||||||
case V_RANDOM:
|
case V_RANDOM:
|
||||||
vp->flag &= ~SPECIAL;
|
vp->flag &= ~SPECIAL;
|
||||||
srand((unsigned int)intval(vp));
|
srand(prng_seed(((unsigned int)intval(vp))
|
||||||
|
^ ((unsigned long)rand() << 24)));
|
||||||
vp->flag |= SPECIAL;
|
vp->flag |= SPECIAL;
|
||||||
break;
|
break;
|
||||||
case V_SECONDS:
|
case V_SECONDS:
|
||||||
@ -1237,3 +1238,34 @@ set_array(var, reset, vals)
|
|||||||
setstr(vq, vals[i], KSH_RETURN_ERROR);
|
setstr(vq, vals[i], KSH_RETURN_ERROR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return a seed PRNG value, and feed one back to arc4random */
|
||||||
|
long
|
||||||
|
prng_seed(val)
|
||||||
|
long val;
|
||||||
|
{
|
||||||
|
unsigned long i, j;
|
||||||
|
|
||||||
|
#ifdef HAVE_ARC4RANDOM
|
||||||
|
i = arc4random();
|
||||||
|
#else
|
||||||
|
i = ((long) (time((time_t *)0) * getpid()));
|
||||||
|
#endif
|
||||||
|
j = (rand() << 16) | rand();
|
||||||
|
|
||||||
|
i ^= val;
|
||||||
|
j ^= val;
|
||||||
|
|
||||||
|
#if defined(HAVE_ARC4RANDOM_PUSH)
|
||||||
|
arc4random_push(j);
|
||||||
|
#elif defined(HAVE_ARC4RANDOM_ADDRANDOM)
|
||||||
|
arc4random_addrandom(&j, sizeof (j));
|
||||||
|
#else
|
||||||
|
while (j) {
|
||||||
|
rand();
|
||||||
|
j >>= 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user