Hi list !

I am still trying to solve bug 79714 (See: https://bugs.php.net/bug.php?id=79714)

I am no expert at C and/or the PHP Core at all so I need a little advice from you guys.

Seeing lines 3238-3314 in /ext/phar/phar.c (from php-src repo):

static zend_op_array *phar_compile_file(zend_file_handle *file_handle, int type) /* {{{ */
{
    zend_op_array *res;
    char *name = NULL;
    int failed;
    phar_archive_data *phar;

    if (!file_handle || !file_handle->filename) {
        return phar_orig_compile_file(file_handle, type);
    }
    if (strstr(file_handle->filename, ".phar") && !strstr(file_handle->filename, "://")) {         if (SUCCESS == phar_open_from_filename((char*)file_handle->filename, strlen(file_handle->filename), NULL, 0, 0, &phar, NULL)) {
            if (phar->is_zip || phar->is_tar) {
                zend_file_handle f = *file_handle;

                /* zip or tar-based phar */
                spprintf(&name, 4096, "phar://%s/%s", file_handle->filename, ".phar/stub.php");                 if (SUCCESS == phar_orig_zend_open((const char *)name, &f)) {

                    efree(name);
                    name = NULL;

                    f.filename = file_handle->filename;
                    if (f.opened_path) {
                        efree(f.opened_path);
                    }
                    f.opened_path = file_handle->opened_path;
                    f.free_filename = file_handle->free_filename;

                    switch (file_handle->type) {
                        case ZEND_HANDLE_STREAM:
                            if (file_handle->handle.stream.closer && file_handle->handle.stream.handle) {
file_handle->handle.stream.closer(file_handle->handle.stream.handle);
                            }
                            file_handle->handle.stream.handle = NULL;
                            break;
                        default:
                            break;
                    }
                    *file_handle = f;
                }
            } else if (phar->flags & PHAR_FILE_COMPRESSION_MASK) {
                zend_file_handle_dtor(file_handle);
                /* compressed phar */
                file_handle->type = ZEND_HANDLE_STREAM;
                /* we do our own reading directly from the phar, don't change the next line */
                file_handle->handle.stream.handle  = phar;
                file_handle->handle.stream.reader  = phar_zend_stream_reader;
                file_handle->handle.stream.closer  = NULL;
                file_handle->handle.stream.fsizer  = phar_zend_stream_fsizer;
                file_handle->handle.stream.isatty  = 0;
                phar->is_persistent ?
php_stream_rewind(PHAR_G(cached_fp)[phar->phar_pos].fp) :
                    php_stream_rewind(phar->fp);
            }
        }
    }

    zend_try {
        failed = 0;
        CG(zend_lineno) = 0;
        res = phar_orig_compile_file(file_handle, type);
    } zend_catch {
        failed = 1;
        res = NULL;
    } zend_end_try();

    if (name) {
        efree(name);
    }

    if (failed) {
        zend_bailout();
    }

    return res;
}

I *think* that what maybe would fix this bug is if line 3299 (res = phar_orig_compile_file(file_handle, type);) was - if BCGEN extension is loaded - is affected so that phar_orig_compile_file was changed to point to another function.

Let's imagine that phar_orig_compile_file pointed to bcgen_phar_compile_file() which was then implemented by BCGEN:

ZendAccelerator.h (of BCGEN): (Link: https://github.com/vjardin/bcgen/blob/a863b8d596cebb698a491f7475903f5aa3664719/ZendAccelerator.h)

zend_op_array *bcgen_phar_compile_file(zend_file_handle *file_handle, int type);


ZendAccelerator.c (of BCGEN): (Link: https://github.com/vjardin/bcgen/blob/a863b8d596cebb698a491f7475903f5aa3664719/ZendAccelerator.c)

zend_op_array *bcgen_phar_compile_file(zend_file_handle *file_handle, int type) {

    if (!file_handle->filename || !ZCG(enabled) || !accel_startup_ok) {
            /* The Accelerator is disabled, act as if without BCGEN */
        return zend_compile(file_handle, type);
    } else {
        /* Use the zend_compile replacement of BCGEN for this file */
        return persistent_load_file(file_handle, type);
    }
}

Now, for my question:

How can I make sure that phar_orig_compile_file() points to bcgen_phar_compile_file() when line 3299 of /ext/phar/phar.c is hit *WITHOUT* changing line 3299 if - and only if BCGEN module is present ?

Would a #define do it ?

(something like:
#define phar_orig_compile_file bcgen_phar_compile_file
in ZendAccelerator.h (of BCGEN) (Link: https://github.com/vjardin/bcgen/blob/a863b8d596cebb698a491f7475903f5aa3664719/ZendAccelerator.h)

NOTE: /ext/phar/phar.c already has this on line 3230:

zend_op_array *(*phar_orig_compile_file)(zend_file_handle *file_handle, int type);

which would conflict with my - proposed - define/solution or ?

Please advice !

If it is inappropriate to ask for coding advice on this list, I do apologize for this mail !

Thank you in advance !


Best regards,

Henrik Skov
Secuno A/S

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php

Reply via email to