]> granicus.if.org Git - php/commitdiff
- Fixed memleak on SplFileInfo::getLinkTarget()
authorFelipe Pena <felipe@php.net>
Wed, 29 Jul 2009 17:31:25 +0000 (17:31 +0000)
committerFelipe Pena <felipe@php.net>
Wed, 29 Jul 2009 17:31:25 +0000 (17:31 +0000)
ext/spl/spl_directory.c

index 2a543176343949b2ec2fe3fa13854cf3fe51cb14..41f10c000381557601df5823b5c2d2dce6d58f34 100755 (executable)
@@ -1132,7 +1132,7 @@ SPL_METHOD(SplFileInfo, getLinkTarget)
        spl_filesystem_object *intern = (spl_filesystem_object*)zend_object_store_get_object(getThis() TSRMLS_CC);
        UChar *target;
        int ret, link_len, target_len;
-       char *link, buff[MAXPATHLEN];
+       char *link = NULL, buff[MAXPATHLEN];
        zend_error_handling error_handling;
 
        zend_replace_error_handling(EH_THROW, spl_ce_RuntimeException, &error_handling TSRMLS_CC);
@@ -1144,11 +1144,14 @@ SPL_METHOD(SplFileInfo, getLinkTarget)
        }
 
 #ifdef HAVE_SYMLINK
-       ret = readlink(intern->file_name.s, buff, MAXPATHLEN-1);
+       ret = link ? readlink(link, buff, MAXPATHLEN-1) : -1;
 #else
        ret = -1; /* always fail if not implemented */
 #endif
 
+       if (link && intern->file_name_type == IS_UNICODE) {
+               efree(link);
+       }
        if (ret == -1) {
                zend_throw_exception_ex(spl_ce_RuntimeException, 0 TSRMLS_CC, "Unable to read link %R, error: %s", intern->file_name_type, intern->file_name, strerror(errno));
                RETVAL_FALSE;