diff options
| author | Phillip Lord | 2016-01-15 22:20:34 +0000 |
|---|---|---|
| committer | Phillip Lord | 2016-01-15 22:20:34 +0000 |
| commit | bb0cd3193912032ae11a27016271d4587f876f98 (patch) | |
| tree | d07e7bade1a79bec532447af64c9a5e1e63fc7ee /src | |
| parent | 549a765efeca2748e68a5c6ce6c9238784e82535 (diff) | |
| parent | 9e5452f7166e3634f2d8e943815ed722e1672714 (diff) | |
| download | emacs-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.c | 4 | ||||
| -rw-r--r-- | src/fns.c | 3 | ||||
| -rw-r--r-- | src/sysdep.c | 31 | ||||
| -rw-r--r-- | src/w32.c | 32 | ||||
| -rw-r--r-- | src/w32.h | 3 | ||||
| -rw-r--r-- | src/window.c | 10 |
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 | } |
| @@ -50,7 +50,8 @@ All integers representable in Lisp, i.e. between `most-negative-fixnum' | |||
| 50 | and `most-positive-fixnum', inclusive, are equally likely. | 50 | and `most-positive-fixnum', inclusive, are equally likely. |
| 51 | 51 | ||
| 52 | With positive integer LIMIT, return random number in interval [0,LIMIT). | 52 | With positive integer LIMIT, return random number in interval [0,LIMIT). |
| 53 | With argument t, set the random number seed from the current time and pid. | 53 | With argument t, set the random number seed from the system's entropy |
| 54 | pool, or from the current time and pid if entropy is unavailable. | ||
| 54 | With a string argument, set the seed based on the string's contents. | 55 | With a string argument, set the seed based on the string's contents. |
| 55 | Other values of LIMIT are ignored. | 56 | Other 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) | |||
| 2095 | void | 2095 | void |
| 2096 | init_random (void) | 2096 | init_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 | ||
| @@ -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 | ||
| 2098 | static HCRYPTPROV w32_crypto_hprov; | ||
| 2099 | static int | ||
| 2100 | w32_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 | |||
| 2113 | int | ||
| 2114 | w32_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 | |||
| 2096 | int | 2126 | int |
| 2097 | random (void) | 2127 | random (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 */ |
| @@ -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. */ |
| 223 | extern int w32_compare_strings (const char *, const char *, char *, int); | 223 | extern int w32_compare_strings (const char *, const char *, char *, int); |
| 224 | 224 | ||
| 225 | /* Return a cryptographically secure seed for PRNG. */ | ||
| 226 | extern 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. */ | ||
| 3976 | void | 3978 | void |
| 3977 | resize_frame_windows (struct frame *f, int size, bool horflag, bool pixelwise) | 3979 | resize_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 |