]> granicus.if.org Git - php/commitdiff
iFixed key leak with invalid resource
authorXinchen Hui <laruence@gmail.com>
Thu, 10 Dec 2015 07:02:01 +0000 (15:02 +0800)
committerXinchen Hui <laruence@gmail.com>
Thu, 10 Dec 2015 07:02:01 +0000 (15:02 +0800)
NEWS
ext/dba/dba.c

diff --git a/NEWS b/NEWS
index 1585a8915a8ac6ee7b292363a7c2884eb60afcf0..31f304226440c951beb3b5f90e7271b977c28b8f 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -9,6 +9,9 @@ PHP                                                                        NEWS
   . Fixed bug #70781 (Extension tests fail on dynamic ext dependency).
     (Francois Laupretre)
 
+- DBA:
+  . Fixed key leak with invalid resource. (Laruence)
+
 - Filter:
   . Fixed bug #71063 (filter_input(INPUT_ENV, ..) does not work). (Reeze Xia)
 
index 5b73c7d3fb954323e9d8f80fc18de52c468a597f..02413337a432369176134df47fa3ab0f6f9086dc 100644 (file)
@@ -232,9 +232,10 @@ static size_t php_dba_make_key(zval *key, char **key_str, char **key_free)
                ZVAL_COPY(&tmp, key);
                convert_to_string(&tmp);
 
-               *key_free = *key_str = estrndup(Z_STRVAL(tmp), Z_STRLEN(tmp));
                len = Z_STRLEN(tmp);
-
+               if (Z_STRLEN(tmp)) {
+                       *key_free = *key_str = estrndup(Z_STRVAL(tmp), Z_STRLEN(tmp));
+               }
                zval_ptr_dtor(&tmp);
                return len;
        }
@@ -281,8 +282,14 @@ static size_t php_dba_make_key(zval *key, char **key_str, char **key_free)
                RETURN_FALSE; \
        }
 
-#define DBA_ID_GET2   DBA_ID_PARS; DBA_GET2;   DBA_FETCH_RESOURCE(info, id)
-#define DBA_ID_GET2_3 DBA_ID_PARS; DBA_GET2_3; DBA_FETCH_RESOURCE(info, id)
+#define DBA_FETCH_RESOURCE_WITH_ID(info, id)   \
+       if ((info = (dba_info *)zend_fetch_resource2(Z_RES_P(id), "DBA identifier", le_db, le_pdb)) == NULL) { \
+               DBA_ID_DONE; \
+               RETURN_FALSE; \
+       }
+
+#define DBA_ID_GET2   DBA_ID_PARS; DBA_GET2;   DBA_FETCH_RESOURCE_WITH_ID(info, id)
+#define DBA_ID_GET2_3 DBA_ID_PARS; DBA_GET2_3; DBA_FETCH_RESOURCE_WITH_ID(info, id)
 
 #define DBA_ID_DONE                                                                                            \
        if (key_free) efree(key_free)
@@ -578,7 +585,7 @@ static void php_dba_update(INTERNAL_FUNCTION_PARAMETERS, int mode)
                RETURN_FALSE;
        }
 
-       DBA_FETCH_RESOURCE(info, id);
+       DBA_FETCH_RESOURCE_WITH_ID(info, id);
 
        DBA_WRITE_CHECK_WITH_ID;