Miva Empresa/Mia/Script Compiler v5.33 Release Notes ---------------------------------------------------- Bugs Fixed ---------- 25435: Mia Configuration should be stored in HKEY_CURRENT_USER\Software, not HKEY_LOCAL_MACHINE\SOFTWARE 27013: xxx::ProcessPOSTedData should verify content length is greater than 0 27104: Add support for utf16 encoding of 4-byte utf8 sequenced characters 28084: Multiple MvCALL tags in the same file with the FLAGS attribute output an "Attribute is used more than once error" 28125: MvFUNCTIONRETURN within an MvASYNC causes a frame underflow 28154: Update MySQL client library to 5.5.61 or newer 28985: Miva mia settings never update when you click apply 29095: MvCALL Certificate Pinning 29484: Self-referencing UPDATE statements are subject to race condition 29826: Windows Read / Write operations should check for ERROR_LOCK_VIOLATION on failure New Builtin Functions --------------------- - miva_struct_member_callback( struct var, function, data var ) This function can be used to dynamically populate structure members as they are accessed Parameters: - struct - The structure on which to perform the callback function - function - The callback function that will be triggered when a member does not exist in the structure (if the callback function is empty, the callback will be disabled) - data - The data that will be passed to the callback function Return Value: - Empty Example MivaScript code: CustomCallback( struct var, member, data var ): Parameters: - struct - The structure that had the member accessed - member - The member that was accessed - data - The data that was passed to miva_struct_member_callback Return Value: - The value that should be assigned to the structure member. MySQL Connector Changes ----------------------- - Added the ability to have write segregation. By default, the write connection assumes the read connection's host, port, user, password, and database. The following are commands that can be issued via MvDBCOMMAND to change the write connection's values. - write_host - write_port - write_user - write_password - write_db Other ----- - Added the following values to MvCALL FLAG attribute: - "force_https" - This flag will only connect to the specified host if done so over HTTPS. If the HTTPS protocol is not used, MvCALL will raise an error. - "force_verify" - This flag will force certificate chain verification / IP verification even when the engine is configured to not to perform chain / hostname verification. - Added certificate pinning to MvCALL with the following attributes: - PIN-ALGORITHM - The algorithm to use to verify the connected server's certificate e.g. sha1, sha256, etc... - PIN-DIGESET - The binary value that should be used to compare against the connected server's certificate - Added s.callservercertificate as a system variable within an MvCALL tag. This variable will return the server's certificate in PEM format. - An MVBRedis.DLL library is now distributed with the Windows installer which will allow MivaScript code using redis functios to compile. It should be noted that redis is not supported on Windows and this library will return "Unsupported" for redis_last_error and 0 for all other redis functions. It was only added so developers could compile code related to redis on Windows, but the binary will need to be run on UNIX based systems. StoreMorph Changes ------------------ - Added - Added the pin-algorithm and pin-digest attributes to Miva Empresa/Mia/Script Compiler v5.32 Release Notes ---------------------------------------------------- Bugs Fixed ---------- 23788: OpenSSL thread locking callback is called after all threads have been joined and cleanup has begun 24758: CompilerParser::Find_ScratchVariable_Ident can be susceptible to a buffer overflow 24759: Passing a negative value for the "-O" flag causes a segfault 24762: mvc fails to pass the verbose flag to the assembler 24817: The JSONDecoder should clear any existing data from the output parameter 26511: LOWER function leaks memory 26512: UPPER function leaks memory 26517: SQL_Stack::PopBool should use the string length, not the string size 26518: MivaSQL crashes when search condition does not contain RHS operators 26522: MivaSQL UNION should remove duplicates from individual result sets 26525: SQL_Bucket_Record does not delete the value popped off of the stack 26556: MvSMTP should clear the g.MvSMTP_Error variable on a successful connection 26572: PostgreSQL: Add prepared statement to cache after query is executed / view is closed 26602: Compiler: MvOPENVIEW should output a compiler error if the QUERY attribute is missing 26767: CommandLine_Warning_Flags has bad index boundary checks 26772: LocateDSOs should output an error when the .so/.DLL directory encounters an error 26841: UNIXReentrantFileManager::DirectoryListing should use readdir_r 26881: Generate SHA256SUMS of all distribution files and components 27000: VariableHash::LookupVariable_Fancy on present but uncreated variable causes a crash 27031: DefaultDatabaseVariable::Clone is cloning the wrong variable 27037: SpecialVariables values are not set to the parent's value in a multi-threaded environment New Builtin Functions --------------------- - file_set_time( path, location, modified ) Sets the file's modified time Parameters: - path - The path to the file - location - Either script or data - modified - time_t (seconds since 1-JAN-1970) Return Value: - 1 on success, 0 on failure - crypto_next_error() Gets the next crypto error Parameters: - None Return Value: - The appropriate crypto error - crypto_clear_error() Will clear out all crypto errors Parameters: - None Return Value: - Empty - crypto_evp_sign( digestname, privkey, buffer, signature var ) Generates an RSA / ECDSA signature Parameters: - digestname - Hash algorithm name, such as "md5" or "sha256". Supported digest algorithms will vary between OpenSSL installations - privkey - EVP PKEY structure reference - buffer - The data to sign - signature - The signed output signature Return Value: - 1 on success, 0 on failure - crypto_evp_verify( digestname, pubkey, buffer, signature ) Verifies an RSA / ECDSA signature Parameters: - digestname - Hash algorithm name, such as "md5" or "sha256". Supported digest algorithms will vary between OpenSSL installations - pubkey - EVP PKEY structure reference - buffer - The data to verify - signature - The signature to verify Return Value: - 1 on success, 0 on failure - evp_pkey_load_pubkey_x509( x509 var, pkey var ) Loads a PKEY reference from an x509 public key reference Parameters: - x509 - Certificate reference returned from functions such as x509_load_mem - pkey - Structure reference Return Value: - 1 on success, 0 on failure Other ----- - crypto_last_error Previously if the crypto error originated from Miva Empresa, the returned error was always the same. If the crypto error was from OpenSSL then it would be lost after calling the function. Modified to always return the last crypto error. - trim / ltrim / rtrim Will now trim whitespace from arrays and structures. Previously the functions would convert arrays and structures to serialized data and then trim it. Arrays and structures are now iterated and all values within are trimmed appropriately. - POST content type of "application/json" is now supported. The POSTed data will be parsed and stored in the s.json_data variable as a JSON object. The raw POSTed data will populate the s.content_data variable. - Added the FLAGS attribute to MvCALL / mvt:call. The only supported flag currently is "noparse" which will disable parsing of the returned data. The data will populate the s.callvalue variable. This is ideal if you do not need to iterate HTML / XML elements. - evp_pkey_load_mem now supports the DER and PEM formats. - Added support for Redis. The use of the redis functions can be obtained by adding a system library with the code of "hiredis." - The compiler now warns when text / HTML is present and will not be output in the current context. Configuration Changes --------------------- - Added the following configuration options: MvCONFIG_ERROR_SYSLOG_IDENT: - Only available on Win32. - IIS7 - Set the ident value under the syslog configuration section - Mia - Set the errorsyslogident registry key MvCONFIG_ERROR_SYSLOG - IIS7 - Set the syslog value under the syslog configuration section - Mia - Set the errorsyslog registry key - 3x - Set the errorsyslog directive in mivavm.conf - env - Set the environment variable MvCONFIG_ERROR_SYSLOG MvCONFIG_ERROR_SYSLOG_FACILITY - Only available on UNIX systems. - 3x - Set the errorsyslogfacility directive in mivavm.conf - env - Set the environment variable MvCONFIG_ERROR_SYSLOG_PRIORITY MvCONFIG_ERROR_SYSLOG_PRIORITY - Only available on UNIX systems. - 3x - Set the errorsyslogpriority directive in mivavm.conf - env - Set the environment variable MvCONFIG_ERROR_SYSLOG_PRIORITY MvCONFIG_ERROR_SYSLOG - A comma separated list of different types of Miva Empresa errors that should be logged to the system log. E.g. fatal,timeout,MvDO,MvCALL:"Unable to open URL" The "fatal" directive will cause all fatal errors to be logged The "timeout" directive will cause all timeout errors to be logged The will cause all those specific tag errors to be logged. - In addition, you may specify a quoted string after each directive which specifies a "contains" string that must be present in the associated error message in order to be logged. For example, you could specify "MvCALL:"Unable to open URL"." If the MvCALL errors, the error will only be logged if the error message contains "Unable to open URL." MvCONFIG_ERROR_SYSLOG_IDENT - Sets the identifier for the data being written to the Application Event Log. Defaults to "Miva." MvCONFIG_ERROR_SYSLOG_FACILITY - String representation of the facility passed to openlog. E.g. "local2", "cron", "mail", etc... Defaults to "local2." MvCONFIG_ERROR_SYSLOG_PRIORITY - String representation of the option passed to openlog. E.g. "alert", "debug", etc... Defaults to "err" Redis ----- - redis_connect( ip, port, conn_id var ) Connects to Redis on the specified IP / hostname and port. Parameters: - ip / hostname: The IP address / hostname of the server Redis is on - port: The port number to connect on - conn_id: An output value containing an reference ID which is associated to the internal Redis connection Return Value: - 1 on success, 0 on failure - redis_disconnect( conn_id ) Disconnects the specified instance from the Redis server Parameters: - conn_id: The internal reference ID Return Value: - 1 on success, 0 on failure - redis_last_error() Gets the last error message Parameters: - None Return Value: - The last error message The following are implementations of Redis functions. All functions take a Redis connection reference and work as described by redis.io. - redis_auth( conn_id, password ) - https://redis.io/commands/auth - redis_echo( conn_id, message ) - https://redis.io/commands/echo - redis_ping( conn_id ) - https://redis.io/commands/ping - redis_ping_message( conn_id, message ) - https://redis.io/commands/ping - redis_quit( conn_id ) - https://redis.io/commands/quit - redis_select( conn_id, index ) - https://redis.io/commands/select - redis_geoadd( conn_id, key, longitude, latitude, member ) - https://redis.io/commands/geoadd - redis_geodist( conn_id, key, member1, member2, options var ) - https://redis.io/commands/geodist - redis_geohash( conn_id, key, member, output var ) - https://redis.io/commands/geohash - redis_geopos( conn_id, key, member, output var ) - https://redis.io/commands/geopos - redis_georadius( conn_id, key, longitude, latitude, radius, unit, options var, output var ) - https://redis.io/commands/georadius - redis_georadiusstore( conn_id, key, longitude, latitude, radius, unit, store_key, count ) - https://redis.io/commands/georadius - redis_georadiusstoredist( conn_id, key, longitude, latitude, radius, unit, storedist_key, count ) - https://redis.io/commands/georadius - redis_georadiusbymember( conn_id, key, member, radius, unit, options var, output var ) - https://redis.io/commands/georadiusbymember - redis_georadiusbymemberstore( conn_id, key, member, latitude, radius, unit, store_key ) - https://redis.io/commands/georadiusbymember - redis_georadiusbymemberstoredist( conn_id, key, member, latitude, radius, unit, storedist_key ) - https://redis.io/commands/georadiusbymember - redis_hdel( conn_id, key, field ) - https://redis.io/commands/hdel - redis_hexists( conn_id, key, field ) - https://redis.io/commands/hexists - redis_hget( conn_id, key, field ) - https://redis.io/commands/hget - redis_hgetall( conn_id, key, output var ) - https://redis.io/commands/hgetall - redis_hincrby( conn_id, key, field, increment ) - https://redis.io/commands/hincrby - redis_hincrbyfloat( conn_id, key, field, increment ) - https://redis.io/commands/hincrbyfloat - redis_hkeys( conn_id, key, output var ) - https://redis.io/commands/hkeys - redis_hlen( conn_id, key ) - https://redis.io/commands/hlen - redis_hmget( conn_id, key, field, output var ) - https://redis.io/commands/hmget - redis_hmset( conn_id, key, field, value ) - https://redis.io/commands/hmset - redis_hscan( conn_id, key, cursor, options var, output var ) - https://redis.io/commands/hscan - redis_hset( conn_id, key, field, value ) - https://redis.io/commands/hset - redis_hsetnx( conn_id, key, field, value ) - https://redis.io/commands/hsetnx - redis_hstrlen( conn_id, key, field ) - https://redis.io/commands/hstrlen - redis_hvals( conn_id, key, output var ) - https://redis.io/commands/hvals - redis_pfadd( conn_id, key, element ) - https://redis.io/commands/pfadd - redis_pfcount( conn_id, key ) - https://redis.io/commands/pfcount - redis_pfmerge( conn_id, destkey, sourcekey ) - https://redis.io/commands/pfmerge - redis_del( conn_id, key ) - https://redis.io/commands/del - redis_dump( conn_id, key ) - https://redis.io/commands/dump - redis_exists( conn_id, key ) - https://redis.io/commands/exists - redis_expire( conn_id, key, seconds ) - https://redis.io/commands/expire - redis_expireat( conn_id, key, timestamp ) - https://redis.io/commands/expireat - redis_keys( conn_id, pattern, output var ) - https://redis.io/commands/keys - redis_migrate( conn_id, host, port, key, destination_db, timeout, options var ) - https://redis.io/commands/migrate - redis_move( conn_id, key, db ) - https://redis.io/commands/move - redis_object_encoding( conn_id, key ) - https://redis.io/commands/object - redis_object_idletime( conn_id, key ) - https://redis.io/commands/object - redis_object_refcount( conn_id, key ) - https://redis.io/commands/object - redis_persist( conn_id, key ) - https://redis.io/commands/persist - redis_pexpire( conn_id, key, milliseconds ) - https://redis.io/commands/pexpire - redis_pexpireat( conn_id, key, milliseconds_timestamp ) - https://redis.io/commands/pexpireat - redis_pttl( conn_id, key ) - https://redis.io/commands/pttl - redis_randomkey( conn_id ) - https://redis.io/commands/randomkey - redis_rename( conn_id, key, newkey ) - https://redis.io/commands/rename - redis_renamenx( conn_id, key, newkey ) - https://redis.io/commands/renamenx - redis_restore( conn_id, key, ttl, serialized_value, options var ) - https://redis.io/commands/restore - redis_scan( conn_id, cursor, options var, output var ) - https://redis.io/commands/scan - redis_sort( conn_id, key, options var, output var ) - https://redis.io/commands/sort - redis_sortstore( conn_id, key, destination, options var ) - https://redis.io/commands/sort - redis_touch( conn_id, key ) - https://redis.io/commands/touch - redis_ttl( conn_id, key ) - https://redis.io/commands/ttl - redis_type( conn_id, key ) - https://redis.io/commands/type - redis_blpop( conn_id, key, timeout, output var ) - https://redis.io/commands/blpop - redis_brpop( conn_id, key, timeout, output var ) - https://redis.io/commands/brpop - redis_brpoplpush( conn_id, source, destination, timeout ) - https://redis.io/commands/brpoplpush - redis_lindex( conn_id, key, index ) - https://redis.io/commands/lindex - redis_linsert_before( conn_id, key, pivot, value ) - https://redis.io/commands/linsert - redis_linsert_after( conn_id, key, pivot, value ) - https://redis.io/commands/linsert - redis_llen( conn_id, key ) - https://redis.io/commands/llen - redis_lpop( conn_id, key ) - https://redis.io/commands/lpop - redis_lpush( conn_id, key, value ) - https://redis.io/commands/lpush - redis_lpushx( conn_id, key, value ) - https://redis.io/commands/lpushx - redis_lrange( conn_id, key, start, stop, output var ) - https://redis.io/commands/lrange - redis_lrem( conn_id, key, count, value ) - https://redis.io/commands/lrem - redis_lset( conn_id, key, index, value ) - https://redis.io/commands/lset - redis_ltrim( conn_id, key, start, stop ) - https://redis.io/commands/ltrim - redis_rpop( conn_id, key ) - https://redis.io/commands/rpop - redis_rpoplpush( conn_id, source, destination ) - https://redis.io/commands/rpoplpush - redis_rpush( conn_id, key, value ) - https://redis.io/commands/rpush - redis_rpushx( conn_id, key, value ) - https://redis.io/commands/rpushx - redis_eval( conn_id, script, key, arg ) - https://redis.io/commands/eval - redis_eval_array( conn_id, script, key, arg, output var ) - https://redis.io/commands/eval - redis_evalsha( conn_id, sha1, key, arg ) - https://redis.io/commands/evalsha - redis_evalsha_array( conn_id, sha1, key, arg, output var ) - https://redis.io/commands/evalsha - redis_script_exists( conn_id, sha1, output var ) - https://redis.io/commands/script-exists - redis_script_flush( conn_id ) - https://redis.io/commands/script-flush - redis_script_kill( conn_id ) - https://redis.io/commands/script-kill - redis_script_load( conn_id, script ) - https://redis.io/commands/script-load - redis_bgsave( conn_id ) - https://redis.io/commands/bgsave - redis_client_getname( conn_id ) - https://redis.io/commands/client-getname - redis_client_kill( conn_id, options var ) - https://redis.io/commands/client-kill - redis_client_list( conn_id ) - https://redis.io/commands/client-list - redis_client_pause( conn_id, timeout ) - https://redis.io/commands/client-pause - redis_client_setname( conn_id, name ) - https://redis.io/commands/client-setname - redis_command( conn_id, output var ) - https://redis.io/commands/command - redis_command_count( conn_id ) - https://redis.io/commands/command - redis_command_getkeys( conn_id, input var, output var ) - https://redis.io/commands/command - redis_command_info( conn_id, command_name, output var ) - https://redis.io/commands/command - redis_config_get( conn_id, parameter, output var ) - https://redis.io/commands/config-get - redis_config_resetstat( conn_id ) - https://redis.io/commands/config-resetstat - redis_config_rewrite( conn_id ) - https://redis.io/commands/config-rewrite - redis_config_set( conn_id, parameter, value ) - https://redis.io/commands/config-set - redis_dbsize( conn_id ) - https://redis.io/commands/dbsize - redis_debug_object( conn_id, key ) - https://redis.io/commands/debug-object - redis_debug_segfault( conn_id ) - https://redis.io/commands/debug-segfault - redis_flushall( conn_id ) - https://redis.io/commands/flushall - redis_flushdb( conn_id ) - https://redis.io/commands/flushdb - redis_info( conn_id ) - https://redis.io/commands/info - redis_info_section( conn_id, section ) - https://redis.io/commands/info - redis_lastsave( conn_id ) - https://redis.io/commands/lastsave - redis_role( conn_id, output var ) - https://redis.io/commands/role - redis_save( conn_id ) - https://redis.io/commands/save - redis_shutdown( conn_id ) - https://redis.io/commands/shutdown - redis_shutdown_nosave( conn_id ) - https://redis.io/commands/shutdown - redis_shutdown_save( conn_id ) - https://redis.io/commands/shutdown - redis_slowlog_get( conn_id, output var ) - https://redis.io/commands/slowlog - redis_slowlog_get_count( conn_id, count, output var ) - https://redis.io/commands/slowlog - redis_slowlog_len( conn_id ) - https://redis.io/commands/slowlog - redis_slowlog_reset( conn_id ) - https://redis.io/commands/slowlog - redis_time( conn_id, output var ) - https://redis.io/commands/time - redis_sadd( conn_id, key, member ) - https://redis.io/commands/sadd - redis_scard( conn_id, key ) - https://redis.io/commands/scard - redis_sdiff( conn_id, key, output var ) - https://redis.io/commands/sdiff - redis_sdiffstore( conn_id, destination, key ) - https://redis.io/commands/sdiff - redis_sinter( conn_id, key, output var ) - https://redis.io/commands/sinter - redis_sinterstore( conn_id, destination, key ) - https://redis.io/commands/sinter - redis_sismember( conn_id, key, member ) - https://redis.io/commands/sismember - redis_smembers( conn_id, key, output var ) - https://redis.io/commands/smembers - redis_smove( conn_id, source, destination, member ) - https://redis.io/commands/smove - redis_spop( conn_id, key ) - https://redis.io/commands/spop - redis_spop_count( conn_id, key, count, output var ) - https://redis.io/commands/spop - redis_srandmember( conn_id, key ) - https://redis.io/commands/srandmember - redis_srandmember_count( conn_id, key, count, output var ) - https://redis.io/commands/srandmember - redis_srem( conn_id, key, member ) - https://redis.io/commands/srem - redis_sscan( conn_id, key, cursor, options var, output var ) - https://redis.io/commands/sscan - redis_sunion( conn_id, key, output var ) - https://redis.io/commands/sunion - redis_sunionstore( conn_id, destination, key ) - https://redis.io/commands/sunion - redis_zadd( conn_id, key, score, member, options var ) - https://redis.io/commands/zadd - redis_zcard( conn_id, key ) - https://redis.io/commands/zcard - redis_zcount( conn_id, key, min, max ) - https://redis.io/commands/zcount - redis_zincrby( conn_id, key, increment, member ) - https://redis.io/commands/zincrby - redis_zinterstore( conn_id, destination, key, options var ) - https://redis.io/commands/zinterstore - redis_zlexcount( conn_id, key, min, max ) - https://redis.io/commands/zlexcount - redis_zrange( conn_id, key, start, stop, options var, output var ) - https://redis.io/commands/zrange - redis_zrangebylex( conn_id, key, min, max, options var, output var ) - https://redis.io/commands/zrangebylex - redis_zrangebyscore( conn_id, key, min, max, options var, output var ) - https://redis.io/commands/zrangebyscore - redis_zrank( conn_id, key, member ) - https://redis.io/commands/zrank - redis_zrem( conn_id, key, member ) - https://redis.io/commands/zrem - redis_zremrangebylex( conn_id, key, min, max ) - https://redis.io/commands/zremrangebylex - redis_zremrangebyrank( conn_id, key, start, stop ) - https://redis.io/commands/zremrangebyrank - redis_zremrangebyscore( conn_id, key, min, max ) - https://redis.io/commands/zremrangebyscore - redis_zrevrange( conn_id, key, start, stop, options var, output var ) - https://redis.io/commands/zrevrange - redis_zrevrangebylex( conn_id, key, max, min, options var, output var ) - https://redis.io/commands/zrevrangebylex - redis_zrevrangebyscore( conn_id, key, max, min, optoins var, output var ) - https://redis.io/commands/zrevrangebyscore - redis_zrevrank( conn_id, key, member ) - https://redis.io/commands/zrevrank - redis_zscan( conn_id, key, cursor, options var, output var ) - https://redis.io/commands/zscan - redis_zscore( conn_id, key, member ) - https://redis.io/commands/zscore - redis_zunionstore( conn_id, destination, key, options var ) - https://redis.io/commands/zunionstore - redis_append( conn_id, key, value ) - https://redis.io/commands/append - redis_bitcount( conn_id, key, options var ) - https://redis.io/commands/bitcount - redis_bitfield( conn_id, key, options var, output var ) - https://redis.io/commands/bitfield - redis_bitop( conn_id, operation, destkey, key ) - https://redis.io/commands/bitop - redis_bitpos( conn_id, key, bit, options var ) - https://redis.io/commands/bitpos - redis_decr( conn_id, key ) - https://redis.io/commands/decr - redis_decrby( conn_id, key, decrement ) - https://redis.io/commands/decrby - redis_get( conn_id, key ) - https://redis.io/commands/get - redis_getbit( conn_id, key, offset ) - https://redis.io/commands/getbit - redis_getrange( conn_id, key, start, end ) - https://redis.io/commands/getrange - redis_getset( conn_id, key, value ) - https://redis.io/commands/getset - redis_incr( conn_id, key ) - https://redis.io/commands/incr - redis_incrby( conn_id, key, increment ) - https://redis.io/commands/incrby - redis_incrbyfloat( conn_id, key, increment ) - https://redis.io/commands/incrbyfloat - redis_mget( conn_id, key, output var ) - https://redis.io/commands/mget - redis_mset( conn_id, key, value ) - https://redis.io/commands/mset - redis_msetnx( conn_id, key, value ) - https://redis.io/commands/msetnx - redis_set( conn_id, key, value, options var ) - https://redis.io/commands/set - redis_setbit( conn_id, key, offset, value ) - https://redis.io/commands/setbit - redis_setrange( conn_id, key, offset, value ) - https://redis.io/commands/setrange - redis_strlen( conn_id, key ) - https://redis.io/commands/strlen - redis_discard( conn_id ) - https://redis.io/commands/discard - redis_exec( conn_id, output var ) - https://redis.io/commands/exec - redis_multi( conn_id ) - https://redis.io/commands/multi - redis_unwatch( conn_id ) - https://redis.io/commands/unwatch - redis_watch( conn_id, key ) - https://redis.io/commands/watch Miva Empresa/Mia/Script Compiler v5.31 Release Notes ---------------------------------------------------- Bugs Fixed ---------- 25940: crypto_base64_decode should not require padded "=" in order to successfully decode 26092: The compiler outputs an invalid engine version for every command line parameter 26134: Output::Write_Compressed_Full can read past the end of the buffer 26186: FunctionManager::Read should validate all values read from the binary 26188: Dictionary::Read should validate all values read from the binary 26189: VariableHash::Read should validate all values read from the binary 26190: LocalizedIndex::Read should validate all values read from the binary 26191: LocalizedDictionary::Read should validate all values read from the binary 26192: SegmentManager::Read should validate all values read from the binary 26193: TaggedFile::Header_Read should validate all values read from the binary 26194: TaggedFile::Directory_Read should validate all values read from the binary 26204: config3x_setconfigvalue leaks memory 26216: TaggedFile::Section_End doesn't grow directory entries properly 26221: LocalizedLanguages::Read should validate all values read from the binary 26310: MivaVM::localize / MivaVM::localizev need to ensure the dictionary is loaded New Builtin Functions --------------------- - miva_joinstring( input var, join_with, flags ) If the "input" parameter is a string, then a string is returned alongside any modifications made via the "flags" parameter. If the "input" parameter is an array, then a string is returned with each array element's value separated by the "join_with" parameter along with any modifications made via the "flags" parameter. If the "input" parameter is a structure, an empty string is returned. Parameters: - input - The input variable - join_with - The string that will seperate array elements - flags - A comma separated list of any of the following: - escape - Escapes the join_with characters if the join_with characters exists in the element's value. - insensitive - When combined with the escape flag, it will search for the join_with characters in an insensitive fashion. Return Value: - The joined string Other ----- - miva_splitstring Added flag "escaped" which will cause the function to not split on the separator character if the seperator character is escaped. - diagtool.mvc Added a new section, "MvCALL Test," which allows a user-defined URL to be tested with MvCALL. This is ideal for testing server certificates. Miva Empresa/Mia/Script Compiler v5.30 Release Notes ---------------------------------------------------- Bugs Fixed ---------- 25593: Add configuration variable MvCONFIG_FILE_CA 25869: Crash when an asynchronous task uses external database or commerce libraries 25896: Remove the LinkPoint library Miva Empresa/Mia/Script Compiler v5.29 Release Notes ---------------------------------------------------- Bugs Fixed ---------- 25417: Combinations of MvDO and MvFILTER in a script that later uses MvASYNCHRONOUS causes the asynchronous process to runaway Miva Empresa/Mia/Script Compiler v5.28 Release Notes ---------------------------------------------------- Bugs Fixed ---------- 22677: Readme.txt file should not contain the version number. 23343: Source files should be output without character escaping 23543: Implement COUNT( DISTINCT xxx ) 23601: MvCALL always sets POST when opening a multipart connection 23683: builtins/crypto.cpp: x509_free, pkcs7_free, etc. should decrement xxx_slot_pos when the last element in one of the slots is being freed 23729: evp_pkey_free does not exist. 23784: Setting a negative value for the DB command statement_cache_size causes a segfault 23790: path variable in UNIXFilePath / Win32FilePath is inconsistently set via malloc and new[] 24055: DumpApplication::OutputF is susceptible to SEGFAULTS 24169: Parentheses is spelled wrong in the Expression Compiler 24236: Subquery in a DELETE statement where the subquery joins back to the original table doesn't work as expected 24237: Update engine version to 5.28 for the Windows' Installer Packages 24243: SQLCodeGenerator::Dump_Program iterates over the program even when with no log file open 24246: Non-ALL UNIONs behave the same as UNION ALL 24255: SQL_Stack::Copy does not set the delete flag 24256: MvCAPTURE STANDARDOUTPUTLEVEL attribute 24257: Subquery in an UPDATE statement where the subquery joins back to the original table doesn't work as expected 24260: Add support for methods ""PATCH"", ""LINK"", ""UNLINK"" to MvCALL 24264: Schema::Log is susceptible to SEGFAULTS 24267: Using the LENGTH function in conjunction with an INDEX does not work as expected 24269: SQLResult::Share does not delete an existing _value_string 24274: It is not possible to sort a SELECT DISTINCT by a column that is not in the result set 24278: No error when a duplicate correlation name is specified 24351: MvCALL should allow any method to send files 24358: Add a file_overwrite builtin 24389: MivaApplication::EncodeAttribute should encode ascii char 127 (DEL) 24414: Line numbers are incorrect after an escaped quotation mark in an expression at the end of a line 24416: Add a min builtin 24417: Add a max builtin 24673: Add a miva_variable_type builtin 24674: SQL_Stack::PopR fails to pass the copy flag to ::SetValue New Builtin Functions --------------------- - evp_pkey_free( key var ) Remove an EVP_PKEY structure from internal memory. The passed EVP_PKEY structure reference is unchanged on failure (invalid reference) or set to 0 on success. Parameters: - key - EVP_PKEY structure reference Return Value: - 1 on success - 0 on failure - min( a, b ) Returns the smaller of a or b Parameters: - a - Value 1 - b - Value 2 Return Value: - a if smaller than b, b if smaller than a - max( a, b ) - The parameter value considered "lowest" during comparisons Parameters: - a - Value 1 - b - Value 2 Return Value: - The parameter value considered "highest" during comparisons - miva_variable_type( variable ) Returns a string representation of the internal variable type Parameters: - variable Return Value: - A string reprsentation of the interval variable type. "INTEGER", "DOUBLE", "ARRAY", etc... API Changes ----------- New Flags --------- MVVTYPE_NONE - When a variable has no type (i.e. doesn't exist) MVVTYPE_INTEGER - When a variable's primary type is an integer MVVTYPE_DOUBLE - When a variable's primary type is a double MVVTYPE_STRING - When a variable's primary type is a string MVVTYPE_STRUCTURE - When a variable's aggregate type is a structure MVVTYPE_ARRAY - When a variable's aggregrate type is an array New API Functions ----------------- - mvVariable_Type Takes an mvVariable and returns Parameters: - mvVariable variable: A variable Return Value: - MVVTYPE_xxx flag, or -1 when a variable has an unknown type - mvVariableHash_Entries Takes an mvVariableHash and returns the total number of entries in the variable hash Parameters: - mvVariableHash hash: A variable hash Return Value: - The number of entires in the variable hash MivaSQL ------- - SELECT commands now supports COUNT( DISTINCT column ) - UPDATE commands now support JOINs - DELETE commands now support JOINs - Added IFNULL function - Added RECNO virtual column Miva Empresa/Mia/Script Compiler v5.27 Release Notes ---------------------------------------------------- Bugs Fixed ---------- 23175: x509_load and x509_create leak an X509 pointer 23231: Segmentation fault on pkcs7_get_certs after failed pkcs7_load_mem 23260: evp_pkey_derive does not set error when passed an invalid key [index] 23267: pkcs7_get_signer_info does not set error when passed an invalid key [index] 23268: pkcs7_get_certs does not set error when passed an invalid key [index] 23273: x509_get_extensions does not return 0/false on given an invalid certificate [index] 23274: x509_get_issuer_name does not return 0/false on given an invalid certificate [index] 23275: x509_get_pubkey does not set error when passed an invalid key [index] 23277: x509_get_subject_name does not return 0/false on given an invalid certificate [index] 23280: x509_load_mem with a previously loaded certificate index and a bad certificate destroys existing certificate, segfaults 23281: evp_pkey_load_mem with existing certificate, invalid pkey will leave index into invalid pkey array contents. 23282: x509_create is deprecated, but should still work correctly. 23331: rsa internal storage inconsistent with x509, pkcs7, etc. 23428: FunctionParameter name lengths for some parameters incorrect. 23435: Formatting bug for file: builtins/crypto.cpp 23579: ISAPI (IIS 6 and earlier) no longer supported due to PCI concerns 23614: test/t_builtin_crypto: tests on functions using OpenSSL 1.0.X should skip if 0.9.x or 1.1.x 23618: Unsupported OpenSSL routines need graceful [or more graceful] handling 23648: pkcs7_verify returns "not enough data" on Cent48, cent39 23652: Incorrect formatting of "routine is unsupported" error 23661: crypto functions inserting values into an array need to "free" variable being used, crypto_allocate_X needs to null structure pointer consistently. 23664: Memory leak with non-closing mvt:callcontinue 23666: Memory leak in LinkPoint commerce library 23671: MvSMTP attempts to write to a conection after a TLS handshake failure, resulting in SIGPIPE New Builtin Functions --------------------- - x509_load_mem( cert, x509 var ) Loads and parses the text of an x509 certificate, and gives a certificate reference that refers to the certificate in internal storage. Parameters: - cert - Text of the certificate - x509 - Certificate reference. On success, this will be neither zero nor null Return Value: - 1 on success - 0 on failure - x509_get_subject_name( certref var, subjectname var ) Return X509 name information for the certificate referred to by the certificate reference. Parameters: - certref - Certificate reference returned from functions such as x509_load_mem - subjectname - Structure with members named for the entry names (e.g., "commonName", "countryName", etc.) Return Value: - 1 on success - 0 on failure - x509_get_issuer_name( certref var, issuername var ) Return X509 issuer information for the certificate referred to by the certificate reference. Parameters: - certref - Certificate reference returned from functions such as x509_load_mem - issuername - Structure with members named for the entry names (e.g., "commonName", "countryName", etc.) Return Value: - 1 on success - 0 on failure - x509_get_extensions( certref var, extensions var ) Return X509 extension information for the certificate referred to by the certificate reference. Parameters: - certref - Certificate reference returned from functions such as x509_load_mem - extensions - Structure with members named for the entry names (e.g., "data", "oid", etc.) Return Value: - 1 on success - 0 on failure - x509_digest( x509 var, digestname, digest var ) Return the digest of the given certificate referred to by the certificate reference, using the specified hash algorithm. Parameters: - x509 - Certificate reference returned from functions such as x509_load_mem - digestname - Hash algorithm name, such as "md5" or "sha256". Supported digest algorithms will vary between OpenSSL installations - digest - Hash value of the certificate Return Value: - 1 on success - 0 on failure - x509_pubkey_digest( x509 var, digestname, digest var ) Return the digest of the public key portion of the given certificate referred to by the certificate reference, using the specified hash algorithm. Parameters: - x509 - Certificate reference returned from functions such as x509_load_mem - digestname - Hash algorithm name, such as "md5" or "sha256". Supported digest algorithms will vary between OpenSSL installations - digest - Hash value of the public key of the certificate Return Value: - 1 on success - 0 on failure - crypto_evp_encrypt_auth( ciphername, key, iv, aad, plaintext, encrypted var, tag var ) Encrypt the data in "plaintext" using the ciphername, key, and initial vector, returning the encrypted data in "encrypted" and a tag value in "tag" to be used to ensure that the ciphertext and AAD are not tampered with in transit. Parameters: - ciphername - Name of cipher to use. An example is "aes-256-gcm" - key - Key value - iv - Initial vector - aad - Additional authenticated data - plaintext - Plaintext to encrypt - encrypted - Resulting encrypted value - tag - tag value Return Value: - 1 on success - 0 on failure - pkcs7_load_mem( cert, format, pkcs7 var ) Load a list of PKCS7 structures in the specified format into memory, and return a structure reference that refers to the structure(s) in internal storage. Parameters: - cert - Text of a list of pkcs7 structures - format - Format of the structure(s) passed in. Valid values are "der", "pem", or "pkcs12", with "der" used if the format is missing or any other values are passed - pkcs7 - Structure array reference. On success, this will be neither zero nor null Return Value: - 1 on success - 0 on failure - pkcs7_get_certs( pkcs7 var, x509s var ) Given a structure reference such as returned from pkcs7_load_mem, return certificate references for the x509 certificates that are embedded therein. Parameters: - pkcs7 - Structure reference - x509s - Array of x509 certificate references Return Value: - Count of x509 certificate references returned - -1 on failure - pkcs7_get_signer_info( pkcs7 var, output var ) Given a structure reference such as returned from pkcs7_load_mem, return an array of structures containing signer info. Parameters: - pkcs7 - Structure reference - output - Array of structures containing signing information. Each structure will contain members named "version", "issuer", "issuerSerial", "messageDigest" and "signingTime" Return Value: - Count of array elements returned - -1 on failure - pkcs7_verify( pkcs7 var, root_x509 var, content ) Given a pkcs7 structure reference and root x509 certificate reference, verify the pkcs7 structure and the signed content (if provided). Parameters: - pkcs7 - PKCS7 structure reference - root_x509 - Root x509 certificate reference - content - Optional content if not present in the PKCS structure Return Value: - 1 on success - 0 on failure - pkcs7_free( pkcs7 var ) Remove a pkcs7 structure from internal memory. The passed pkcs7 structure reference is unchanged on failure (invalid reference) or set to 0 on success. Parameters: - pkcs7 - PKCS7 structure reference Return Value: - 1 on success - 0 on failure - evp_pkey_load_mem( data, format, passphrase, pkey var ) Given a EVP PKEY structure in the given format and a passphrase, verifies the PKEY structure and stores it in internal storage, and returns a reference to the internal storage. Parameters: - data - EVP PKEY structure text - format - Format of the PKEY structure text. Only "pkcs12" is supported - passphrase - Passphrase for the PKEY structure - pkey - Structure reference Return Value: - 1 on success - 0 on failure - evp_pkey_load_pubkey_mem( data, format, pkey var ) Given EVP PKEY information in the given format, parse and load the public key from it and return a reference to the internal storage. Parameters: - data - EVP PKEY text - format - Format of the EVP PKEY text. Valid values are "pem" and "der" - pkey - Structure reference to internal storage Return Value: - 1 on success - 0 on failure - evp_pkey_derive( privkey var, peer var, key var ) Given structure references to a EVP PKEY structure with a secret key and a peer public key, derive a shared secret key and return the text in "key". Parameters: - privkey - EVP PKEY structure reference - peer - EVP PKEY structure reference - key - Returned text of shared secret key Return Value: - 1 on success - 0 on failure Miva Empresa/Mia/Script Compiler v5.26 Release Notes ---------------------------------------------------- Bugs Fixed ---------- 22937: Builtins: string: indexofl / indexofli enters infinite loop with certain parameters Miva Empresa/Mia/Script Compiler v5.25 Release Notes ---------------------------------------------------- Bugs Fixed ---------- 22782: IIS Integration: IIS6 integration times out/locks up while serving requests Miva Empresa/Mia/Script Compiler v5.24 Release Notes ---------------------------------------------------- Bugs Fixed ---------- 3x configuration loading now correctly tracks line numbers in the configuration and the auth configuration files. 5599: Compiler: Compiler ignores variable names containing spaces 8969: Builtins: crypto: crypto_last_error does not always accurately report OpenSSL error messages 9734: Virtual Machine: autoincrement of uninitialized structure member in a tags throw an error inside an tag 20983: Packaging: Add AddTrust External CA Root certificate to trusted certificates 21012: Builtins: system: Add miva_setprocessname builtin 21026: Compiler: MvINCLUDE with INTERPRET = "off" on an empty file returns an incorrect compiler error 21035: Builtins: system: Add a miva_struct_merge and miva_struct_merge_ref builtin 21038: Builtins: system: Add a miva_csv_encode builtin 21104: Builtins: archive: tar_create should not fail on files it cannot read 21219: Virtual Machine: Functions that take an "index" parameter need to check for and reject negative indexes 21220: Builtins: file: Race condition in _bi_file_write when creating a new file 21291: Builtins: system: Add a miva_html_strip builtin 21292: Builtins: system: Add a miva_cdata_encode builtin 21320: Virtual Machine: Lock files are not touched during miva_sleep (or miva_async_sleep) 21431: Virtual Machine: EncodeJavaScriptString mistakenly escapes underscore characters 21462: Builtins: string: Add a indexofl and indexofli builtin 21512: Virtual Machine: MvCALL should be able to receive a certificate directly from a variable 21764: Compiler: Nested MvASYNCHRONOUS gives correct error, but additional incorrect error 21765: Builtins: system: Add a miva_array_filter and miva_array_filter_ref builtin 21818: Builtins: math: Add a miva_ieee754_normalize builtin 21842: Compiler: Combination of MvASSIGNARRAY & MvREFERENCEARRAY tags generate invalid assembler code 21854: PostgreSQL: Add support for PostgreSQL 21858: Virtual Machine: It should not be possible to create system variables through MivaScript 21859: Virtual Machine: All non special system variables should be ImmutableVariables 21876: MivaSQL: MivaSQL COUNT function returns an empty string when 0 records exist 21917: Compiler: Compiling a file that includes a recursive MvINCLUDE causes a SEGFAULT 22094: Virtual Machine: s.process_id and s.thread_id values should be consistent across platforms 22107: Miva Mia: Mia icon is "Miva 3" logo 22178: IIS Integration: IIS7 configuration schema file is incorrectly named, or documentation is incorrect New Builtin Functions --------------------- - miva_setprocessname( name ) Set the process name (where possible) and alters the s.process_name variable. Parameters: - name - Text to set the process name to. Return Value: - None. - miva_async_sleep( until, semfile, semlocation ) Sleep until the "until" time, or the modified time on the file described by semfile and semlocation is changed. Parameters: - until - time_t (seconds since 1-JAN-1970) set in the future, the time to sleep until. - semfile - file name to watch. - semlocation - location of the file to watch. "script" or "data", defaulting to "data" if any other value. - miva_csv_encode( text, delimiter ) Takes a string of text and a delimiter, and returns a string with appropriately doubled quotes or escaped delimiters, suitable for including in a CSV record. Parameters: - text - String to escape - delimiter - separation character (for example, a "," for a comma-separated list). Returns: - An appropriately escaped or quoted string, or a copy of the original string if no quotes or delimiters were found. - miva_html_strip( text, allowed_tags ) Remove HTML tags from a given string. Parameters: - text - String to remove HTML tags from. - allowed_tags - A comma-separated list of tags that will not be stripped from the string. Return value: Text with all HTML tags except those listed in allowed_tags removed. - miva_cdata_encode( text ) Create one or more CDATA tags with the provided text, splitting any data with "]]>" into two CDATA tags with "]]" at the end of one CDATA tag, and ">" as the first value of the next CDATA tag. Parameters: - text - String to encode Return value: Text quoted within one or more CDATA tags. - file_touch( file, location ) Updates the modification time of the specified file. Parameters: - file - File name. - location - File location. "script" or "data", defaulting to "data" if any other value. Return value: 0 on success, -1 on failure. - miva_struct_merge( source var, dest var ) Copy the structure members from source into dest, if the member does not exist in dest. See also miva_struct_merge_ref. Parameters: - source - Structure to copy into dest. - dest - Destination structure. Return value: None. - miva_struct_merge_ref( source var, dest var ) Make references of the structure members from source in dest, if the member does not exist in dest. Similar to miva_struct_merge, but makes references into original structure rather than copies. Parameters: - source - Structure to copy into dest. - dest - Destination structure. Return value: None. - indexofl( needle, haystack var, offset ) Search from the end of the haystack for needle, starting at the offset position. Parameters: - needle var - Value to search for. - haystack var - Text to search. - offset - integer offset to start at. Return value: Index of found value, or 0 if not found. - indexofli( needle, haystack var, offset ) Search without regard to case from the end of the haystack for needle, starting at the offset position. Parameters: - needle var - Value to search for. - haystack var - Text to search. - offset - integer offset to start at. Return value: Index of found value, or 0 if not found. - miva_array_filter( array var, offset, element var, filter_expression, output var ) Iterate through an array starting at a given offset, execute a filter expression against each element, and copy the member to a new output array. See also miva_array_filter_ref. Parameters: - array var - Source array of structures. - offset - index in the array to start filtering from. - element var - Name of a variable to reference in the filter expression. - filter_expression - Text of an expression to execute based on the individual array element. - output var - Output array of all structures that tested true in the filter expression. Return value: Count of output array elements. - miva_array_filter_ref( array var, offset, element var, filter_expression, output var ) Iterate through an array starting at a given offset, execute a filter expression against each element, and create a new member with references to the members in the output array. See also miva_array_filter. Parameters: - array var - Source array of structures. - offset - index in the array to start filtering from. - element var - Name of a variable to reference in the filter expression. - filter_expression - Text of an expression to execute based on the individual array element. - output var - Output array of all structures that tested true in the filter expression. Return value: Count of output array elements. - miva_ieee754_normalize( significant_digits, value ) Normalize the value to IEEE 754 specifications, to the given number of significant digits. Parameters: - significant_digits - Number of digits to normalize the value to. - value - Floating point value to normalize. Return value: The normalized value to the specified significant digits - rsa_load_publickey_engine( engine, key_id, rsa var ) Load an encryption key based on a key id. Parameters: - engine - Name of the encryption engine to use. - key_id - identifier of the key to load - rsa - RSA public key associated with the engine and key ID. Return value: - 1 on success, 0 on failure. - rsa_load_privatekey_engine( engine, key_id, rsa var ) Load an encryption key based on a key id. Parameters: - engine - Name of the encryption engine to use. - key_id - identifier of the key to load - rsa - RSA private key associated with the engine and key ID. Return value: - 1 on success, 0 on failure. - crypto_rand_set_rand_engine( engine ) Specify the random number generating engine to use. Parameters: - engine - Name of the random number generator engine to use. Return value: - 1 on success, 0 on failure. API Changes ----------- New Flags --------- MVF_MODE_EXISTING - Used in mvFile_Open "mode" parameter. Open an existing file, or return an error if the file does not exist. New API Functions ----------------- mvLinkBuffer_Concat_String_Nocopy Takes the passed string for concatenation, and assigns ownership of the string to the LinkBuffer (i.e., do not call mvProgram_Free on the memory). Parameters: - mvLinkBuffer linkbuffer: A previously allocated mvLinkBuffer. - const char *buffer: The data string to add to the end of the LinkBuffer string. - int buffer_length: The length of the passed-in data pointer. - int buffer_size: The allocated size of the passed-in data pointer. Return Value: None mvLinkBuffer_Concat_Int Takes the passed integer for concatenation to the end of the LinkBuffer. Parameters: - mvLinkBuffer linkbuffer: A previously allocated mvLinkBuffer. - int value: The integer value to to add the text representation of to the end of the LinkBuffer string. Return Value: None mvLinkBuffer_Concat_Double Takes the passed double for concatenation to the end of the LinkBuffer. Parameters: - mvLinkBuffer linkbuffer: A previously allocated mvLinkBuffer. - double value: The double value to to add the text representation of to the end of the LinkBuffer string. Return Value: None mvLinkBuffer_Concat_Variable Takes the passed mvVariable for concatenation to the end of the LinkBuffer. Parameters: - mvLinkBuffer linkbuffer: A previously allocated mvLinkBuffer. - mvVariable value: The mvVariable to append the value of to the end of the LinkBuffer string. Return Value: None mvProgram_SetProcessName Set the process name (on platforms that this is supported) and s.process_name to the given text. Parameters - mvProgram program: The current MivaVM. - const char *name: Text to set the process name to. - int name_length: Length of the text to set the process name to. Return Value: None mvFile_NormalizePath Return a normalized path respecting the passed location and that locations configured properties concerning following symbolic links, etc. Parameters - mvProgram program: The current MivaVM. - int location: Location of the file (one of MVF_SCRIPT, MVF_DATA, or MVF_COMMERCE, defined in mivapi.h). - const char *path: Path to normalize. - int *normalized_length: If not NULL, the address of an integer to put the length of the resulting normalized path into. - int *normalized_size: If not NULL, the address of an integer to put the allocated size of the resulting normalized path into. Return Value: char * to the normalized path. PostgreSQL ---------- A PostgreSQL connector is now available. FastCGI ------- A FastCGI implementation of the Miva Virtual Machine is now available. Language Changes ---------------- o MvCALL now accepts the CERTVALUE attribute, to allow inclusion of a certificate directly in the code, as opposed to being the contents of a file pointed to by the CERTFILE attribute. o MvASYNCHRONOUS Code within a and block will start to execute in a separate asynchronous task, and the task will exit when the block is reached. All output, even via , is discarded from the asynchronous task. Asynchronous tasks can not be started from within an asynchronous task. The number of asynchronous tasks allowed, the timeout time for an asynchronous task, and an absolute timeout for miva_async_sleep are all configurable. o New s.miva_config members: ssl_config - The location of the OpenSSL .cnf file. max_async_tasks - Maximum allowed asynchronous tasks (0 = unlimited) timeout_async - Timeout in seconds for an asynchronous task. timeout_async_sleep - Timeout in seconds for miva_async_sleep (if the semaphore file is not modified). o MvINCLUDE now takes the "INTERPRET" attribute. 'INTERPRET = "OFF"' will include the text of the included file as a literal, without interpreting or compiling html or Miva Script tags. 'INTERPRET = "ON"', the default if the attribute is omitted, will parse and compile the included file as before. o A new system variable s.thread_id exists. This will be unique across asynchronous tasks, and may or may not be the same value as the s.process_id. Configuration Changes --------------------- New configuration settings: Location of the OpenSSL .cnf file (type=text) MvCONFIG_SSL_CONFIG (env) openssl_config (3x) Maximum allowed asynchronous tasks (0 = unlimited) (type=numeric) MvCONFIG_MAX_ASYNCHRONOUS_TASKS (env) asynctimeout (3x) Timeout in seconds for miva_async_sleep (if the semaphore file is not modified). (type=numeric) MvCONFIG_TIMEOUT_ASYNCHRONOUS_SLEEP (env) asyncsleeptimeout (3x) Timeout in seconds for asynchronous tasks (0 = unlimited) (type=numeric) MvCONFIG_TIMEOUT_ASYNCHRONOUS (env) asynctimeout (3x) Miva Empresa/Mia/Script Compiler v5.23 Release Notes ---------------------------------------------------- Bugs Fixed ---------- 15219: Virtual Machine: HTTP headers are not correctly parsed in some cases 17647: Code Coverage Tool: mvcov --version flag should output a newline 17648: Profiling Tool: mvprof --version flag should output a newline 17782: Compiler: Compiling with -O flag on a string with escape characters causes unexpected behavior 18236: Compiler: Function parameters should not allow blank values 18241: Compiler: Compiler fails to correctly compile when a exposes MvCALL functionality to the template language. Attributes are identical to those for MvCALL. and are permitted. - New tag exposes MvDO functionality to the template language. Attributes are identical to those for MvDO. - New entity method &mvtj allows tokens to be output with the correct encoding for use within JavaScript quoted strings. New Features ------------ - Hexadecimal integer constants are now consistently handled across all platforms. Miva Merchant Empresa/Mia/Script Compiler v5.20 Release Notes ------------------------------------------------------------- Bugs Fixed ---------- 7264: Builtins: archive: xml_parse cannot handle empty tag closure /> without leading whitespace 10930: Builtins: archive: xml_parse does not handle HTML/SGML comments without at least one space after the opening "