@@ -304,7 +304,7 @@ static int php_zip_add_file(ze_zip_object *obj, const char *filename, size_t fil
304
304
if (!zs ) {
305
305
return -1 ;
306
306
}
307
- // Replace
307
+ /* Replace */
308
308
if (replace >= 0 ) {
309
309
if (zip_file_replace (obj -> za , replace , zs , flags ) < 0 ) {
310
310
zip_source_free (zs );
@@ -313,7 +313,7 @@ static int php_zip_add_file(ze_zip_object *obj, const char *filename, size_t fil
313
313
zip_error_clear (obj -> za );
314
314
return 1 ;
315
315
}
316
- // Add
316
+ /* Add */
317
317
obj -> last_id = zip_file_add (obj -> za , entry_name , zs , flags );
318
318
if (obj -> last_id < 0 ) {
319
319
zip_source_free (zs );
@@ -436,18 +436,21 @@ static int php_zip_parse_options(zval *options, zend_long *remove_all_path,
436
436
437
437
static zend_long php_zip_status (ze_zip_object * obj ) /* {{{ */
438
438
{
439
+ int zep = obj -> err_zip ; /* saved err if closed */
440
+
441
+ if (obj -> za ) {
439
442
#if LIBZIP_VERSION_MAJOR < 1
440
- int zep , syp ;
443
+ int syp ;
441
444
442
- zip_error_get (obj -> za , & zep , & syp );
445
+ zip_error_get (obj -> za , & zep , & syp );
443
446
#else
444
- int zep ;
445
- zip_error_t * err ;
447
+ zip_error_t * err ;
446
448
447
- err = zip_get_error (obj -> za );
448
- zep = zip_error_code_zip (err );
449
- zip_error_fini (err );
449
+ err = zip_get_error (obj -> za );
450
+ zep = zip_error_code_zip (err );
451
+ zip_error_fini (err );
450
452
#endif
453
+ }
451
454
return zep ;
452
455
}
453
456
/* }}} */
@@ -460,26 +463,32 @@ static zend_long php_zip_last_id(ze_zip_object *obj) /* {{{ */
460
463
461
464
static zend_long php_zip_status_sys (ze_zip_object * obj ) /* {{{ */
462
465
{
466
+ int syp = obj -> err_sys ; /* saved err if closed */
467
+
468
+ if (obj -> za ) {
463
469
#if LIBZIP_VERSION_MAJOR < 1
464
- int zep , syp ;
470
+ int zep ;
465
471
466
- zip_error_get (obj -> za , & zep , & syp );
472
+ zip_error_get (obj -> za , & zep , & syp );
467
473
#else
468
- int syp ;
469
- zip_error_t * err ;
474
+ zip_error_t * err ;
470
475
471
- err = zip_get_error (obj -> za );
472
- syp = zip_error_code_system (err );
473
- zip_error_fini (err );
476
+ err = zip_get_error (obj -> za );
477
+ syp = zip_error_code_system (err );
478
+ zip_error_fini (err );
474
479
#endif
480
+ }
475
481
return syp ;
476
482
}
477
483
/* }}} */
478
484
479
485
static zend_long php_zip_get_num_files (ze_zip_object * obj ) /* {{{ */
480
486
{
481
- zip_int64_t num = zip_get_num_entries (obj -> za , 0 );
482
- return MIN (num , ZEND_LONG_MAX );
487
+ if (obj -> za ) {
488
+ zip_int64_t num = zip_get_num_entries (obj -> za , 0 );
489
+ return MIN (num , ZEND_LONG_MAX );
490
+ }
491
+ return 0 ;
483
492
}
484
493
/* }}} */
485
494
@@ -803,12 +812,10 @@ static zval *php_zip_property_reader(ze_zip_object *obj, zip_prop_handler *hnd,
803
812
zend_long retint = 0 ;
804
813
int len = 0 ;
805
814
806
- if (obj && obj -> za != NULL ) {
807
- if (hnd -> read_const_char_func ) {
808
- retchar = hnd -> read_const_char_func (obj , & len );
809
- } else if (hnd -> read_int_func ) {
810
- retint = hnd -> read_int_func (obj );
811
- }
815
+ if (hnd -> read_const_char_func ) {
816
+ retchar = hnd -> read_const_char_func (obj , & len );
817
+ } else if (hnd -> read_int_func ) {
818
+ retint = hnd -> read_int_func (obj );
812
819
}
813
820
814
821
switch (hnd -> type ) {
@@ -1488,7 +1495,23 @@ static ZIPARCHIVE_METHOD(close)
1488
1495
1489
1496
ze_obj = Z_ZIP_P (self );
1490
1497
1491
- if ((err = zip_close (intern ))) {
1498
+ err = zip_close (intern );
1499
+
1500
+ /* Save error for property reader */
1501
+ #if LIBZIP_VERSION_MAJOR < 1
1502
+ zip_error_get (obj -> za , & ze_obj -> err_zip , & ze_obj -> err_sys );
1503
+ #else
1504
+ {
1505
+ zip_error_t * ziperr ;
1506
+
1507
+ ziperr = zip_get_error (intern );
1508
+ ze_obj -> err_zip = zip_error_code_zip (ziperr );
1509
+ ze_obj -> err_sys = zip_error_code_system (ziperr );
1510
+ zip_error_fini (ziperr );
1511
+ }
1512
+ #endif
1513
+
1514
+ if (err ) {
1492
1515
#if LIBZIP_VERSION_MAJOR == 1 && LIBZIP_VERSION_MINOR == 3 && LIBZIP_VERSION_MICRO == 1
1493
1516
php_error_docref (NULL , E_WARNING , "zip_close have failed" );
1494
1517
#else
@@ -1533,30 +1556,42 @@ static ZIPARCHIVE_METHOD(count)
1533
1556
* Returns the status error message, system and/or zip messages */
1534
1557
static ZIPARCHIVE_METHOD (getStatusString )
1535
1558
{
1536
- struct zip * intern ;
1537
1559
zval * self = ZEND_THIS ;
1538
1560
#if LIBZIP_VERSION_MAJOR < 1
1539
1561
int zep , syp , len ;
1540
1562
char error_string [128 ];
1541
- #else
1542
- zip_error_t * err ;
1543
1563
#endif
1564
+ ze_zip_object * ze_obj ;
1544
1565
1545
1566
if (zend_parse_parameters_none () == FAILURE ) {
1546
1567
RETURN_THROWS ();
1547
1568
}
1548
1569
1549
- ZIP_FROM_OBJECT ( intern , self );
1570
+ ze_obj = Z_ZIP_P ( self ); /* not ZIP_FROM_OBJECT as we can use saved error after close */
1550
1571
1551
1572
#if LIBZIP_VERSION_MAJOR < 1
1552
- zip_error_get (intern , & zep , & syp );
1553
-
1554
- len = zip_error_to_str (error_string , 128 , zep , syp );
1573
+ if (ze_obj -> za ) {
1574
+ zip_error_get (ze_obj -> za , & zep , & syp );
1575
+ len = zip_error_to_str (error_string , 128 , zep , syp );
1576
+ } else {
1577
+ len = zip_error_to_str (error_string , 128 , ze_obj -> err_zip , ze_obj -> err_sys );
1578
+ }
1555
1579
RETVAL_STRINGL (error_string , len );
1556
1580
#else
1557
- err = zip_get_error (intern );
1558
- RETVAL_STRING (zip_error_strerror (err ));
1559
- zip_error_fini (err );
1581
+ if (ze_obj -> za ) {
1582
+ zip_error_t * err ;
1583
+
1584
+ err = zip_get_error (ze_obj -> za );
1585
+ RETVAL_STRING (zip_error_strerror (err ));
1586
+ zip_error_fini (err );
1587
+ } else {
1588
+ zip_error_t err ;
1589
+
1590
+ zip_error_init_with_code (& err , ze_obj -> err_zip );
1591
+ err .sys_err = ze_obj -> err_sys ; /* missing setter */
1592
+ RETVAL_STRING (zip_error_strerror (& err ));
1593
+ zip_error_fini (& err );
1594
+ }
1560
1595
#endif
1561
1596
}
1562
1597
/* }}} */
@@ -3159,7 +3194,7 @@ static PHP_MINIT_FUNCTION(zip)
3159
3194
REGISTER_ZIP_CLASS_CONST_LONG ("OPSYS_OS_2" , ZIP_OPSYS_OS_2 );
3160
3195
REGISTER_ZIP_CLASS_CONST_LONG ("OPSYS_MACINTOSH" , ZIP_OPSYS_MACINTOSH );
3161
3196
REGISTER_ZIP_CLASS_CONST_LONG ("OPSYS_Z_SYSTEM" , ZIP_OPSYS_Z_SYSTEM );
3162
- REGISTER_ZIP_CLASS_CONST_LONG ("OPSYS_Z_CPM" , ZIP_OPSYS_CPM ); // typo kept for BC
3197
+ REGISTER_ZIP_CLASS_CONST_LONG ("OPSYS_Z_CPM" , ZIP_OPSYS_CPM ); /* typo kept for BC */
3163
3198
REGISTER_ZIP_CLASS_CONST_LONG ("OPSYS_CPM" , ZIP_OPSYS_CPM );
3164
3199
REGISTER_ZIP_CLASS_CONST_LONG ("OPSYS_WINDOWS_NTFS" , ZIP_OPSYS_WINDOWS_NTFS );
3165
3200
REGISTER_ZIP_CLASS_CONST_LONG ("OPSYS_MVS" , ZIP_OPSYS_MVS );
0 commit comments