shithub: drawterm

Download patch

ref: d14cd19f715966e736d7439aac7909f83f7a9159
parent: 58bf8cb855d51859f11f4e1bc1f84feff1fd5b29
author: cinap_lenrek <[email protected]>
date: Sat Aug 20 23:09:57 EDT 2016

kern/win32: use RtlGenRandom() instead for randrom source, fix oserrstr()

use the systems cryptographic random number generator
instead of hashing perormance timestamp counters.

oserror() was broken due to oserrstr() referencing up
before calling osrerrstr() function, which resulted in
GetLastError() always returning 0. instead, remove
osrerrstr() and call GetLastError() first.

also remove the table with the socket error codes,
FormatMessage() deals with it.

--- a/kern/win32.c
+++ b/kern/win32.c
@@ -137,29 +137,8 @@
 	ReleaseSemaphore(op->sema, 1, 0);
 }
 
-void
-random20(uchar *p)
-{
-	LARGE_INTEGER ti;
-	int i, j;
-	FILETIME ft;
-	DigestState ds;
-	vlong tsc;
-	
-	GetSystemTimeAsFileTime(&ft);
-	memset(&ds, 0, sizeof ds);
-	sha1((uchar*)&ft, sizeof(ft), 0, &ds);
-	for(i=0; i<50; i++) {
-		for(j=0; j<10; j++) {
-			QueryPerformanceCounter(&ti);
-			sha1((uchar*)&ti, sizeof(ti), 0, &ds);
-			tsc = GetTickCount();
-			sha1((uchar*)&tsc, sizeof(tsc), 0, &ds);
-		}
-		Sleep(10);
-	}
-	sha1(0, 0, p, &ds);
-}
+#define RtlGenRandom	SystemFunction036
+BOOLEAN WINAPI RtlGenRandom(PVOID, ULONG);
 
 void
 randominit(void)
@@ -169,16 +148,7 @@
 ulong
 randomread(void *v, ulong n)
 {
-	int i;
-	uchar p[20];
-	
-	for(i=0; i<n; i+=20){
-		random20(p);
-		if(i+20 <= n)
-			memmove((char*)v+i, p, 20);
-		else
-			memmove((char*)v+i, p, n-i);
-	}
+	RtlGenRandom(v, n);
 	return n;
 }
 
@@ -194,22 +164,6 @@
 	return GetTickCount();
 }
 
-#if 0
-uvlong
-fastticks(uvlong *v)
-{
-	uvlong n;
-
-	n = GetTickCount() * 1000 * 1000;
-	if(v)
-		*v = n;
-	return n;
-}
-#endif
-
-extern int	main(int, char*[]);
-
-
 int
 wstrutflen(Rune *s)
 {
@@ -243,41 +197,6 @@
 	return s-s0;
 }
 
-int
-wstrlen(Rune *s)
-{
-	int n;
-
-	for(n=0; *s; s++,n++)
-		;
-	return n;
-}
-static int	args(char *argv[], int n, char *p);
-
-int APIENTRY
-WinMain(HINSTANCE x, HINSTANCE y, LPSTR z, int w)
-{
-	int argc, n;
-	char *arg, *p, **argv;
-	wchar_t *warg;
-
-	warg = GetCommandLineW();
-	n = wcslen(warg)*UTFmax+1;
-	arg = malloc(n);
-	WideCharToMultiByte(CP_UTF8,0,warg,-1,arg,n,0,0);
-
-	/* conservative guess at the number of args */
-	for(argc=4,p=arg; *p; p++)
-		if(*p == ' ' || *p == '\t')
-			argc++;
-	argv = malloc(argc*sizeof(char*));
-	argc = args(argv, argc, arg);
-
-	mymain(argc, argv);
-	ExitThread(0);
-	return 0;
-}
-
 /*
  * Break the command line into arguments
  * The rules for this are not documented but appear to be the following
@@ -326,81 +245,47 @@
 
 	return i;
 }
-/*
- * Windows socket error messages
- * There must be a way to get these strings out of the library.
- * This table is derived from the MSDN online help.
- */
-static struct {
-	int e;
-	char *s;
-} tab[] = {
-	{ 10004, "interrupted function call" },
-	{ 10013, "permission denied" },
-	{ 10014, "bad address" },
-	{ 10022, "invalid argument" },
-	{ 10024, "too many open files" },
-	{ 10035, "resource temporarily unavailable" },
-	{ 10036, "operation now in progress" },
-	{ 10037, "operation already in progress" },
-	{ 10038, "socket operation on nonsocket" },
-	{ 10039, "destination address required" },
-	{ 10040, "message too long" },
-	{ 10041, "protocol wrong type for socket" },
-	{ 10042, "bad protocol option" },
-	{ 10043, "protocol not supported" },
-	{ 10044, "socket type not supported" },
-	{ 10045, "operation not supported" },
-	{ 10046, "protocol family not supported" },
-	{ 10047, "address family not supported by protocol family" },
-	{ 10048, "address already in use" },
-	{ 10049, "cannot assign requested address" },
-	{ 10050, "network is down" },
-	{ 10051, "network is unreachable" },
-	{ 10052, "network dropped connection on reset" },
-	{ 10053, "software caused connection abort" },
-	{ 10054, "connection reset by peer" },
-	{ 10055, "no buffer space available" },
-	{ 10056, "socket is already connected" },
-	{ 10057, "socket is not connected" },
-	{ 10058, "cannot send after socket shutdown" },
-	{ 10060, "connection timed out" },
-	{ 10061, "connection refused" },
-	{ 10064, "host is down" },
-	{ 10065, "no route to host" },
-	{ 10067, "too many processes" },
-	{ 10091, "network subsystem is unavailable" },
-	{ 10092, "winsock.dll version out of range" },
-	{ 10093, "wsastartup not called" },
-	{ 10101, "graceful shutdown in progress" },
-	{ 10109, "class type not found" },
-	{ 11001, "host name not found" },
-	{ 11002, "host not found (non-authoritative)" },
-	{ 11003, "nonrecoverable error" },
-	{ 11004, "valid name, but no data record of requested type" },
-};
 
+extern int	main(int, char*[]);
+
+int APIENTRY
+WinMain(HINSTANCE x, HINSTANCE y, LPSTR z, int w)
+{
+	int argc, n;
+	char *arg, *p, **argv;
+	wchar_t *warg;
+
+	warg = GetCommandLineW();
+	n = wcslen(warg)*UTFmax+1;
+	arg = malloc(n);
+	WideCharToMultiByte(CP_UTF8,0,warg,-1,arg,n,0,0);
+
+	/* conservative guess at the number of args */
+	for(argc=4,p=arg; *p; p++)
+		if(*p == ' ' || *p == '\t')
+			argc++;
+	argv = malloc(argc*sizeof(char*));
+	argc = args(argv, argc, arg);
+
+	main(argc, argv);
+	ExitThread(0);
+	return 0;
+}
+
 void
-osrerrstr(char *buf, uint nbuf)
+oserrstr(void)
 {
 	char *p, *q;
-	int e, i, r;
+	int e, r;
 
 	e = GetLastError();
+	p = up->errstr;	/* up kills last error */
 	r = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM,
 		0, e, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
-		buf, nbuf, 0);
-	if(r == 0){
-		for(i=0; i<nelem(tab); i++)
-			if(tab[i].e == e){
-				strecpy(buf, buf+nbuf, tab[i].s);
-				break;
-			}
-		if(i==nelem(tab))
-			snprint(buf, nbuf, "windows error %d", e);
-	}
-
-	for(p=q=buf; *p; p++) {
+		p, ERRMAX, 0);
+	if(r == 0)
+		snprint(p, ERRMAX, "windows error %d", e);
+	for(q=p; *p; p++) {
 		if(*p == '\r')
 			continue;
 		if(*p == '\n')
@@ -409,12 +294,6 @@
 			*q++ = *p;
 	}
 	*q = '\0';
-}
-
-void
-oserrstr(void)
-{
-	osrerrstr(up->errstr, ERRMAX);
 }
 
 long