aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPhillip Lord2016-01-15 22:20:34 +0000
committerPhillip Lord2016-01-15 22:20:34 +0000
commitbb0cd3193912032ae11a27016271d4587f876f98 (patch)
treed07e7bade1a79bec532447af64c9a5e1e63fc7ee /src
parent549a765efeca2748e68a5c6ce6c9238784e82535 (diff)
parent9e5452f7166e3634f2d8e943815ed722e1672714 (diff)
downloademacs-bb0cd3193912032ae11a27016271d4587f876f98.tar.gz
emacs-bb0cd3193912032ae11a27016271d4587f876f98.zip
Merge branch 'emacs-25' of git.sv.gnu.org:/srv/git/emacs into emacs-25
Diffstat (limited to 'src')
-rw-r--r--src/dispnew.c4
-rw-r--r--src/fns.c3
-rw-r--r--src/sysdep.c31
-rw-r--r--src/w32.c32
-rw-r--r--src/w32.h3
-rw-r--r--src/window.c10
6 files changed, 75 insertions, 8 deletions
diff --git a/src/dispnew.c b/src/dispnew.c
index 8d671f82e47..3e1557fa3b9 100644
--- a/src/dispnew.c
+++ b/src/dispnew.c
@@ -320,7 +320,9 @@ margin_glyphs_to_reserve (struct window *w, int total_glyphs, int margin)
320 int width = w->total_cols; 320 int width = w->total_cols;
321 double d = max (0, margin); 321 double d = max (0, margin);
322 d = min (width / 2 - 1, d); 322 d = min (width / 2 - 1, d);
323 return (int) ((double) total_glyphs / width * d); 323 /* Since MARGIN is positive, we cannot possibly have less than
324 one glyph for the marginal area. */
325 return max (1, (int) ((double) total_glyphs / width * d));
324 } 326 }
325 return 0; 327 return 0;
326} 328}
diff --git a/src/fns.c b/src/fns.c
index 977229b97b7..19fa44086c9 100644
--- a/src/fns.c
+++ b/src/fns.c
@@ -50,7 +50,8 @@ All integers representable in Lisp, i.e. between `most-negative-fixnum'
50and `most-positive-fixnum', inclusive, are equally likely. 50and `most-positive-fixnum', inclusive, are equally likely.
51 51
52With positive integer LIMIT, return random number in interval [0,LIMIT). 52With positive integer LIMIT, return random number in interval [0,LIMIT).
53With argument t, set the random number seed from the current time and pid. 53With argument t, set the random number seed from the system's entropy
54pool, or from the current time and pid if entropy is unavailable.
54With a string argument, set the seed based on the string's contents. 55With a string argument, set the seed based on the string's contents.
55Other values of LIMIT are ignored. 56Other values of LIMIT are ignored.
56 57
diff --git a/src/sysdep.c b/src/sysdep.c
index a78c4c64c81..1fa422947ed 100644
--- a/src/sysdep.c
+++ b/src/sysdep.c
@@ -2095,8 +2095,35 @@ seed_random (void *seed, ptrdiff_t seed_size)
2095void 2095void
2096init_random (void) 2096init_random (void)
2097{ 2097{
2098 struct timespec t = current_timespec (); 2098 uintmax_t v;
2099 uintmax_t v = getpid () ^ t.tv_sec ^ t.tv_nsec; 2099 struct timespec t;
2100 bool success = false;
2101
2102#if HAVE_DEV_URANDOM
2103 FILE *fp = fopen ("/dev/urandom", "rb");
2104
2105 if (fp)
2106 {
2107 int i;
2108
2109 for (i = 0, v = 0; i < sizeof (uintmax_t); i++)
2110 {
2111 v <<= 8;
2112 v |= fgetc (fp);
2113 }
2114 fclose (fp);
2115 success = true;
2116 }
2117#elif defined WINDOWSNT
2118 if (w32_init_random (&v, sizeof v) == 0)
2119 success = true;
2120#endif /* HAVE_DEV_URANDOM || WINDOWSNT */
2121 if (!success)
2122 {
2123 /* Fall back to current time value + PID. */
2124 t = current_timespec ();
2125 v = getpid () ^ t.tv_sec ^ t.tv_nsec;
2126 }
2100 seed_random (&v, sizeof v); 2127 seed_random (&v, sizeof v);
2101} 2128}
2102 2129
diff --git a/src/w32.c b/src/w32.c
index ea3a9dafad5..7884bad619c 100644
--- a/src/w32.c
+++ b/src/w32.c
@@ -224,6 +224,8 @@ typedef struct _REPARSE_DATA_BUFFER {
224 224
225#include <iphlpapi.h> /* should be after winsock2.h */ 225#include <iphlpapi.h> /* should be after winsock2.h */
226 226
227#include <wincrypt.h>
228
227#include <c-strcase.h> 229#include <c-strcase.h>
228 230
229#include "w32.h" 231#include "w32.h"
@@ -2093,6 +2095,34 @@ init_user_info (void)
2093 CloseHandle (token); 2095 CloseHandle (token);
2094} 2096}
2095 2097
2098static HCRYPTPROV w32_crypto_hprov;
2099static int
2100w32_init_crypt_random (void)
2101{
2102 if (!CryptAcquireContext (&w32_crypto_hprov, NULL, NULL, PROV_RSA_FULL,
2103 CRYPT_VERIFYCONTEXT | CRYPT_SILENT))
2104 {
2105 DebPrint (("CryptAcquireContext failed with error %x\n",
2106 GetLastError ()));
2107 w32_crypto_hprov = 0;
2108 return -1;
2109 }
2110 return 0;
2111}
2112
2113int
2114w32_init_random (void *buf, ptrdiff_t buflen)
2115{
2116 if (!w32_crypto_hprov)
2117 w32_init_crypt_random ();
2118 if (w32_crypto_hprov)
2119 {
2120 if (CryptGenRandom (w32_crypto_hprov, buflen, (BYTE *)buf))
2121 return 0;
2122 }
2123 return -1;
2124}
2125
2096int 2126int
2097random (void) 2127random (void)
2098{ 2128{
@@ -9410,6 +9440,8 @@ globals_of_w32 (void)
9410 extern void dynlib_reset_last_error (void); 9440 extern void dynlib_reset_last_error (void);
9411 dynlib_reset_last_error (); 9441 dynlib_reset_last_error ();
9412#endif 9442#endif
9443
9444 w32_crypto_hprov = (HCRYPTPROV)0;
9413} 9445}
9414 9446
9415/* For make-serial-process */ 9447/* For make-serial-process */
diff --git a/src/w32.h b/src/w32.h
index 501056d38c6..ba3fec8b7e6 100644
--- a/src/w32.h
+++ b/src/w32.h
@@ -222,6 +222,9 @@ extern int w32_memory_info (unsigned long long *, unsigned long long *,
222/* Compare 2 UTF-8 strings in locale-dependent fashion. */ 222/* Compare 2 UTF-8 strings in locale-dependent fashion. */
223extern int w32_compare_strings (const char *, const char *, char *, int); 223extern int w32_compare_strings (const char *, const char *, char *, int);
224 224
225/* Return a cryptographically secure seed for PRNG. */
226extern int w32_init_random (void *, ptrdiff_t);
227
225#ifdef HAVE_GNUTLS 228#ifdef HAVE_GNUTLS
226#include <gnutls/gnutls.h> 229#include <gnutls/gnutls.h>
227 230
diff --git a/src/window.c b/src/window.c
index bb414e7d311..bbe47c7255a 100644
--- a/src/window.c
+++ b/src/window.c
@@ -3970,9 +3970,11 @@ values. */)
3970} 3970}
3971 3971
3972 3972
3973/* Resize frame F's windows when number of lines of F is set to SIZE. 3973/* Resize frame F's windows when F's width or height is set to SIZE.
3974 HORFLAG means resize windows when number of columns of F is set to 3974 If HORFLAG is zero, F's width was set to SIZE, otherwise its height
3975 SIZE. PIXELWISE means to interpret SIZE as pixels. */ 3975 was set. SIZE is interpreted in F's canonical character units
3976 (a.k.a. "columns" or "lines"), unless PIXELWISE is non-zero, which
3977 means to interpret SIZE in pixel units. */
3976void 3978void
3977resize_frame_windows (struct frame *f, int size, bool horflag, bool pixelwise) 3979resize_frame_windows (struct frame *f, int size, bool horflag, bool pixelwise)
3978{ 3980{
@@ -4073,7 +4075,7 @@ resize_frame_windows (struct frame *f, int size, bool horflag, bool pixelwise)
4073 m = XWINDOW (mini); 4075 m = XWINDOW (mini);
4074 if (horflag) 4076 if (horflag)
4075 { 4077 {
4076 m->total_cols = size; 4078 m->total_cols = new_size;
4077 m->pixel_width = new_pixel_size; 4079 m->pixel_width = new_pixel_size;
4078 } 4080 }
4079 else 4081 else