0 Star 0 Fork 40

wangjufeng/multipath-tools

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
9010-bugfix-some-memory-leaks-issues-in-libmpathpersist.patch 4.98 KB
一键复制 编辑 原始数据 按行查看 历史
wangjufeng 提交于 2020-01-10 17:13 . rename the package
diff --git a/libmpathpersist/mpath_persist.c b/libmpathpersist/mpath_persist.c
index 27c848c..1e6a172 100644
--- a/libmpathpersist/mpath_persist.c
+++ b/libmpathpersist/mpath_persist.c
@@ -199,6 +199,11 @@ int mpath_persistent_reserve_in (int fd, int rq_servact,
if (map_present && !dm_is_mpath(alias)){
condlog( 0, "%s: not a multipath device.", alias);
ret = MPATH_PR_DMMP_ERROR;
+ if (curmp)
+ vector_free(curmp);
+ if (pathvec)
+ vector_free(pathvec);
+
goto out;
}
@@ -297,6 +302,10 @@ int mpath_persistent_reserve_out ( int fd, int rq_servact, int rq_scope,
if (map_present && !dm_is_mpath(alias)){
condlog(3, "%s: not a multipath device.", alias);
ret = MPATH_PR_DMMP_ERROR;
+ if (curmp)
+ vector_free(curmp);
+ if (pathvec)
+ vector_free(pathvec);
goto out;
}
@@ -321,7 +330,7 @@ int mpath_persistent_reserve_out ( int fd, int rq_servact, int rq_scope,
goto out1;
}
- /* get info of all paths from the dm device */
+ /* get info of all paths from the dm device */
if (get_mpvec(curmp, pathvec, alias)){
condlog(0, "%s: failed to get device info.", alias);
ret = MPATH_PR_DMMP_ERROR;
@@ -882,7 +891,7 @@ out:
return (status);
}
-void * mpath_alloc_prin_response(int prin_sa)
+void *mpath_alloc_prin_response(int prin_sa)
{
void * ptr = NULL;
int size=0;
@@ -905,6 +914,10 @@ void * mpath_alloc_prin_response(int prin_sa)
if (size > 0)
{
ptr = calloc(size, 1);
+ if (!ptr) {
+ condlog (0, "failed to allocate MPATH_PRIN_RFSTAT_SA buffer");
+ return NULL;
+ }
}
return ptr;
}
diff --git a/libmpathpersist/mpath_pr_ioctl.c b/libmpathpersist/mpath_pr_ioctl.c
index 6dd7403..b317b4e 100644
--- a/libmpathpersist/mpath_pr_ioctl.c
+++ b/libmpathpersist/mpath_pr_ioctl.c
@@ -25,8 +25,8 @@
int prin_do_scsi_ioctl(char * dev, int rq_servact, struct prin_resp *resp, int noisy);
void mpath_format_readkeys(struct prin_resp *pr_buff, int len , int noisy);
void mpath_format_readfullstatus(struct prin_resp *pr_buff, int len, int noisy);
-int mpath_translate_response (char * dev, struct sg_io_hdr io_hdr,
- SenseData_t *Sensedata, int noisy);
+int mpath_translate_response (const char *dev, struct sg_io_hdr *io_hdr,
+ const SenseData_t *Sensedata, int noisy);
void dumpHex(const char* str, int len, int no_ascii);
int prout_do_scsi_ioctl( char * dev, int rq_servact, int rq_scope,
unsigned int rq_type, struct prout_param_descriptor *paramp, int noisy);
@@ -115,7 +115,7 @@ retry :
condlog(4, "%s: Duration=%u (ms)", dev, io_hdr.duration);
- status = mpath_translate_response(dev, io_hdr, &Sensedata, noisy);
+ status = mpath_translate_response(dev, &io_hdr, &Sensedata, noisy);
condlog(3, "%s: status = %d", dev, status);
if (status == MPATH_PR_SENSE_UNIT_ATTENTION && (retry > 0))
@@ -354,7 +354,7 @@ retry :
condlog(3, "%s: duration = %u (ms)", dev, io_hdr.duration);
condlog(4, "%s: persistent reservation in: requested %d bytes but got %d bytes)", dev, mx_resp_len, got);
- status = mpath_translate_response(dev, io_hdr, &Sensedata, noisy);
+ status = mpath_translate_response(dev, &io_hdr, &Sensedata, noisy);
if (status == MPATH_PR_SENSE_UNIT_ATTENTION && (retry > 0))
{
@@ -399,18 +399,18 @@ out:
return status;
}
-int mpath_translate_response (char * dev, struct sg_io_hdr io_hdr,
- SenseData_t *Sensedata, int noisy)
+int mpath_translate_response (const char *dev, struct sg_io_hdr *io_hdr,
+ const SenseData_t *Sensedata, int noisy)
{
condlog(3, "%s: status driver:%02x host:%02x scsi:%02x", dev,
- io_hdr.driver_status, io_hdr.host_status ,io_hdr.status);
- io_hdr.status &= 0x7e;
- if ((0 == io_hdr.status) &&
- (0 == io_hdr.host_status) &&
- (0 == io_hdr.driver_status))
+ io_hdr->driver_status, io_hdr->host_status ,io_hdr->status);
+ io_hdr->status &= 0x7e;
+ if ((0 == io_hdr->status) &&
+ (0 == io_hdr->host_status) &&
+ (0 == io_hdr->driver_status))
return MPATH_PR_SUCCESS;
- switch(io_hdr.status) {
+ switch(io_hdr->status) {
case SAM_STAT_GOOD:
break;
case SAM_STAT_CHECK_CONDITION:
@@ -450,13 +450,13 @@ int mpath_translate_response (char * dev, struct sg_io_hdr io_hdr,
return MPATH_PR_OTHER;
}
- switch(io_hdr.host_status) {
+ switch(io_hdr->host_status) {
case DID_OK :
break;
default :
return MPATH_PR_OTHER;
}
- switch(io_hdr.driver_status)
+ switch(io_hdr->driver_status)
{
case DRIVER_OK:
break;
diff --git a/mpathpersist/main.c b/mpathpersist/main.c
index 0e4d3f2..4db07b2 100644
--- a/mpathpersist/main.c
+++ b/mpathpersist/main.c
@@ -61,7 +61,7 @@ struct udev *udev;
int main (int argc, char * argv[])
{
- int fd, c, res;
+ int c, res, fd = -1;
const char *device_name = NULL;
int num_prin_sa = 0;
int num_prout_sa = 0;
@@ -488,6 +488,7 @@ int main (int argc, char * argv[])
}
res = close (fd);
+ fd = -1;
if (res < 0)
{
mpath_lib_exit(conf);
@@ -496,6 +497,8 @@ int main (int argc, char * argv[])
}
out :
+ if (fd >= 0)
+ close(fd);
mpath_lib_exit(conf);
udev_unref(udev);
return (ret >= 0) ? ret : MPATH_PR_OTHER;
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/wangjufeng/multipath-tools.git
git@gitee.com:wangjufeng/multipath-tools.git
wangjufeng
multipath-tools
multipath-tools
master

搜索帮助