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。

相关推荐
ShineWinsu2 小时前
对于Linux:动静态库的制作与原理的解析—下
linux·运维·服务器·进程·链接·虚拟地址空间·
RH2312113 小时前
2026.4.16Linux 管道
java·linux·服务器
handler013 小时前
Linux: 基本指令知识点(2)
linux·服务器·c语言·c++·笔记·学习
liuyukuan3 小时前
如何在win11上打开 WSL2(Windows 的 Linux 子系统)?
linux·windows
橙子也要努力变强4 小时前
Linux信号机制
linux·服务器·网络
shughui4 小时前
FinalShell / Xshell 完整教程(下载+安装+使用,2026最新版)
linux·fiddler·xshell·xftp·finalshell·远程连接工具
程序猿编码4 小时前
给你的网络流量穿件“隐形衣“:手把手教你用对称加密打造透明安全隧道
linux·开发语言·网络·安全·linux内核
pengyi8710154 小时前
私网IP映射公网基础原理,搭配代理IP远程访问入门
linux·服务器·网络
深圳市九鼎创展科技5 小时前
MT8883 vs RK3588 开发板全面对比:选型与场景落地指南
大数据·linux·人工智能·嵌入式硬件·ubuntu
RisunJan6 小时前
Linux命令-ngrep(方便的数据包匹配和显示工具)
linux·运维·服务器