Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:111898 Return-Path: Delivered-To: mailing list internals@lists.php.net Received: (qmail 82954 invoked from network); 18 Sep 2020 05:53:19 -0000 Received: from unknown (HELO php-smtp4.php.net) (45.112.84.5) by pb1.pair.com with SMTP; 18 Sep 2020 05:53:19 -0000 Received: from php-smtp4.php.net (localhost [127.0.0.1]) by php-smtp4.php.net (Postfix) with ESMTP id E49FF1804AA for ; Thu, 17 Sep 2020 22:02:06 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on php-smtp4.php.net X-Spam-Level: X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,HTML_MESSAGE, RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE, SPF_PASS autolearn=no autolearn_force=no version=3.4.2 X-Spam-Virus: No X-Envelope-From: Received: from mail-ej1-f46.google.com (mail-ej1-f46.google.com [209.85.218.46]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-256) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by php-smtp4.php.net (Postfix) with ESMTPS for ; Thu, 17 Sep 2020 22:02:06 -0700 (PDT) Received: by mail-ej1-f46.google.com with SMTP id z22so6306786ejl.7 for ; Thu, 17 Sep 2020 22:02:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:from:date:message-id:subject:to; bh=53s94KTTANQstnIBv3HQaEtr0fZErvP3g7JkZTdQY+k=; b=YeDRUvWAQ3YTll6znCqxjWekUMKIlcn3QZaUk7/9MaxENMoK/WnzY0+Tq2tPpImoS5 3fLRb/8Eyr8xsfVHCDR1qPjIWGifU/b0VSECKZAKK6fiqsShNrdfbO26jV5FXhZOuhQj DKYISbFeAQumIYTC5h5LnABn3mzQunIbeU83RWGbbMtDfbltiesJTzwzr/2Gons3DEaP seWbD9ULIqz2BI7zu7xbts+m0btI55iDH++XEWP/jlj46Nj4Q8Cmkh4Y15lRpo/HI5DO TPw1ElUNKtDY28GCHIAxJ6UzmLqb/y/MbaDtZlQwN3dVqOxUF1bo/TBFNwjRJUu33INP 5u0w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=53s94KTTANQstnIBv3HQaEtr0fZErvP3g7JkZTdQY+k=; b=gusRoSsCVws6LVTjBzKjCqBXeIVrW1mnY6Tlirhv2fIVi3U3ZH4qNpwpZQz2A0RMYE kS+gmmR6NY584XIU/23qQ1GfqA4Nd83n1VcoxMqHz5HzKeW59UvVDmF968PXZCYCOUqf 3JI4JfnJ5xrWG/Q8i3oTeD9C8DSXNEP7qbjNTsafaN5Di36sj/dLs34fy/tyVDQXm5hO 9mVV5YXrjphPDZrAmJeb6JH/yNM6KTDQTSVVwgE1ieTGAXPRitEQsOzDvhcZGdn3wK9H bUdgihdFS1jWrmijlR7Y8nA6fJxO129tlHrQQEazg1bqP6y3C4M329AuBxxWlXjgf16V wKhw== X-Gm-Message-State: AOAM533EdNg+6NsUXhaH4nIx31ix7w5dFMZu/GYG4eWj05iXxLdXYnCC d/iZkl3x6Dml8IQxTCTa1wgjyTyViislxA1YHnt0/HwSmPk= X-Google-Smtp-Source: ABdhPJxCPVlo1kshvuzvFxZ5PfdfZoe4TTqyAhouzoLa+ozoeK15mOUSJIJgomHQBC/+BchwxIN7d8/yS6rIEnk/Hd0= X-Received: by 2002:a17:906:f950:: with SMTP id ld16mr33312639ejb.489.1600405323711; Thu, 17 Sep 2020 22:02:03 -0700 (PDT) MIME-Version: 1.0 Date: Fri, 18 Sep 2020 12:01:52 +0700 Message-ID: To: internals@lists.php.net Content-Type: multipart/alternative; boundary="000000000000d1098505af8f662c" Subject: Passing HashTable data from php.ini to an extension method: corrupted values From: alex.mashin@gmail.com (Alexander Mashin) --000000000000d1098505af8f662c Content-Type: text/plain; charset="UTF-8" Dear all, I am trying to make a PHP (7.4) extension use in an extension method a setting from php.ini (like myext.map=key1=val1,key2=val2;) parsed as an associative array. I want the parsing to happen in PHP_MINIT_FUNCTION(myext) . So, I declared a php setting, uncommented REGISTER_INI_ENTRIES(); in PHP_MINIT_FUNCTION(myext), declared: ZEND_BEGIN_MODULE_GLOBALS(myext) HashTable map; ZEND_END_MODULE_GLOBALS(myext) and filled MYEXT_G(map) from the php.ini settingJR: PHP_INI_MH(myext_update_map) {// The part that parses new_value into (key => val) pairs is skipped. It works.//...// key = val assignments have been counted. zend_hash_init(&MYEXT_G(map), count, NULL, NULL, 1); // 1 for "persistent".// ...// Iterating (key => value) pairs. // key, key_len, val, val_len have been successfully extracted from php.ini. zend_string * key_z = zend_string_init( key, key_len, 1 ); zval val_z; ZVAL_STRINGL( &val_z, val, val_len ); zend_hash_add_new( &MYEXT_G(map), key_z, &val_z ); Then, in a PHP method, I try to read data from &MYEXT_G(map): PHP_METHOD(MyExt, getMap) {// ... zend_string * key_z; zval * val_z; ZEND_HASH_FOREACH_STR_KEY_VAL(&MYEXT_G(map), key_z, val_z) php_error_docref( NULL TSRMLS_CC, E_WARNING, "ZSTR_VAL(key_z) = %s\n", ZSTR_VAL(key_z) ); php_error_docref( NULL TSRMLS_CC, E_WARNING, "Z_STRVAL_P(val_z) = %s\n", Z_STRVAL_P(val_z) ); php_error_docref( NULL TSRMLS_CC, E_WARNING, "Z_STRLEN_P(val_z) = %lu\n", Z_STRLEN_P(val_z) ); ZEND_HASH_FOREACH_END(); If the PHP script containing MyExt::getLibraries() is called from the command line, the PHP warnings print keys and values as they were set in php.ini. However, if the script is called by HTTP request, in the warning messages, ZSTR_VAL(key_z) is correct but both Z_STRVAL_P(val_z) and Z_STRLEN_P(val_z) contain garbage. All involved functions are either defined as PHP macros or receive TSRMLS_DC . It seems that the values (but not keys) in a global hashtable get deallocated between module initialisation and serving HTTP request. I have made sure that scalar values in MYEXT_G survive from PHP_MINIT_FUNCTION(myExt) into PHP method called from HTTP request. So, how can I make sure that HashTable values are really persistent? Alexander Mashin --000000000000d1098505af8f662c--