]> granicus.if.org Git - php/commitdiff
- Fixed memory leak in DirectoryIterator::getExtension() and SplFileInfo::getExtension()
authorFelipe Pena <felipe@php.net>
Sun, 20 Feb 2011 16:33:53 +0000 (16:33 +0000)
committerFelipe Pena <felipe@php.net>
Sun, 20 Feb 2011 16:33:53 +0000 (16:33 +0000)
ext/spl/spl_directory.c

index ae6704cf95f95f584f6b59f40efdfd6ec7659156..d764c927c7c18347aed3cef21b46ab61c26536fb 100755 (executable)
@@ -857,7 +857,8 @@ SPL_METHOD(DirectoryIterator, getFilename)
 SPL_METHOD(SplFileInfo, getExtension)
 {
        spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
-       char *fname, *p;
+       char *fname = NULL;
+       const char *p;
        size_t flen;
        int path_len, idx;
 
@@ -880,10 +881,15 @@ SPL_METHOD(SplFileInfo, getExtension)
        p = zend_memrchr(fname, '.', flen);
        if (p) {
                idx = p - fname;
-               RETURN_STRINGL(fname + idx + 1, flen - idx - 1, 1);
+               RETVAL_STRINGL(fname + idx + 1, flen - idx - 1, 1);
+               efree(fname);
+               return;
+       } else {
+               if (fname) {
+                       efree(fname);
+               }
+               RETURN_EMPTY_STRING();
        }
-
-       RETURN_EMPTY_STRING();
 }
 /* }}}*/
 
@@ -892,7 +898,8 @@ SPL_METHOD(SplFileInfo, getExtension)
 SPL_METHOD(DirectoryIterator, getExtension)
 {
        spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
-       char *fname, *p;
+       char *fname = NULL;
+       const char *p;
        size_t flen;
        int idx;
 
@@ -905,10 +912,15 @@ SPL_METHOD(DirectoryIterator, getExtension)
        p = zend_memrchr(fname, '.', flen);
        if (p) {
                idx = p - fname;
-               RETURN_STRINGL(fname + idx + 1, flen - idx - 1, 1);
+               RETVAL_STRINGL(fname + idx + 1, flen - idx - 1, 1);
+               efree(fname);
+               return;
+       } else {
+               if (fname) {
+                       efree(fname);
+               }
+               RETURN_EMPTY_STRING();
        }
-
-       RETURN_EMPTY_STRING();
 }
 /* }}} */