当前位置: 首页 > article >正文

glibc中xdr的一个bug

本人在64位linux服务器上(centos7),发现xdr_u_long这个函数有个bug,就是数字的范围如果超过unsigned int的最大值(4294967295)时,xdr_u_long失败。

这个场景主要用在unix时间戳上面,比如一款软件,设置有效期为100年。即失效时间为2124年10月26日,对应的unix时间戳大概为4885545600。而xdr_u_long在编码数字4885545600时,会报错。

经过测试,xdr_u_long所能编码的最大值为4294967295,此时间戳对应的时间大概是2106年。
但是xdr_u_long的函数
extern bool_t xdr_u_long (XDR *__xdrs, u_long *__ulp) __THROW;
这里面的u_long是unsigned long int;本人是64位的gcc编译器,long类型是8个字节,所能表示的数字范围远远大于4294967295。但是4294967296代入这个函数就会报错,对应的c语言代码为:

#include <stdio.h>
#include <rpc/xdr.h>

int main()
{
    XDR xdr;
    char buff[120];
    unsigned long time = 4294967296;
    xdrmem_create(&xdr,buff,120,XDR_ENCODE);
    if(!xdr_u_long(&xdr, &time))
    {
        printf("xdr encode failed\n");
        return -1;
    }
    return 0;
}

如果要编码大于4294967295不报错,可以使用函数xdr_uint64_t。
而uint64_t和u_long的类型是一致的,都是unsigned long int。

所以说xdr_u_long在表示范围大于4294967295时,存在bug。


http://www.kler.cn/a/368915.html

相关文章:

  • uniapp+uniCloud前端独立开发全栈项目Vue3版本学习路线,轻松开发H5、微信小程序、APP
  • Presto
  • 张驰咨询:六西格玛培训费用,到底值不值得花?
  • Lodash.js处理数组、对象、函数等常用方法介绍
  • 机器学习 - 概述、数据集、Scikit-learn
  • 基于Datawhale开源量化投资学习指南(11):LightGBM在量化选股中的优化与实战
  • python kafka 发送/接收 消息
  • 协议 HTTP
  • WPF+MVVM案例实战(八)- 自定义开关控件封装实现
  • Docker 常用命令全解析:提升对雷池社区版的使用经验
  • 我在1024谈华为
  • SLAM是什么,分类
  • MySQL基础快速复习及高级语法学习
  • Maven入门到进阶:构建、依赖与插件管理详解
  • 在项目中如何实现 Redis 分布式锁?
  • Golang | Leetcode Golang题解之第506题相对名次
  • 【React系列五】—React学习历程的分享
  • C# OOP面试题精选 面向新手/SOLID原则/设计模式++ 长期更新
  • 为什么在网络中不能直接传输数据
  • Linux 文件权限管理:chown、chgrp 和 chmod 的使用及权限掩码规则
  • 高效集成钉钉报销到金蝶付款单的技术实现
  • CSRF 点击劫持
  • 摊牌了,创业失败了
  • python实战(二)——房屋价格回归建模
  • WebSocket学习笔记
  • Kafka之消费者客户端