From fbec873118715249f072b32ddd08e5014176cfe2 Mon Sep 17 00:00:00 2001
From: Joe Watkins <krakjoe@php.net>
Date: Thu, 29 Sep 2016 12:02:14 +0100
Subject: [PATCH] fix #19

---
 apc_cache.c | 96 +++++++++++++++++++++++++++--------------------------
 1 file changed, 49 insertions(+), 47 deletions(-)

diff --git a/apc_cache.c b/apc_cache.c
index 5009c26a..b32607e5 100644
--- a/apc_cache.c
+++ b/apc_cache.c
@@ -1538,63 +1538,65 @@ PHP_APCU_API zval* apc_cache_info(apc_cache_t* cache, zend_bool limited TSRMLS_D
     /* read lock header */
     APC_RLOCK(cache->header);
 
-    array_init(info);
-    add_assoc_long(info, "num_slots", cache->nslots);
-    add_assoc_long(info, "ttl", cache->ttl);
-    add_assoc_double(info, "num_hits", (double)cache->header->nhits);
-    add_assoc_double(info, "num_misses", (double)cache->header->nmisses);
-    add_assoc_double(info, "num_inserts", (double)cache->header->ninserts);
-    add_assoc_long(info,   "num_entries", cache->header->nentries);
-    add_assoc_double(info, "expunges", (double)cache->header->nexpunges);
-    add_assoc_long(info, "start_time", cache->header->stime);
-    add_assoc_double(info, "mem_size", (double)cache->header->mem_size);
+    zend_try {
+		array_init(info);
+		add_assoc_long(info, "num_slots", cache->nslots);
+		add_assoc_long(info, "ttl", cache->ttl);
+		add_assoc_double(info, "num_hits", (double)cache->header->nhits);
+		add_assoc_double(info, "num_misses", (double)cache->header->nmisses);
+		add_assoc_double(info, "num_inserts", (double)cache->header->ninserts);
+		add_assoc_long(info,   "num_entries", cache->header->nentries);
+		add_assoc_double(info, "expunges", (double)cache->header->nexpunges);
+		add_assoc_long(info, "start_time", cache->header->stime);
+		add_assoc_double(info, "mem_size", (double)cache->header->mem_size);
 
 #ifdef MULTIPART_EVENT_FORMDATA
-    add_assoc_long(info, "file_upload_progress", 1);
+		add_assoc_long(info, "file_upload_progress", 1);
 #else
-    add_assoc_long(info, "file_upload_progress", 0);
+		add_assoc_long(info, "file_upload_progress", 0);
 #endif
 #if APC_MMAP
-    add_assoc_stringl(info, "memory_type", "mmap", sizeof("mmap")-1, 1);
+		add_assoc_stringl(info, "memory_type", "mmap", sizeof("mmap")-1, 1);
 #else
-    add_assoc_stringl(info, "memory_type", "IPC shared", sizeof("IPC shared")-1, 1);
+		add_assoc_stringl(info, "memory_type", "IPC shared", sizeof("IPC shared")-1, 1);
 #endif
 
-    if (!limited) {
-        /* For each hashtable slot */
-        ALLOC_INIT_ZVAL(list);
-        array_init(list);
-
-        ALLOC_INIT_ZVAL(slots);
-        array_init(slots);
-
-        for (i = 0; i < cache->nslots; i++) {
-            p = cache->slots[i];
-            j = 0;
-            for (; p != NULL; p = p->next) {
-                zval *link = apc_cache_link_info(cache, p TSRMLS_CC);
-                add_next_index_zval(list, link);
-                j++;
-            }
-            if(j != 0) {
-                add_index_long(slots, (ulong)i, j);
-            }
-        }
+		if (!limited) {
+		    /* For each hashtable slot */
+		    ALLOC_INIT_ZVAL(list);
+		    array_init(list);
 
-        /* For each slot pending deletion */
-        ALLOC_INIT_ZVAL(gc);
-        array_init(gc);
+		    ALLOC_INIT_ZVAL(slots);
+		    array_init(slots);
+
+		    for (i = 0; i < cache->nslots; i++) {
+		        p = cache->slots[i];
+		        j = 0;
+		        for (; p != NULL; p = p->next) {
+		            zval *link = apc_cache_link_info(cache, p TSRMLS_CC);
+		            add_next_index_zval(list, link);
+		            j++;
+		        }
+		        if(j != 0) {
+		            add_index_long(slots, (ulong)i, j);
+		        }
+		    }
+
+		    /* For each slot pending deletion */
+		    ALLOC_INIT_ZVAL(gc);
+		    array_init(gc);
+
+		    for (p = cache->header->gc; p != NULL; p = p->next) {
+		        zval *link = apc_cache_link_info(cache, p TSRMLS_CC);
+		        add_next_index_zval(gc, link);
+		    }
+		    
+		    add_assoc_zval(info, "cache_list", list);
+		    add_assoc_zval(info, "deleted_list", gc);
+		    add_assoc_zval(info, "slot_distribution", slots);
+		}
+	} zend_end_try();
 
-        for (p = cache->header->gc; p != NULL; p = p->next) {
-            zval *link = apc_cache_link_info(cache, p TSRMLS_CC);
-            add_next_index_zval(gc, link);
-        }
-        
-        add_assoc_zval(info, "cache_list", list);
-        add_assoc_zval(info, "deleted_list", gc);
-        add_assoc_zval(info, "slot_distribution", slots);
-    }
-	
 	/* unlock header */
 	APC_RUNLOCK(cache->header);
 
