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语言代码为:

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。

相关推荐
hhcgchpspk17 小时前
一次msf免杀渗透入门实践
linux·经验分享·网络安全·系统安全·渗透·msf
小白勇闯网安圈17 小时前
Vmware的Ubuntu构建极简版Linux发行版
linux
刘某的Cloud17 小时前
shell脚本-read-输入
linux·运维·bash·shell·read
broad-sky17 小时前
Ubuntu上查看USB相机连接的是哪个口,如何查看
linux·数码相机·ubuntu
秋深枫叶红17 小时前
嵌入式第三十七篇——linux系统编程——线程控制
linux·学习·线程·系统编程
shaohui97318 小时前
ARMv7 linux中断路由以及处理
linux·gic·cpsr·armv7
三小尛18 小时前
linux的开发工具vim
linux·运维·vim
陈陈爱java18 小时前
Conda 常用命令行
linux·windows·conda
twdnote18 小时前
dokcer 环境中集成LibreOffice
linux
ChristXlx18 小时前
Linux安装redis(虚拟机适用)
linux·运维·redis