@@ -148,6 +148,101 @@ PHP_MINIT_FUNCTION(magic)
148
148
}
149
149
/* }}} */
150
150
151
+ /* {{{ static void magic_set_error (int type, const char * format, ...)
152
+ */
153
+ static void magic_set_error (int type , const char * format , ...) {
154
+ va_list args ;
155
+ char * buffer = NULL ;
156
+ int buffer_len = 0 ;
157
+ #if PHP_VERSION_ID >= 80000
158
+ zend_string * zbuffer ;
159
+ #endif
160
+
161
+ // php_error_cb in main.c
162
+ va_start (args , format );
163
+ buffer_len = vspprintf (& buffer , PG (log_errors_max_len ), format , args );
164
+ va_end (args );
165
+
166
+ #if PHP_VERSION_ID >= 80000
167
+ zbuffer = zend_string_init (buffer , buffer_len , 0 );
168
+ #endif
169
+
170
+ #if PHP_VERSION_ID >= 80000
171
+ if (PG (last_error_message )) {
172
+ zend_string_release (PG (last_error_message ));
173
+ PG (last_error_message ) = NULL ;
174
+ }
175
+ if (PG (last_error_file )) {
176
+ free (PG (last_error_file ));
177
+ PG (last_error_file ) = NULL ;
178
+ }
179
+ #else
180
+ if ( PG (last_error_message ) ) {
181
+ #if PHP_VERSION_ID >= 70200
182
+ char * s = PG (last_error_message );
183
+ PG (last_error_message ) = NULL ;
184
+ free (s );
185
+ #else
186
+ free (PG (last_error_message ));
187
+ PG (last_error_message ) = NULL ;
188
+ #endif
189
+ }
190
+ if ( PG (last_error_file ) ) {
191
+ #if PHP_VERSION_ID >= 70200
192
+ char * s = PG (last_error_file );
193
+ PG (last_error_file ) = NULL ;
194
+ free (s );
195
+ #else
196
+ free (PG (last_error_file ));
197
+ PG (last_error_file ) = NULL ;
198
+ #endif
199
+ }
200
+ #endif
201
+ PG (last_error_lineno ) = 0 ;
202
+
203
+ /*
204
+ * last_error_file, last_error_lineno
205
+ * see also zend_error in zend.c
206
+ * -> zend_get_compiled_filename
207
+ * -> zend_get_executed_lineno
208
+ */
209
+ PG (last_error_type ) = type ;
210
+ #if PHP_VERSION_ID >= 80000
211
+ PG (last_error_message ) = zend_string_copy (zbuffer );
212
+ zend_string_release_ex (zbuffer , 0 );
213
+ #else
214
+ PG (last_error_message ) = strdup (buffer );
215
+ #endif
216
+ if ( zend_is_compiling () ) {
217
+ PG (last_error_file ) = strdup (ZSTR_VAL (zend_get_compiled_filename ()));
218
+ PG (last_error_lineno ) = zend_get_compiled_lineno ();
219
+ } else if ( zend_is_executing () ) {
220
+ PG (last_error_file ) = strdup (zend_get_executed_filename ());
221
+ PG (last_error_lineno ) = zend_get_executed_lineno ();
222
+ }
223
+
224
+ #if PHP_VERSION_ID < 70200
225
+ /*
226
+ * $php_errormsg don't support 7.2.0 and after.
227
+ */
228
+ if ( PG (track_errors ) ) {
229
+ zval tmp ;
230
+
231
+ ZVAL_STRINGL (& tmp , buffer , buffer_len );
232
+ if (EG (current_execute_data )) {
233
+ if (zend_set_local_var_str ("php_errormsg" , sizeof ("php_errormsg" )- 1 , & tmp , 0 ) == FAILURE ) {
234
+ zval_ptr_dtor (& tmp );
235
+ }
236
+ } else {
237
+ zend_hash_str_update_ind (& EG (symbol_table ), "php_errormsg" , sizeof ("php_errormsg" )- 1 , & tmp );
238
+ }
239
+ }
240
+ #endif
241
+ if ( buffer_len > 0 )
242
+ efree (buffer );
243
+ }
244
+ /* }}} */
245
+
151
246
/* {{{ proto filemagic(string path[, int flag[, string magic-path]]): string|false
152
247
* proto filemagic(string path[, string magic-path[, int flag]]): string|false
153
248
*/
@@ -180,12 +275,12 @@ ZEND_FUNCTION(filemagic) {
180
275
return ;
181
276
182
277
if ( ZSTR_LEN (path ) == 0 ) {
183
- php_error (E_WARNING , "The value of 1st argument was empty." );
278
+ magic_set_error (E_WARNING , "The value of 1st argument was empty." );
184
279
RETURN_FALSE ;
185
280
}
186
281
187
282
if ( stat (ZSTR_VAL (path ), & filestat ) != 0 ) {
188
- php_error (E_WARNING , "%s file not found." , ZSTR_VAL (path ));
283
+ magic_set_error (E_WARNING , "%s file not found." , ZSTR_VAL (path ));
189
284
RETURN_FALSE ;
190
285
}
191
286
@@ -202,7 +297,7 @@ ZEND_FUNCTION(filemagic) {
202
297
mpath = MAGIC ;
203
298
break ;
204
299
default :
205
- php_error (E_WARNING , "2th argument is only available for integer(flag) or MAGIC file path." );
300
+ magic_set_error (E_WARNING , "2th argument is only available for integer(flag) or MAGIC file path." );
206
301
RETURN_FALSE ;
207
302
}
208
303
} else if ( fargs == 3 ) {
@@ -213,7 +308,7 @@ ZEND_FUNCTION(filemagic) {
213
308
flag = Z_LVAL_P (zpath );
214
309
mpath = Z_STRLEN_P (zflag ) ? Z_STRVAL_P (zflag ) : MAGIC ;
215
310
} else {
216
- php_error (E_WARNING , "The 2th and 3th argument can only be integer or strings." );
311
+ magic_set_error (E_WARNING , "The 2th and 3th argument can only be integer or strings." );
217
312
RETURN_FALSE ;
218
313
}
219
314
}
@@ -223,18 +318,18 @@ ZEND_FUNCTION(filemagic) {
223
318
224
319
mp = magic_open (flag );
225
320
if ( mp == NULL ) {
226
- php_error (E_WARNING , strerror (errno ));
321
+ magic_set_error (E_WARNING , strerror (errno ));
227
322
RETURN_FALSE ;
228
323
}
229
324
230
325
if ( magic_load (mp , mpath ) == -1 ) {
231
- php_error (E_WARNING , magic_error (mp ));
326
+ magic_set_error (E_WARNING , magic_error (mp ));
232
327
magic_close (mp );
233
328
RETURN_FALSE ;
234
329
}
235
330
236
331
if ( (type = magic_file (mp , ZSTR_VAL (path ))) == NULL ) {
237
- php_error (E_WARNING , magic_error (mp ));
332
+ magic_set_error (E_WARNING , magic_error (mp ));
238
333
magic_close (mp );
239
334
RETURN_FALSE ;
240
335
}
0 commit comments