博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
记录发现的一个hiredis的bug
阅读量:6488 次
发布时间:2019-06-24

本文共 1054 字,大约阅读时间需要 3 分钟。

hiredis是redis官方提供的c客户端库。在读代码的过程中,发现了一个bug,记录一下。

hiredis里定义了一个上下文结构(struct redisContext),代码如下(deps/hiredis/hiredis.h):

157 /* Context for a connection to Redis */158 typedef struct redisContext {159     int err; /* Error flags, 0 when there is no error */160     char errstr[128]; /* String representation of error when applicable */161     int fd;162     int flags;163     char *obuf; /* Write buffer */164     redisReader *reader; /* Protocol reader */165 } redisContext;

针对这个结构,有一个对应的free function,代码如下(deps/hiredis/hiredis.c):

1004 void redisFree(redisContext *c) {1005     if (c->fd > 0)1006         close(c->fd);1007     if (c->obuf != NULL)1008         sdsfree(c->obuf);1009     if (c->reader != NULL)1010         redisReaderFree(c->reader);1011     free(c);1012 }

对照下,可以看到,定义中obuf成员使用的是char* ,而在释放操作时,却是按照sds结构(redis自己定义的类string数据结构)进行的释放。

如果再看下sdsfree的函数(deps/hiredis/sds.c),就能看到可能造成的灾难性后果:

76 void sdsfree(sds s) { 77     if (s == NULL) return; 78     free(s-sizeof(struct sdshdr)); 79 }

如上。在hiredis的github中,错误仍可以看到。

 

刚给redis DB邮件组发了封邮件,不知是否会被回复。

转载地址:http://siauo.baihongyu.com/

你可能感兴趣的文章
动态链接库dll,静态链接库lib, 导入库lib
查看>>
Object C学习笔记25-文件管理(一)
查看>>
linux hosts一个诡异问题
查看>>
Unity3d 嵌入GoogleMap
查看>>
使用IDEA进行远程调试
查看>>
c++ 发布动态.so
查看>>
城市之间的最短总距离(最小生成树算法)
查看>>
使用CSS为图片添加边框的几种方法
查看>>
实现拖动文件到窗体(控件)
查看>>
对 sql server 数据库的备份进行加密
查看>>
YY博客园UML时序图之博客模块
查看>>
《深入浅出 Java Concurrency》—锁紧机构(一)Lock与ReentrantLock
查看>>
Nginx+Keepalived主备切换(包含nginx服务停止)
查看>>
【linux高级程序设计】(第十三章)Linux Socket网络编程基础 4
查看>>
android中画文字的换行 办法(对于遇到canvas.drawText(String s )无法实现换行问题的解决)...
查看>>
Android IOS WebRTC 音视频开发总结(三九)-- win10升级为何要p2p
查看>>
树莓派的rc.local档(设置开机)
查看>>
chrome打开本地文件目录
查看>>
mysql ODBC 在64位下提示找不到odbc驱动问题
查看>>
MySQL的事务处理及隔离级别
查看>>