28
28
#if HAVE_GMP
29
29
30
30
#include <gmp.h>
31
- /* If you declare any globals in php_gmp.h uncomment this:
32
- ZEND_DECLARE_MODULE_GLOBALS(gmp)
33
- */
31
+
32
+ /* Needed for gmp_random() */
33
+ #include "ext/standard/php_rand.h"
34
+ #include "ext/standard/php_lcg.h"
35
+ #include <gmp-mparam.h>
36
+ #define GMP_ABS (x ) ((x) >= 0 ? (x) : -(x))
34
37
35
38
/* True global resources - no need for thread safety here */
36
39
static int le_gmp ;
@@ -90,13 +93,15 @@ zend_module_entry gmp_module_entry = {
90
93
ZEND_MODULE_STARTUP_N (gmp ),
91
94
ZEND_MODULE_SHUTDOWN_N (gmp ),
92
95
NULL ,
93
- NULL ,
96
+ ZEND_MODULE_DEACTIVATE_N ( gmp ) ,
94
97
ZEND_MODULE_INFO_N (gmp ),
95
98
NO_VERSION_YET ,
96
99
STANDARD_MODULE_PROPERTIES
97
100
};
98
101
/* }}} */
99
102
103
+ ZEND_DECLARE_MODULE_GLOBALS (gmp )
104
+
100
105
#ifdef COMPILE_DL_GMP
101
106
ZEND_GET_MODULE (gmp )
102
107
# ifdef PHP_WIN32
@@ -136,10 +141,20 @@ static void gmp_efree(void *ptr, size_t size)
136
141
}
137
142
/* }}} */
138
143
144
+ /* {{{ php_gmp_init_globals
145
+ */
146
+ static void php_gmp_init_globals (zend_gmp_globals * gmp_globals )
147
+ {
148
+ gmp_globals -> rand_initialized = 0 ;
149
+ }
150
+ /* }}} */
151
+
139
152
/* {{{ ZEND_MINIT_FUNCTION
140
153
*/
141
154
ZEND_MODULE_STARTUP_D (gmp )
142
155
{
156
+ ZEND_INIT_MODULE_GLOBALS (gmp , php_gmp_init_globals , NULL );
157
+
143
158
le_gmp = zend_register_list_destructors_ex (_php_gmpnum_free , NULL , GMP_RESOURCE_NAME , module_number );
144
159
REGISTER_LONG_CONSTANT ("GMP_ROUND_ZERO" , GMP_ROUND_ZERO , CONST_CS | CONST_PERSISTENT );
145
160
REGISTER_LONG_CONSTANT ("GMP_ROUND_PLUSINF" , GMP_ROUND_PLUSINF , CONST_CS | CONST_PERSISTENT );
@@ -151,6 +166,19 @@ ZEND_MODULE_STARTUP_D(gmp)
151
166
}
152
167
/* }}} */
153
168
169
+ /* {{{ ZEND_RSHUTDOWN_FUNCTION
170
+ */
171
+ ZEND_MODULE_DEACTIVATE_D (gmp )
172
+ {
173
+ if (GMPG (rand_initialized )) {
174
+ gmp_randclear (GMPG (rand_state ));
175
+ GMPG (rand_initialized ) = 0 ;
176
+ }
177
+
178
+ return SUCCESS ;
179
+ }
180
+ /* }}} */
181
+
154
182
/* {{{ ZEND_MSHUTDOWN_FUNCTION
155
183
*/
156
184
ZEND_MODULE_SHUTDOWN_D (gmp )
@@ -1042,7 +1070,17 @@ ZEND_FUNCTION(gmp_random)
1042
1070
}
1043
1071
1044
1072
INIT_GMP_NUM (gmpnum_result );
1045
- mpz_random (* gmpnum_result , limiter );
1073
+
1074
+ if (!GMPG (rand_initialized )) {
1075
+ /* Initialize */
1076
+ gmp_randinit_lc_2exp_size (GMPG (rand_state ), 32L );
1077
+
1078
+ /* Seed */
1079
+ gmp_randseed_ui (GMPG (rand_state ), GENERATE_SEED ());
1080
+
1081
+ GMPG (rand_initialized ) = 1 ;
1082
+ }
1083
+ mpz_urandomb (* gmpnum_result , GMPG (rand_state ), GMP_ABS (limiter ) * BITS_PER_MP_LIMB );
1046
1084
1047
1085
ZEND_REGISTER_RESOURCE (return_value , gmpnum_result , le_gmp );
1048
1086
}
0 commit comments