PHP Fatal error: Possible integer overflow in memory allocation (4294925566 * 32 32) SAP rfc 整数溢出

piaoling  2025-07-31 18:21:53
PHP Fatal error:  Possible integer overflow in memory allocation (4294925566 * 32 + 32) SAP rfc 整数溢出问题解决方案:

此问题是获取sap function时偶尔发生,获取function时会查找function的参数数量,当出现以下情况时,会导致返回的参数数量异常大,导致整数溢出,这和php自身内存配置没有任何关系:
✅ 常见原因
原因    说明
1. 函数元数据损坏或未正确加载    SAP 系统中该 RFC 函数定义异常,或缓存未刷新
2. 使用了错误或过期的 function_desc_handle    句柄无效,导致读取了垃圾内存
3. SAP NW RFC SDK 版本 bug    旧版本 SDK(如 7.20)存在内存管理问题
4. 多线程/并发访问导致句柄污染    在多线程环境下共享连接未加锁
5. 网络中断或 SAP 系统临时不可用    连接状态异常,返回了错误的函数描述

我使用的php sap rfc扩展版本是git上的gkralik/php7-sapnwrfc,php7-sapnwrfc-2.0.0-beta2版。

获取sap function直接报fata error:整型溢出,需要修复源码文件sapnwrfc.c 源码修复:

修复PHP_METHOD(Connection, getFunction)这个方法:

找到以下代码:zend_hash_init(func_intern->parameter_status, func_intern->parameter_count, NULL, NULL, 0);

替换为:

// +++ 关键修复:检查参数数量是否有效 +++
    if (func_intern->parameter_count > 10000) { // 设置合理上限(通常RFC函数参数<1000)
        zend_throw_exception_ex(
            NULL,
            0,
            "Invalid parameter count (%u) for function %s",
            func_intern->parameter_count,
            ZSTR_VAL(func_intern->name)
        );
        RETURN_NULL();
    }
    if (func_intern->parameter_count == 0) { // 检查0值情况
        zend_hash_init(func_intern->parameter_status, 8, NULL, NULL, 0); // 使用最小容量
    } else {
        zend_hash_init(func_intern->parameter_status, func_intern->parameter_count, NULL, NULL, 0);
    }

//修复结束

重新编译扩展,重启服务器。可以解决fatal error的问题。虽然php不会报错,但仍然没有解决根本问题,获取sap的参数数量异常大。

建立sap服务器连接时,禁止使用函数描述缓存,解决了这个问题,连接代码如下:

$options = [
    'use_function_desc_cache' => false,
];
$connection = new SapConnection($config,$options); 

                         
原文链接:https://blog.csdn.net/weixin_42094315/article/details/149807934
类别 :  默认(762)  |  浏览(15)  |  评论(0)
发表评论(评论将通过邮件发给作者):

Email: