dm-devel.redhat.com archive mirror
 help / color / mirror / Atom feed
* [PATCH] multipathd: "show map mpathx json" would cause realloc error possibly
@ 2016-10-14  3:13 tang.wenjun3
  0 siblings, 0 replies; 3+ messages in thread
From: tang.wenjun3 @ 2016-10-14  3:13 UTC (permalink / raw)
  To: Christophe Varoqui; +Cc: zhang.kai16, dm-devel, 10144149

From: 10144149 <tang.wenjun3@zte.com.cn>

Problem: multipathd dead when we run "show map spathx json" command with
system messages as follows:
Oct 13 11:37:30 rhel7-1 multipathd: *** Error in `/sbin/multipathd': realloc(): invalid next size: 0x00007f8cf8004210 ***
Oct 13 11:37:30 rhel7-1 multipathd: ======= Backtrace: =========
Oct 13 11:37:30 rhel7-1 multipathd: /lib64/libc.so.6(+0x7bc67)[0x7f8d06171c67]
Oct 13 11:37:30 rhel7-1 multipathd: /lib64/libc.so.6(+0x7fb17)[0x7f8d06175b17]
Oct 13 11:37:30 rhel7-1 multipathd: /lib64/libc.so.6(realloc+0xd2)[0x7f8d06176702]

Reasons: in function snprint_multipath_fields_json
vector_foreach_slot (pgp->paths, pp, j) {
       fwd += snprint_path(buff + fwd, len - fwd, PRINT_JSON_PATH, pp, 0);
       if (fwd > len)
            return fwd;

       fwd += snprint_json_elem_footer(buff + fwd,
                len - fwd, 3, j + 1 == VECTOR_SIZE(pgp->paths));
       if (fwd > len)
           return fwd;
}

snprint_path (char * line, int len, char * format, struct path * pp, int pad)

when len - fwd = 0 , The len is not restricted in snprint_path,and the Memory of line is
rewritten in snprint_path, it cause realloc() failed , so fwd > len modify
fwd >= len.

Other commands also have this type of risk.

Signed-off-by: 10144149 <tang.wenjun3@zte.com.cn>
---
 libmultipath/print.c | 131 ++++++++++++++++++++++++++-------------------------
 1 file changed, 66 insertions(+), 65 deletions(-)

diff --git a/libmultipath/print.c b/libmultipath/print.c
index 9aa41ad..78c065f 100644
--- a/libmultipath/print.c
+++ b/libmultipath/print.c
@@ -1004,11 +1004,11 @@ snprint_multipath_topology (char * buff, int len, struct multipath * mpp,
 		c += sprintf(c, "%c[%dm", 0x1B, 0); /* bold off */
 
 	fwd += snprint_multipath(buff + fwd, len - fwd, style, mpp, 1);
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 	fwd += snprint_multipath(buff + fwd, len - fwd, PRINT_MAP_PROPS, mpp,
 				 1);
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 
 	if (!mpp->pg)
@@ -1022,7 +1022,7 @@ snprint_multipath_topology (char * buff, int len, struct multipath * mpp,
 		} else
 			strcpy(f, "`-+- " PRINT_PG_INDENT);
 		fwd += snprint_pathgroup(buff + fwd, len - fwd, fmt, pgp);
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 
 		vector_foreach_slot (pgp->paths, pp, i) {
@@ -1035,13 +1035,14 @@ snprint_multipath_topology (char * buff, int len, struct multipath * mpp,
 			else
 				strcpy(f, " `- " PRINT_PATH_INDENT);
 			fwd += snprint_path(buff + fwd, len - fwd, fmt, pp, 1);
-			if (fwd > len)
+			if (fwd >= len)
 				return len;
 		}
 	}
 	return fwd;
 }
 
+
 static int
 snprint_json (char * buff, int len, int indent, char *json_str)
 {
@@ -1049,7 +1050,7 @@ snprint_json (char * buff, int len, int indent, char *json_str)
 
 	for (i = 0; i < indent; i++) {
 		fwd += snprintf(buff + fwd, len - fwd, PRINT_JSON_INDENT);
-		if (fwd > len)
+		if (fwd >= len)
 			return fwd;
 	}
 
@@ -1063,7 +1064,7 @@ snprint_json_header (char * buff, int len)
 	int fwd = 0;
 
 	fwd +=  snprint_json(buff, len, 0, PRINT_JSON_START_ELEM);
-	if (fwd > len)
+	if (fwd >= len)
 		return fwd;
 
 	fwd +=  snprintf(buff + fwd, len  - fwd, PRINT_JSON_START_VERSION,
@@ -1078,7 +1079,7 @@ snprint_json_elem_footer (char * buff, int len, int indent, int last)
 
 	for (i = 0; i < indent; i++) {
 		fwd += snprintf(buff + fwd, len - fwd, PRINT_JSON_INDENT);
-		if (fwd > len)
+		if (fwd >= len)
 			return fwd;
 	}
 
@@ -1098,50 +1099,50 @@ snprint_multipath_fields_json (char * buff, int len,
 	struct pathgroup *pgp;
 
 	fwd += snprint_multipath(buff, len, PRINT_JSON_MAP, mpp, 0);
-	if (fwd > len)
+	if (fwd >= len)
 		return fwd;
 
 	fwd += snprint_json(buff + fwd, len - fwd, 2, PRINT_JSON_START_GROUPS);
-	if (fwd > len)
+	if (fwd >= len)
 		return fwd;
 
 	vector_foreach_slot (mpp->pg, pgp, i) {
 
 		pgp->selector = mpp->selector;
 		fwd += snprint_pathgroup(buff + fwd, len - fwd, PRINT_JSON_GROUP, pgp);
-		if (fwd > len)
+		if (fwd >= len)
 			return fwd;
 
 		fwd += snprintf(buff + fwd, len - fwd, PRINT_JSON_GROUP_NUM, i + 1);
-		if (fwd > len)
+		if (fwd >= len)
 			return fwd;
 
 		fwd += snprint_json(buff + fwd, len - fwd, 3, PRINT_JSON_START_PATHS);
-		if (fwd > len)
+		if (fwd >= len)
 			return fwd;
 
 		vector_foreach_slot (pgp->paths, pp, j) {
 			fwd += snprint_path(buff + fwd, len - fwd, PRINT_JSON_PATH, pp, 0);
-			if (fwd > len)
+			if (fwd >= len)
 				return fwd;
 
 			fwd += snprint_json_elem_footer(buff + fwd,
 					len - fwd, 3, j + 1 == VECTOR_SIZE(pgp->paths));
-			if (fwd > len)
+			if (fwd >= len)
 				return fwd;
 		}
 		fwd += snprint_json(buff + fwd, len - fwd, 0, PRINT_JSON_END_ARRAY);
-		if (fwd > len)
+		if (fwd >= len)
 			return fwd;
 
 		fwd +=  snprint_json_elem_footer(buff + fwd,
 				len - fwd, 2, i + 1 == VECTOR_SIZE(mpp->pg));
-		if (fwd > len)
+		if (fwd >= len)
 			return fwd;
 	}
 
 	fwd += snprint_json(buff + fwd, len - fwd, 0, PRINT_JSON_END_ARRAY);
-	if (fwd > len)
+	if (fwd >= len)
 		return fwd;
 
 	fwd += snprint_json_elem_footer(buff + fwd, len - fwd, 1, last);
@@ -1154,23 +1155,23 @@ snprint_multipath_map_json (char * buff, int len,
 	int fwd = 0;
 
 	fwd +=  snprint_json_header(buff, len);
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 
 	fwd +=  snprint_json(buff + fwd, len - fwd, 0, PRINT_JSON_START_MAP);
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 
 	fwd += snprint_multipath_fields_json(buff + fwd, len - fwd, mpp, 1);
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 
 	fwd +=  snprint_json(buff + fwd, len - fwd, 0, "\n");
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 
 	fwd +=  snprint_json(buff + fwd, len - fwd, 0, PRINT_JSON_END_LAST);
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 	return fwd;
 }
@@ -1182,26 +1183,26 @@ snprint_multipath_topology_json (char * buff, int len, struct vectors * vecs)
 	struct multipath * mpp;
 
 	fwd +=  snprint_json_header(buff, len);
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 
 	fwd +=  snprint_json(buff + fwd, len  - fwd, 1, PRINT_JSON_START_MAPS);
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 
 	vector_foreach_slot(vecs->mpvec, mpp, i) {
 		fwd += snprint_multipath_fields_json(buff + fwd, len - fwd,
 				mpp, i + 1 == VECTOR_SIZE(vecs->mpvec));
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 	}
 
 	fwd +=  snprint_json(buff + fwd, len - fwd, 0, PRINT_JSON_END_ARRAY);
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 
 	fwd +=  snprint_json(buff + fwd, len - fwd, 0, PRINT_JSON_END_LAST);
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 	return fwd;
 }
@@ -1225,16 +1226,16 @@ snprint_hwentry (struct config *conf, char * buff, int len, struct hwentry * hwe
 		return 0;
 
 	fwd += snprintf(buff + fwd, len - fwd, "\tdevice {\n");
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 	iterate_sub_keywords(rootkw, kw, i) {
 		fwd += snprint_keyword(buff + fwd, len - fwd, "\t\t%k %v\n",
 				kw, hwe);
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 	}
 	fwd += snprintf(buff + fwd, len - fwd, "\t}\n");
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 	return fwd;
 }
@@ -1252,15 +1253,15 @@ snprint_hwtable (struct config *conf, char * buff, int len, vector hwtable)
 		return 0;
 
 	fwd += snprintf(buff + fwd, len - fwd, "devices {\n");
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 	vector_foreach_slot (hwtable, hwe, i) {
 		fwd += snprint_hwentry(conf, buff + fwd, len - fwd, hwe);
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 	}
 	fwd += snprintf(buff + fwd, len - fwd, "}\n");
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 	return fwd;
 }
@@ -1278,16 +1279,16 @@ snprint_mpentry (struct config *conf, char * buff, int len, struct mpentry * mpe
 		return 0;
 
 	fwd += snprintf(buff + fwd, len - fwd, "\tmultipath {\n");
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 	iterate_sub_keywords(rootkw, kw, i) {
 		fwd += snprint_keyword(buff + fwd, len - fwd, "\t\t%k %v\n",
 				kw, mpe);
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 	}
 	fwd += snprintf(buff + fwd, len - fwd, "\t}\n");
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 	return fwd;
 }
@@ -1305,15 +1306,15 @@ snprint_mptable (struct config *conf, char * buff, int len, vector mptable)
 		return 0;
 
 	fwd += snprintf(buff + fwd, len - fwd, "multipaths {\n");
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 	vector_foreach_slot (mptable, mpe, i) {
 		fwd += snprint_mpentry(conf, buff + fwd, len - fwd, mpe);
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 	}
 	fwd += snprintf(buff + fwd, len - fwd, "}\n");
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 	return fwd;
 }
@@ -1331,19 +1332,19 @@ snprint_overrides (struct config *conf, char * buff, int len, struct hwentry *ov
 		return 0;
 
 	fwd += snprintf(buff + fwd, len - fwd, "overrides {\n");
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 	if (!overrides)
 		goto out;
 	iterate_sub_keywords(rootkw, kw, i) {
 		fwd += snprint_keyword(buff + fwd, len - fwd, "\t%k %v\n",
 				       kw, NULL);
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 	}
 out:
 	fwd += snprintf(buff + fwd, len - fwd, "}\n");
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 	return fwd;
 }
@@ -1361,17 +1362,17 @@ snprint_defaults (struct config *conf, char * buff, int len)
 		return 0;
 
 	fwd += snprintf(buff + fwd, len - fwd, "defaults {\n");
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 
 	iterate_sub_keywords(rootkw, kw, i) {
 		fwd += snprint_keyword(buff + fwd, len - fwd, "\t%k %v\n",
 				kw, NULL);
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 	}
 	fwd += snprintf(buff + fwd, len - fwd, "}\n");
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 	return fwd;
 }
@@ -1508,7 +1509,7 @@ snprint_blacklist (struct config *conf, char * buff, int len)
 		return 0;
 
 	fwd += snprintf(buff + fwd, len - fwd, "blacklist {\n");
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 
 	vector_foreach_slot (conf->blist_devnode, ble, i) {
@@ -1517,7 +1518,7 @@ snprint_blacklist (struct config *conf, char * buff, int len)
 			return 0;
 		fwd += snprint_keyword(buff + fwd, len - fwd, "\t%k %v\n",
 				       kw, ble);
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 	}
 	vector_foreach_slot (conf->blist_wwid, ble, i) {
@@ -1526,7 +1527,7 @@ snprint_blacklist (struct config *conf, char * buff, int len)
 			return 0;
 		fwd += snprint_keyword(buff + fwd, len - fwd, "\t%k %v\n",
 				       kw, ble);
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 	}
 	vector_foreach_slot (conf->blist_property, ble, i) {
@@ -1535,7 +1536,7 @@ snprint_blacklist (struct config *conf, char * buff, int len)
 			return 0;
 		fwd += snprint_keyword(buff + fwd, len - fwd, "\t%k %v\n",
 				       kw, ble);
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 	}
 	rootkw = find_keyword(conf->keywords, rootkw->sub, "device");
@@ -1544,28 +1545,28 @@ snprint_blacklist (struct config *conf, char * buff, int len)
 
 	vector_foreach_slot (conf->blist_device, bled, i) {
 		fwd += snprintf(buff + fwd, len - fwd, "\tdevice {\n");
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 		kw = find_keyword(conf->keywords, rootkw->sub, "vendor");
 		if (!kw)
 			return 0;
 		fwd += snprint_keyword(buff + fwd, len - fwd, "\t\t%k %v\n",
 				       kw, bled);
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 		kw = find_keyword(conf->keywords, rootkw->sub, "product");
 		if (!kw)
 			return 0;
 		fwd += snprint_keyword(buff + fwd, len - fwd, "\t\t%k %v\n",
 				       kw, bled);
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 		fwd += snprintf(buff + fwd, len - fwd, "\t}\n");
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 	}
 	fwd += snprintf(buff + fwd, len - fwd, "}\n");
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 	return fwd;
 }
@@ -1585,7 +1586,7 @@ snprint_blacklist_except (struct config *conf, char * buff, int len)
 		return 0;
 
 	fwd += snprintf(buff + fwd, len - fwd, "blacklist_exceptions {\n");
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 
 	vector_foreach_slot (conf->elist_devnode, ele, i) {
@@ -1594,7 +1595,7 @@ snprint_blacklist_except (struct config *conf, char * buff, int len)
 			return 0;
 		fwd += snprint_keyword(buff + fwd, len - fwd, "\t%k %v\n",
 				       kw, ele);
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 	}
 	vector_foreach_slot (conf->elist_wwid, ele, i) {
@@ -1603,7 +1604,7 @@ snprint_blacklist_except (struct config *conf, char * buff, int len)
 			return 0;
 		fwd += snprint_keyword(buff + fwd, len - fwd, "\t%k %v\n",
 				       kw, ele);
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 	}
 	vector_foreach_slot (conf->elist_property, ele, i) {
@@ -1612,7 +1613,7 @@ snprint_blacklist_except (struct config *conf, char * buff, int len)
 			return 0;
 		fwd += snprint_keyword(buff + fwd, len - fwd, "\t%k %v\n",
 				       kw, ele);
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 	}
 	rootkw = find_keyword(conf->keywords, rootkw->sub, "device");
@@ -1621,28 +1622,28 @@ snprint_blacklist_except (struct config *conf, char * buff, int len)
 
 	vector_foreach_slot (conf->elist_device, eled, i) {
 		fwd += snprintf(buff + fwd, len - fwd, "\tdevice {\n");
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 		kw = find_keyword(conf->keywords, rootkw->sub, "vendor");
 		if (!kw)
 			return 0;
 		fwd += snprint_keyword(buff + fwd, len - fwd, "\t\t%k %v\n",
 				       kw, eled);
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 		kw = find_keyword(conf->keywords, rootkw->sub, "product");
 		if (!kw)
 			return 0;
 		fwd += snprint_keyword(buff + fwd, len - fwd, "\t\t%k %v\n",
 				       kw, eled);
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 		fwd += snprintf(buff + fwd, len - fwd, "\t}\n");
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 	}
 	fwd += snprintf(buff + fwd, len - fwd, "}\n");
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 	return fwd;
 }
@@ -1674,7 +1675,7 @@ snprint_status (char * buff, int len, struct vectors *vecs)
 	fwd += snprintf(buff + fwd, len - fwd, "\npaths: %d\nbusy: %s\n",
 			monitored_count, is_uevent_busy()? "True" : "False");
 
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 	return fwd;
 }
@@ -1740,7 +1741,7 @@ snprint_devices (struct config *conf, char * buff, int len, struct vectors *vecs
 	}
 	closedir(blkdir);
 
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 	return fwd;
 }
-- 
2.8.1.windows.1


--
dm-devel mailing list
dm-devel@redhat.com
https://www.redhat.com/mailman/listinfo/dm-devel

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] multipathd: "show map mpathx json" would cause realloc error possibly
       [not found] ` <OF40C7686E.999CA110-ON4825805E.001EC62D-4825805E.002071CC@zte.com.cn>
@ 2016-11-01 17:13   ` Benjamin Marzinski
  0 siblings, 0 replies; 3+ messages in thread
From: Benjamin Marzinski @ 2016-11-01 17:13 UTC (permalink / raw)
  To: tang.junhui; +Cc: dm-devel, tang.wenjun3, zhang.kai16

On Tue, Nov 01, 2016 at 01:54:38PM +0800, tang.junhui@zte.com.cn wrote:
>    A return value from calling snprintf() of size or more means
>    that the output was truncated, so I think this patch solved a
>    big problem, it avoids memory collapse.

ACK

It would probably also be smart to change all the
                if (!TAIL)
                        break;

lines to

		if (TAIL <= 0)
			break;

just as an extra precaution.

-Ben

> 
>    > ������:         tang.wenjun3@zte.com.cn
>    > �ռ���:         Christophe Varoqui <christophe.varoqui@opensvc.com>,
>    > ����:        zhang.kai16@zte.com.cn, dm-devel@redhat.com, 10144149
>    <tang.wenjun3@zte.com.cn>
>    > ����:         2016-10-14 11:23
>    > ����:        [dm-devel] [PATCH] multipathd: "show map mpathx json" would
>    cause        realloc error possibly
>    > ������:        dm-devel-bounces@redhat.com
>    >
>    >
>    >
>    > From: 10144149 <tang.wenjun3@zte.com.cn>
>    >
>    > Problem: multipathd dead when we run "show map spathx json" command with
>    > system messages as follows:
>    > Oct 13 11:37:30 rhel7-1 multipathd: *** Error in `/sbin/multipathd':
>    realloc(): invalid next size: 0x00007f8cf8004210 ***
>    > Oct 13 11:37:30 rhel7-1 multipathd: ======= Backtrace: =========
>    > Oct 13 11:37:30 rhel7-1 multipathd:
>    /lib64/libc.so.6(+0x7bc67)[0x7f8d06171c67]
>    > Oct 13 11:37:30 rhel7-1 multipathd:
>    /lib64/libc.so.6(+0x7fb17)[0x7f8d06175b17]
>    > Oct 13 11:37:30 rhel7-1 multipathd:
>    /lib64/libc.so.6(realloc+0xd2)[0x7f8d06176702]
>    >
>    > Reasons: in function snprint_multipath_fields_json
>    > vector_foreach_slot (pgp->paths, pp, j) {
>    >        fwd += snprint_path(buff + fwd, len - fwd, PRINT_JSON_PATH, pp,
>    0);
>    >        if (fwd > len)
>    >             return fwd;
>    >
>    >        fwd += snprint_json_elem_footer(buff + fwd,
>    >                 len - fwd, 3, j + 1 == VECTOR_SIZE(pgp->paths));
>    >        if (fwd > len)
>    >            return fwd;
>    > }
>    >
>    > snprint_path (char * line, int len, char * format, struct path * pp, int
>    pad)
>    >
>    > when len - fwd = 0 , The len is not restricted in snprint_path��and the
>    Memory of line is
>    > rewritten in snprint_path, it cause realloc() failed , so fwd > len
>    modify
>    > fwd >= len.
>    >
>    > Other commands also have this type of risk.
>    >
>    > Signed-off-by: 10144149 <tang.wenjun3@zte.com.cn>
>    > ---
>    >  libmultipath/print.c | 131
>    ++++++++++++++++++++++++++-------------------------
>    >  1 file changed, 66 insertions(+), 65 deletions(-)
>    >
>    > diff --git a/libmultipath/print.c b/libmultipath/print.c
>    > index 9aa41ad..78c065f 100644
>    > --- a/libmultipath/print.c
>    > +++ b/libmultipath/print.c
>    > @@ -1004,11 +1004,11 @@ snprint_multipath_topology (char * buff, int
>    len, struct multipath * mpp,
>    >                                    c += sprintf(c, "%c[%dm", 0x1B, 0);
>    /* bold off */
>    >  
>    >                   fwd += snprint_multipath(buff + fwd, len - fwd, style,
>    mpp, 1);
>    > -                 if (fwd > len)
>    > +                 if (fwd >= len)
>    >                                    return len;
>    >                   fwd += snprint_multipath(buff + fwd, len - fwd,
>    PRINT_MAP_PROPS, mpp,
>    >                                                                      
>    1);
>    > -                 if (fwd > len)
>    > +                 if (fwd >= len)
>    >                                    return len;
>    >  
>    >                   if (!mpp->pg)
>    > @@ -1022,7 +1022,7 @@ snprint_multipath_topology (char * buff, int len,
>    struct multipath * mpp,
>    >                                    } else
>    >                                                     strcpy(f, "`-+- "
>    PRINT_PG_INDENT);
>    >                                    fwd += snprint_pathgroup(buff + fwd,
>    len - fwd, fmt, pgp);
>    > -                                  if (fwd > len)
>    > +                                  if (fwd >= len)
>    >                                                     return len;
>    >  
>    >                                    vector_foreach_slot (pgp->paths, pp,
>    i) {
>    > @@ -1035,13 +1035,14 @@ snprint_multipath_topology (char * buff, int
>    len, struct multipath * mpp,
>    >                                                     else
>    >                                                                    
>     strcpy(f, " `- " PRINT_PATH_INDENT);
>    >                                                     fwd +=
>    snprint_path(buff + fwd, len - fwd, fmt, pp, 1);
>    > -                                                   if (fwd > len)
>    > +                                                   if (fwd >= len)
>    >                                                                    
>     return len;
>    >                                    }
>    >                   }
>    >                   return fwd;
>    >  }
>    >  
>    > +
>    >  static int
>    >  snprint_json (char * buff, int len, int indent, char *json_str)
>    >  {
>    > @@ -1049,7 +1050,7 @@ snprint_json (char * buff, int len, int indent,
>    char *json_str)
>    >  
>    >                   for (i = 0; i < indent; i++) {
>    >                                    fwd += snprintf(buff + fwd, len -
>    fwd, PRINT_JSON_INDENT);
>    > -                                  if (fwd > len)
>    > +                                  if (fwd >= len)
>    >                                                     return fwd;
>    >                   }
>    >  
>    > @@ -1063,7 +1064,7 @@ snprint_json_header (char * buff, int len)
>    >                   int fwd = 0;
>    >  
>    >                   fwd +=  snprint_json(buff, len, 0,
>    PRINT_JSON_START_ELEM);
>    > -                 if (fwd > len)
>    > +                 if (fwd >= len)
>    >                                    return fwd;
>    >  
>    >                   fwd +=  snprintf(buff + fwd, len  - fwd,
>    PRINT_JSON_START_VERSION,
>    > @@ -1078,7 +1079,7 @@ snprint_json_elem_footer (char * buff, int len,
>    int indent, int last)
>    >  
>    >                   for (i = 0; i < indent; i++) {
>    >                                    fwd += snprintf(buff + fwd, len -
>    fwd, PRINT_JSON_INDENT);
>    > -                                  if (fwd > len)
>    > +                                  if (fwd >= len)
>    >                                                     return fwd;
>    >                   }
>    >  
>    > @@ -1098,50 +1099,50 @@ snprint_multipath_fields_json (char * buff, int
>    len,
>    >                   struct pathgroup *pgp;
>    >  
>    >                   fwd += snprint_multipath(buff, len, PRINT_JSON_MAP,
>    mpp, 0);
>    > -                 if (fwd > len)
>    > +                 if (fwd >= len)
>    >                                    return fwd;
>    >  
>    >                   fwd += snprint_json(buff + fwd, len - fwd, 2,
>    PRINT_JSON_START_GROUPS);
>    > -                 if (fwd > len)
>    > +                 if (fwd >= len)
>    >                                    return fwd;
>    >  
>    >                   vector_foreach_slot (mpp->pg, pgp, i) {
>    >  
>    >                                    pgp->selector = mpp->selector;
>    >                                    fwd += snprint_pathgroup(buff + fwd,
>    len - fwd, PRINT_JSON_GROUP, pgp);
>    > -                                  if (fwd > len)
>    > +                                  if (fwd >= len)
>    >                                                     return fwd;
>    >  
>    >                                    fwd += snprintf(buff + fwd, len -
>    fwd, PRINT_JSON_GROUP_NUM, i + 1);
>    > -                                  if (fwd > len)
>    > +                                  if (fwd >= len)
>    >                                                     return fwd;
>    >  
>    >                                    fwd += snprint_json(buff + fwd, len -
>    fwd, 3, PRINT_JSON_START_PATHS);
>    > -                                  if (fwd > len)
>    > +                                  if (fwd >= len)
>    >                                                     return fwd;
>    >  
>    >                                    vector_foreach_slot (pgp->paths, pp,
>    j) {
>    >                                                     fwd +=
>    snprint_path(buff + fwd, len - fwd, PRINT_JSON_PATH, pp, 0);
>    > -                                                   if (fwd > len)
>    > +                                                   if (fwd >= len)
>    >                                                                    
>     return fwd;
>    >  
>    >                                                     fwd +=
>    snprint_json_elem_footer(buff + fwd,
>    >                                                                        
>                  len - fwd, 3, j + 1 == VECTOR_SIZE(pgp->paths));
>    > -                                                   if (fwd > len)
>    > +                                                   if (fwd >= len)
>    >                                                                    
>     return fwd;
>    >                                    }
>    >                                    fwd += snprint_json(buff + fwd, len -
>    fwd, 0, PRINT_JSON_END_ARRAY);
>    > -                                  if (fwd > len)
>    > +                                  if (fwd >= len)
>    >                                                     return fwd;
>    >  
>    >                                    fwd +=  snprint_json_elem_footer(buff
>    + fwd,
>    >                                                                      len
>    - fwd, 2, i + 1 == VECTOR_SIZE(mpp->pg));
>    > -                                  if (fwd > len)
>    > +                                  if (fwd >= len)
>    >                                                     return fwd;
>    >                   }
>    >  
>    >                   fwd += snprint_json(buff + fwd, len - fwd, 0,
>    PRINT_JSON_END_ARRAY);
>    > -                 if (fwd > len)
>    > +                 if (fwd >= len)
>    >                                    return fwd;
>    >  
>    >                   fwd += snprint_json_elem_footer(buff + fwd, len - fwd,
>    1, last);
>    > @@ -1154,23 +1155,23 @@ snprint_multipath_map_json (char * buff, int
>    len,
>    >                   int fwd = 0;
>    >  
>    >                   fwd +=  snprint_json_header(buff, len);
>    > -                 if (fwd > len)
>    > +                 if (fwd >= len)
>    >                                    return len;
>    >  
>    >                   fwd +=  snprint_json(buff + fwd, len - fwd, 0,
>    PRINT_JSON_START_MAP);
>    > -                 if (fwd > len)
>    > +                 if (fwd >= len)
>    >                                    return len;
>    >  
>    >                   fwd += snprint_multipath_fields_json(buff + fwd, len -
>    fwd, mpp, 1);
>    > -                 if (fwd > len)
>    > +                 if (fwd >= len)
>    >                                    return len;
>    >  
>    >                   fwd +=  snprint_json(buff + fwd, len - fwd, 0, "\n");
>    > -                 if (fwd > len)
>    > +                 if (fwd >= len)
>    >                                    return len;
>    >  
>    >                   fwd +=  snprint_json(buff + fwd, len - fwd, 0,
>    PRINT_JSON_END_LAST);
>    > -                 if (fwd > len)
>    > +                 if (fwd >= len)
>    >                                    return len;
>    >                   return fwd;
>    >  }
>    > @@ -1182,26 +1183,26 @@ snprint_multipath_topology_json (char * buff,
>    int len, struct vectors * vecs)
>    >                   struct multipath * mpp;
>    >  
>    >                   fwd +=  snprint_json_header(buff, len);
>    > -                 if (fwd > len)
>    > +                 if (fwd >= len)
>    >                                    return len;
>    >  
>    >                   fwd +=  snprint_json(buff + fwd, len  - fwd, 1,
>    PRINT_JSON_START_MAPS);
>    > -                 if (fwd > len)
>    > +                 if (fwd >= len)
>    >                                    return len;
>    >  
>    >                   vector_foreach_slot(vecs->mpvec, mpp, i) {
>    >                                    fwd +=
>    snprint_multipath_fields_json(buff + fwd, len - fwd,
>    >                                                                    
>     mpp, i + 1 == VECTOR_SIZE(vecs->mpvec));
>    > -                                  if (fwd > len)
>    > +                                  if (fwd >= len)
>    >                                                     return len;
>    >                   }
>    >  
>    >                   fwd +=  snprint_json(buff + fwd, len - fwd, 0,
>    PRINT_JSON_END_ARRAY);
>    > -                 if (fwd > len)
>    > +                 if (fwd >= len)
>    >                                    return len;
>    >  
>    >                   fwd +=  snprint_json(buff + fwd, len - fwd, 0,
>    PRINT_JSON_END_LAST);
>    > -                 if (fwd > len)
>    > +                 if (fwd >= len)
>    >                                    return len;
>    >                   return fwd;
>    >  }
>    > @@ -1225,16 +1226,16 @@ snprint_hwentry (struct config *conf, char *
>    buff, int len, struct hwentry * hwe
>    >                                    return 0;
>    >  
>    >                   fwd += snprintf(buff + fwd, len - fwd, "\tdevice
>    {\n");
>    > -                 if (fwd > len)
>    > +                 if (fwd >= len)
>    >                                    return len;
>    >                   iterate_sub_keywords(rootkw, kw, i) {
>    >                                    fwd += snprint_keyword(buff + fwd,
>    len - fwd, "\t\t%k %v\n",
>    >                                                                      kw,
>    hwe);
>    > -                                  if (fwd > len)
>    > +                                  if (fwd >= len)
>    >                                                     return len;
>    >                   }
>    >                   fwd += snprintf(buff + fwd, len - fwd, "\t}\n");
>    > -                 if (fwd > len)
>    > +                 if (fwd >= len)
>    >                                    return len;
>    >                   return fwd;
>    >  }
>    > @@ -1252,15 +1253,15 @@ snprint_hwtable (struct config *conf, char *
>    buff, int len, vector hwtable)
>    >                                    return 0;
>    >  
>    >                   fwd += snprintf(buff + fwd, len - fwd, "devices {\n");
>    > -                 if (fwd > len)
>    > +                 if (fwd >= len)
>    >                                    return len;
>    >                   vector_foreach_slot (hwtable, hwe, i) {
>    >                                    fwd += snprint_hwentry(conf, buff +
>    fwd, len - fwd, hwe);
>    > -                                  if (fwd > len)
>    > +                                  if (fwd >= len)
>    >                                                     return len;
>    >                   }
>    >                   fwd += snprintf(buff + fwd, len - fwd, "}\n");
>    > -                 if (fwd > len)
>    > +                 if (fwd >= len)
>    >                                    return len;
>    >                   return fwd;
>    >  }
>    > @@ -1278,16 +1279,16 @@ snprint_mpentry (struct config *conf, char *
>    buff, int len, struct mpentry * mpe
>    >                                    return 0;
>    >  
>    >                   fwd += snprintf(buff + fwd, len - fwd, "\tmultipath
>    {\n");
>    > -                 if (fwd > len)
>    > +                 if (fwd >= len)
>    >                                    return len;
>    >                   iterate_sub_keywords(rootkw, kw, i) {
>    >                                    fwd += snprint_keyword(buff + fwd,
>    len - fwd, "\t\t%k %v\n",
>    >                                                                      kw,
>    mpe);
>    > -                                  if (fwd > len)
>    > +                                  if (fwd >= len)
>    >                                                     return len;
>    >                   }
>    >                   fwd += snprintf(buff + fwd, len - fwd, "\t}\n");
>    > -                 if (fwd > len)
>    > +                 if (fwd >= len)
>    >                                    return len;
>    >                   return fwd;
>    >  }
>    > @@ -1305,15 +1306,15 @@ snprint_mptable (struct config *conf, char *
>    buff, int len, vector mptable)
>    >                                    return 0;
>    >  
>    >                   fwd += snprintf(buff + fwd, len - fwd, "multipaths
>    {\n");
>    > -                 if (fwd > len)
>    > +                 if (fwd >= len)
>    >                                    return len;
>    >                   vector_foreach_slot (mptable, mpe, i) {
>    >                                    fwd += snprint_mpentry(conf, buff +
>    fwd, len - fwd, mpe);
>    > -                                  if (fwd > len)
>    > +                                  if (fwd >= len)
>    >                                                     return len;
>    >                   }
>    >                   fwd += snprintf(buff + fwd, len - fwd, "}\n");
>    > -                 if (fwd > len)
>    > +                 if (fwd >= len)
>    >                                    return len;
>    >                   return fwd;
>    >  }
>    > @@ -1331,19 +1332,19 @@ snprint_overrides (struct config *conf, char *
>    buff, int len, struct hwentry *ov
>    >                                    return 0;
>    >  
>    >                   fwd += snprintf(buff + fwd, len - fwd, "overrides
>    {\n");
>    > -                 if (fwd > len)
>    > +                 if (fwd >= len)
>    >                                    return len;
>    >                   if (!overrides)
>    >                                    goto out;
>    >                   iterate_sub_keywords(rootkw, kw, i) {
>    >                                    fwd += snprint_keyword(buff + fwd,
>    len - fwd, "\t%k %v\n",
>    >                                                                        
>        kw, NULL);
>    > -                                  if (fwd > len)
>    > +                                  if (fwd >= len)
>    >                                                     return len;
>    >                   }
>    >  out:
>    >                   fwd += snprintf(buff + fwd, len - fwd, "}\n");
>    > -                 if (fwd > len)
>    > +                 if (fwd >= len)
>    >                                    return len;
>    >                   return fwd;
>    >  }
>    > @@ -1361,17 +1362,17 @@ snprint_defaults (struct config *conf, char *
>    buff, int len)
>    >                                    return 0;
>    >  
>    >                   fwd += snprintf(buff + fwd, len - fwd, "defaults
>    {\n");
>    > -                 if (fwd > len)
>    > +                 if (fwd >= len)
>    >                                    return len;
>    >  
>    >                   iterate_sub_keywords(rootkw, kw, i) {
>    >                                    fwd += snprint_keyword(buff + fwd,
>    len - fwd, "\t%k %v\n",
>    >                                                                      kw,
>    NULL);
>    > -                                  if (fwd > len)
>    > +                                  if (fwd >= len)
>    >                                                     return len;
>    >                   }
>    >                   fwd += snprintf(buff + fwd, len - fwd, "}\n");
>    > -                 if (fwd > len)
>    > +                 if (fwd >= len)
>    >                                    return len;
>    >                   return fwd;
>    >  }
>    > @@ -1508,7 +1509,7 @@ snprint_blacklist (struct config *conf, char *
>    buff, int len)
>    >                                    return 0;
>    >  
>    >                   fwd += snprintf(buff + fwd, len - fwd, "blacklist
>    {\n");
>    > -                 if (fwd > len)
>    > +                 if (fwd >= len)
>    >                                    return len;
>    >  
>    >                   vector_foreach_slot (conf->blist_devnode, ble, i) {
>    > @@ -1517,7 +1518,7 @@ snprint_blacklist (struct config *conf, char *
>    buff, int len)
>    >                                                     return 0;
>    >                                    fwd += snprint_keyword(buff + fwd,
>    len - fwd, "\t%k %v\n",
>    >                                                                        
>        kw, ble);
>    > -                                  if (fwd > len)
>    > +                                  if (fwd >= len)
>    >                                                     return len;
>    >                   }
>    >                   vector_foreach_slot (conf->blist_wwid, ble, i) {
>    > @@ -1526,7 +1527,7 @@ snprint_blacklist (struct config *conf, char *
>    buff, int len)
>    >                                                     return 0;
>    >                                    fwd += snprint_keyword(buff + fwd,
>    len - fwd, "\t%k %v\n",
>    >                                                                        
>        kw, ble);
>    > -                                  if (fwd > len)
>    > +                                  if (fwd >= len)
>    >                                                     return len;
>    >                   }
>    >                   vector_foreach_slot (conf->blist_property, ble, i) {
>    > @@ -1535,7 +1536,7 @@ snprint_blacklist (struct config *conf, char *
>    buff, int len)
>    >                                                     return 0;
>    >                                    fwd += snprint_keyword(buff + fwd,
>    len - fwd, "\t%k %v\n",
>    >                                                                        
>        kw, ble);
>    > -                                  if (fwd > len)
>    > +                                  if (fwd >= len)
>    >                                                     return len;
>    >                   }
>    >                   rootkw = find_keyword(conf->keywords, rootkw->sub,
>    "device");
>    > @@ -1544,28 +1545,28 @@ snprint_blacklist (struct config *conf, char *
>    buff, int len)
>    >  
>    >                   vector_foreach_slot (conf->blist_device, bled, i) {
>    >                                    fwd += snprintf(buff + fwd, len -
>    fwd, "\tdevice {\n");
>    > -                                  if (fwd > len)
>    > +                                  if (fwd >= len)
>    >                                                     return len;
>    >                                    kw = find_keyword(conf->keywords,
>    rootkw->sub, "vendor");
>    >                                    if (!kw)
>    >                                                     return 0;
>    >                                    fwd += snprint_keyword(buff + fwd,
>    len - fwd, "\t\t%k %v\n",
>    >                                                                        
>        kw, bled);
>    > -                                  if (fwd > len)
>    > +                                  if (fwd >= len)
>    >                                                     return len;
>    >                                    kw = find_keyword(conf->keywords,
>    rootkw->sub, "product");
>    >                                    if (!kw)
>    >                                                     return 0;
>    >                                    fwd += snprint_keyword(buff + fwd,
>    len - fwd, "\t\t%k %v\n",
>    >                                                                        
>        kw, bled);
>    > -                                  if (fwd > len)
>    > +                                  if (fwd >= len)
>    >                                                     return len;
>    >                                    fwd += snprintf(buff + fwd, len -
>    fwd, "\t}\n");
>    > -                                  if (fwd > len)
>    > +                                  if (fwd >= len)
>    >                                                     return len;
>    >                   }
>    >                   fwd += snprintf(buff + fwd, len - fwd, "}\n");
>    > -                 if (fwd > len)
>    > +                 if (fwd >= len)
>    >                                    return len;
>    >                   return fwd;
>    >  }
>    > @@ -1585,7 +1586,7 @@ snprint_blacklist_except (struct config *conf,
>    char * buff, int len)
>    >                                    return 0;
>    >  
>    >                   fwd += snprintf(buff + fwd, len - fwd,
>    "blacklist_exceptions {\n");
>    > -                 if (fwd > len)
>    > +                 if (fwd >= len)
>    >                                    return len;
>    >  
>    >                   vector_foreach_slot (conf->elist_devnode, ele, i) {
>    > @@ -1594,7 +1595,7 @@ snprint_blacklist_except (struct config *conf,
>    char * buff, int len)
>    >                                                     return 0;
>    >                                    fwd += snprint_keyword(buff + fwd,
>    len - fwd, "\t%k %v\n",
>    >                                                                        
>        kw, ele);
>    > -                                  if (fwd > len)
>    > +                                  if (fwd >= len)
>    >                                                     return len;
>    >                   }
>    >                   vector_foreach_slot (conf->elist_wwid, ele, i) {
>    > @@ -1603,7 +1604,7 @@ snprint_blacklist_except (struct config *conf,
>    char * buff, int len)
>    >                                                     return 0;
>    >                                    fwd += snprint_keyword(buff + fwd,
>    len - fwd, "\t%k %v\n",
>    >                                                                        
>        kw, ele);
>    > -                                  if (fwd > len)
>    > +                                  if (fwd >= len)
>    >                                                     return len;
>    >                   }
>    >                   vector_foreach_slot (conf->elist_property, ele, i) {
>    > @@ -1612,7 +1613,7 @@ snprint_blacklist_except (struct config *conf,
>    char * buff, int len)
>    >                                                     return 0;
>    >                                    fwd += snprint_keyword(buff + fwd,
>    len - fwd, "\t%k %v\n",
>    >                                                                        
>        kw, ele);
>    > -                                  if (fwd > len)
>    > +                                  if (fwd >= len)
>    >                                                     return len;
>    >                   }
>    >                   rootkw = find_keyword(conf->keywords, rootkw->sub,
>    "device");
>    > @@ -1621,28 +1622,28 @@ snprint_blacklist_except (struct config *conf,
>    char * buff, int len)
>    >  
>    >                   vector_foreach_slot (conf->elist_device, eled, i) {
>    >                                    fwd += snprintf(buff + fwd, len -
>    fwd, "\tdevice {\n");
>    > -                                  if (fwd > len)
>    > +                                  if (fwd >= len)
>    >                                                     return len;
>    >                                    kw = find_keyword(conf->keywords,
>    rootkw->sub, "vendor");
>    >                                    if (!kw)
>    >                                                     return 0;
>    >                                    fwd += snprint_keyword(buff + fwd,
>    len - fwd, "\t\t%k %v\n",
>    >                                                                        
>        kw, eled);
>    > -                                  if (fwd > len)
>    > +                                  if (fwd >= len)
>    >                                                     return len;
>    >                                    kw = find_keyword(conf->keywords,
>    rootkw->sub, "product");
>    >                                    if (!kw)
>    >                                                     return 0;
>    >                                    fwd += snprint_keyword(buff + fwd,
>    len - fwd, "\t\t%k %v\n",
>    >                                                                        
>        kw, eled);
>    > -                                  if (fwd > len)
>    > +                                  if (fwd >= len)
>    >                                                     return len;
>    >                                    fwd += snprintf(buff + fwd, len -
>    fwd, "\t}\n");
>    > -                                  if (fwd > len)
>    > +                                  if (fwd >= len)
>    >                                                     return len;
>    >                   }
>    >                   fwd += snprintf(buff + fwd, len - fwd, "}\n");
>    > -                 if (fwd > len)
>    > +                 if (fwd >= len)
>    >                                    return len;
>    >                   return fwd;
>    >  }
>    > @@ -1674,7 +1675,7 @@ snprint_status (char * buff, int len, struct
>    vectors *vecs)
>    >                   fwd += snprintf(buff + fwd, len - fwd, "\npaths:
>    %d\nbusy: %s\n",
>    >                                                     monitored_count,
>    is_uevent_busy()? "True" : "False");
>    >  
>    > -                 if (fwd > len)
>    > +                 if (fwd >= len)
>    >                                    return len;
>    >                   return fwd;
>    >  }
>    > @@ -1740,7 +1741,7 @@ snprint_devices (struct config *conf, char * buff,
>    int len, struct vectors *vecs
>    >                   }
>    >                   closedir(blkdir);
>    >  
>    > -                 if (fwd > len)
>    > +                 if (fwd >= len)
>    >                                    return len;
>    >                   return fwd;
>    >  }
>    > --
>    > 2.8.1.windows.1
>    >
>    >
>    > --
>    > dm-devel mailing list
>    > dm-devel@redhat.com
>    > [1]https://www.redhat.com/mailman/listinfo/dm-devel
> 
> References
> 
>    Visible links
>    1. https://www.redhat.com/mailman/listinfo/dm-devel

--
dm-devel mailing list
dm-devel@redhat.com
https://www.redhat.com/mailman/listinfo/dm-devel

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH] multipathd: "show map mpathx json" would cause realloc error possibly
@ 2016-11-02  1:41 tang.wenjun3
  0 siblings, 0 replies; 3+ messages in thread
From: tang.wenjun3 @ 2016-11-02  1:41 UTC (permalink / raw)
  To: Christophe Varoqui; +Cc: 10144149, tang.junhui, zhang.kai16, dm-devel

From: 10144149 <tang.wenjun3@zte.com.cn>

Problem: multipathd dead when we run "show map mpathx json" command with
system messages as follows:
Oct 13 11:37:30 rhel7-1 multipathd: *** Error in `/sbin/multipathd': realloc(): invalid next size: 0x00007f8cf8004210 ***
Oct 13 11:37:30 rhel7-1 multipathd: ======= Backtrace: =========
Oct 13 11:37:30 rhel7-1 multipathd: /lib64/libc.so.6(+0x7bc67)[0x7f8d06171c67]
Oct 13 11:37:30 rhel7-1 multipathd: /lib64/libc.so.6(+0x7fb17)[0x7f8d06175b17]
Oct 13 11:37:30 rhel7-1 multipathd: /lib64/libc.so.6(realloc+0xd2)[0x7f8d06176702]

Reasons: in function snprint_multipath_fields_json
vector_foreach_slot (pgp->paths, pp, j) {
       fwd += snprint_path(buff + fwd, len - fwd, PRINT_JSON_PATH, pp, 0);
       if (fwd > len)
            return fwd;

       fwd += snprint_json_elem_footer(buff + fwd,
                len - fwd, 3, j + 1 == VECTOR_SIZE(pgp->paths));
       if (fwd > len)
           return fwd;
}

snprint_path (char * line, int len, char * format, struct path * pp, int pad)

when len - fwd = 0 , The len is not restricted in snprint_path,and the Memory of line is
rewritten in snprint_path, it cause realloc() failed , so fwd > len modify
fwd >= len.

consider of ben’s advice, It would probably also be smart to change all the
          if (!TAIL)
lines to
	  if (TAIL <= 0)
just as an extra precaution.

Other commands also have this type of risk.

Signed-off-by: 10144149 <tang.wenjun3@zte.com.cn>
---
 libmultipath/print.c | 141 ++++++++++++++++++++++++++-------------------------
 1 file changed, 71 insertions(+), 70 deletions(-)

diff --git a/libmultipath/print.c b/libmultipath/print.c
index 9aa41ad..2eadb81 100644
--- a/libmultipath/print.c
+++ b/libmultipath/print.c
@@ -778,7 +778,7 @@ snprint_multipath_header (char * line, int len, char * format)
 	struct multipath_data * data;
 
 	do {
-		if (!TAIL)
+		if (TAIL <= 0)
 			break;
 
 		if (*f != '%') {
@@ -811,7 +811,7 @@ snprint_multipath (char * line, int len, char * format,
 	char buff[MAX_FIELD_LEN] = {};
 
 	do {
-		if (!TAIL)
+		if (TAIL <= 0)
 			break;
 
 		if (*f != '%') {
@@ -845,7 +845,7 @@ snprint_path_header (char * line, int len, char * format)
 	struct path_data * data;
 
 	do {
-		if (!TAIL)
+		if (TAIL <= 0)
 			break;
 
 		if (*f != '%') {
@@ -878,7 +878,7 @@ snprint_path (char * line, int len, char * format,
 	char buff[MAX_FIELD_LEN];
 
 	do {
-		if (!TAIL)
+		if (TAIL <= 0)
 			break;
 
 		if (*f != '%') {
@@ -913,7 +913,7 @@ snprint_pathgroup (char * line, int len, char * format,
 	char buff[MAX_FIELD_LEN];
 
 	do {
-		if (!TAIL)
+		if (TAIL <= 0)
 			break;
 
 		if (*f != '%') {
@@ -1004,11 +1004,11 @@ snprint_multipath_topology (char * buff, int len, struct multipath * mpp,
 		c += sprintf(c, "%c[%dm", 0x1B, 0); /* bold off */
 
 	fwd += snprint_multipath(buff + fwd, len - fwd, style, mpp, 1);
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 	fwd += snprint_multipath(buff + fwd, len - fwd, PRINT_MAP_PROPS, mpp,
 				 1);
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 
 	if (!mpp->pg)
@@ -1022,7 +1022,7 @@ snprint_multipath_topology (char * buff, int len, struct multipath * mpp,
 		} else
 			strcpy(f, "`-+- " PRINT_PG_INDENT);
 		fwd += snprint_pathgroup(buff + fwd, len - fwd, fmt, pgp);
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 
 		vector_foreach_slot (pgp->paths, pp, i) {
@@ -1035,13 +1035,14 @@ snprint_multipath_topology (char * buff, int len, struct multipath * mpp,
 			else
 				strcpy(f, " `- " PRINT_PATH_INDENT);
 			fwd += snprint_path(buff + fwd, len - fwd, fmt, pp, 1);
-			if (fwd > len)
+			if (fwd >= len)
 				return len;
 		}
 	}
 	return fwd;
 }
 
+
 static int
 snprint_json (char * buff, int len, int indent, char *json_str)
 {
@@ -1049,7 +1050,7 @@ snprint_json (char * buff, int len, int indent, char *json_str)
 
 	for (i = 0; i < indent; i++) {
 		fwd += snprintf(buff + fwd, len - fwd, PRINT_JSON_INDENT);
-		if (fwd > len)
+		if (fwd >= len)
 			return fwd;
 	}
 
@@ -1063,7 +1064,7 @@ snprint_json_header (char * buff, int len)
 	int fwd = 0;
 
 	fwd +=  snprint_json(buff, len, 0, PRINT_JSON_START_ELEM);
-	if (fwd > len)
+	if (fwd >= len)
 		return fwd;
 
 	fwd +=  snprintf(buff + fwd, len  - fwd, PRINT_JSON_START_VERSION,
@@ -1078,7 +1079,7 @@ snprint_json_elem_footer (char * buff, int len, int indent, int last)
 
 	for (i = 0; i < indent; i++) {
 		fwd += snprintf(buff + fwd, len - fwd, PRINT_JSON_INDENT);
-		if (fwd > len)
+		if (fwd >= len)
 			return fwd;
 	}
 
@@ -1098,50 +1099,50 @@ snprint_multipath_fields_json (char * buff, int len,
 	struct pathgroup *pgp;
 
 	fwd += snprint_multipath(buff, len, PRINT_JSON_MAP, mpp, 0);
-	if (fwd > len)
+	if (fwd >= len)
 		return fwd;
 
 	fwd += snprint_json(buff + fwd, len - fwd, 2, PRINT_JSON_START_GROUPS);
-	if (fwd > len)
+	if (fwd >= len)
 		return fwd;
 
 	vector_foreach_slot (mpp->pg, pgp, i) {
 
 		pgp->selector = mpp->selector;
 		fwd += snprint_pathgroup(buff + fwd, len - fwd, PRINT_JSON_GROUP, pgp);
-		if (fwd > len)
+		if (fwd >= len)
 			return fwd;
 
 		fwd += snprintf(buff + fwd, len - fwd, PRINT_JSON_GROUP_NUM, i + 1);
-		if (fwd > len)
+		if (fwd >= len)
 			return fwd;
 
 		fwd += snprint_json(buff + fwd, len - fwd, 3, PRINT_JSON_START_PATHS);
-		if (fwd > len)
+		if (fwd >= len)
 			return fwd;
 
 		vector_foreach_slot (pgp->paths, pp, j) {
 			fwd += snprint_path(buff + fwd, len - fwd, PRINT_JSON_PATH, pp, 0);
-			if (fwd > len)
+			if (fwd >= len)
 				return fwd;
 
 			fwd += snprint_json_elem_footer(buff + fwd,
 					len - fwd, 3, j + 1 == VECTOR_SIZE(pgp->paths));
-			if (fwd > len)
+			if (fwd >= len)
 				return fwd;
 		}
 		fwd += snprint_json(buff + fwd, len - fwd, 0, PRINT_JSON_END_ARRAY);
-		if (fwd > len)
+		if (fwd >= len)
 			return fwd;
 
 		fwd +=  snprint_json_elem_footer(buff + fwd,
 				len - fwd, 2, i + 1 == VECTOR_SIZE(mpp->pg));
-		if (fwd > len)
+		if (fwd >= len)
 			return fwd;
 	}
 
 	fwd += snprint_json(buff + fwd, len - fwd, 0, PRINT_JSON_END_ARRAY);
-	if (fwd > len)
+	if (fwd >= len)
 		return fwd;
 
 	fwd += snprint_json_elem_footer(buff + fwd, len - fwd, 1, last);
@@ -1154,23 +1155,23 @@ snprint_multipath_map_json (char * buff, int len,
 	int fwd = 0;
 
 	fwd +=  snprint_json_header(buff, len);
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 
 	fwd +=  snprint_json(buff + fwd, len - fwd, 0, PRINT_JSON_START_MAP);
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 
 	fwd += snprint_multipath_fields_json(buff + fwd, len - fwd, mpp, 1);
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 
 	fwd +=  snprint_json(buff + fwd, len - fwd, 0, "\n");
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 
 	fwd +=  snprint_json(buff + fwd, len - fwd, 0, PRINT_JSON_END_LAST);
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 	return fwd;
 }
@@ -1182,26 +1183,26 @@ snprint_multipath_topology_json (char * buff, int len, struct vectors * vecs)
 	struct multipath * mpp;
 
 	fwd +=  snprint_json_header(buff, len);
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 
 	fwd +=  snprint_json(buff + fwd, len  - fwd, 1, PRINT_JSON_START_MAPS);
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 
 	vector_foreach_slot(vecs->mpvec, mpp, i) {
 		fwd += snprint_multipath_fields_json(buff + fwd, len - fwd,
 				mpp, i + 1 == VECTOR_SIZE(vecs->mpvec));
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 	}
 
 	fwd +=  snprint_json(buff + fwd, len - fwd, 0, PRINT_JSON_END_ARRAY);
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 
 	fwd +=  snprint_json(buff + fwd, len - fwd, 0, PRINT_JSON_END_LAST);
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 	return fwd;
 }
@@ -1225,16 +1226,16 @@ snprint_hwentry (struct config *conf, char * buff, int len, struct hwentry * hwe
 		return 0;
 
 	fwd += snprintf(buff + fwd, len - fwd, "\tdevice {\n");
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 	iterate_sub_keywords(rootkw, kw, i) {
 		fwd += snprint_keyword(buff + fwd, len - fwd, "\t\t%k %v\n",
 				kw, hwe);
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 	}
 	fwd += snprintf(buff + fwd, len - fwd, "\t}\n");
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 	return fwd;
 }
@@ -1252,15 +1253,15 @@ snprint_hwtable (struct config *conf, char * buff, int len, vector hwtable)
 		return 0;
 
 	fwd += snprintf(buff + fwd, len - fwd, "devices {\n");
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 	vector_foreach_slot (hwtable, hwe, i) {
 		fwd += snprint_hwentry(conf, buff + fwd, len - fwd, hwe);
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 	}
 	fwd += snprintf(buff + fwd, len - fwd, "}\n");
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 	return fwd;
 }
@@ -1278,16 +1279,16 @@ snprint_mpentry (struct config *conf, char * buff, int len, struct mpentry * mpe
 		return 0;
 
 	fwd += snprintf(buff + fwd, len - fwd, "\tmultipath {\n");
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 	iterate_sub_keywords(rootkw, kw, i) {
 		fwd += snprint_keyword(buff + fwd, len - fwd, "\t\t%k %v\n",
 				kw, mpe);
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 	}
 	fwd += snprintf(buff + fwd, len - fwd, "\t}\n");
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 	return fwd;
 }
@@ -1305,15 +1306,15 @@ snprint_mptable (struct config *conf, char * buff, int len, vector mptable)
 		return 0;
 
 	fwd += snprintf(buff + fwd, len - fwd, "multipaths {\n");
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 	vector_foreach_slot (mptable, mpe, i) {
 		fwd += snprint_mpentry(conf, buff + fwd, len - fwd, mpe);
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 	}
 	fwd += snprintf(buff + fwd, len - fwd, "}\n");
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 	return fwd;
 }
@@ -1331,19 +1332,19 @@ snprint_overrides (struct config *conf, char * buff, int len, struct hwentry *ov
 		return 0;
 
 	fwd += snprintf(buff + fwd, len - fwd, "overrides {\n");
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 	if (!overrides)
 		goto out;
 	iterate_sub_keywords(rootkw, kw, i) {
 		fwd += snprint_keyword(buff + fwd, len - fwd, "\t%k %v\n",
 				       kw, NULL);
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 	}
 out:
 	fwd += snprintf(buff + fwd, len - fwd, "}\n");
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 	return fwd;
 }
@@ -1361,17 +1362,17 @@ snprint_defaults (struct config *conf, char * buff, int len)
 		return 0;
 
 	fwd += snprintf(buff + fwd, len - fwd, "defaults {\n");
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 
 	iterate_sub_keywords(rootkw, kw, i) {
 		fwd += snprint_keyword(buff + fwd, len - fwd, "\t%k %v\n",
 				kw, NULL);
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 	}
 	fwd += snprintf(buff + fwd, len - fwd, "}\n");
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 	return fwd;
 }
@@ -1508,7 +1509,7 @@ snprint_blacklist (struct config *conf, char * buff, int len)
 		return 0;
 
 	fwd += snprintf(buff + fwd, len - fwd, "blacklist {\n");
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 
 	vector_foreach_slot (conf->blist_devnode, ble, i) {
@@ -1517,7 +1518,7 @@ snprint_blacklist (struct config *conf, char * buff, int len)
 			return 0;
 		fwd += snprint_keyword(buff + fwd, len - fwd, "\t%k %v\n",
 				       kw, ble);
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 	}
 	vector_foreach_slot (conf->blist_wwid, ble, i) {
@@ -1526,7 +1527,7 @@ snprint_blacklist (struct config *conf, char * buff, int len)
 			return 0;
 		fwd += snprint_keyword(buff + fwd, len - fwd, "\t%k %v\n",
 				       kw, ble);
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 	}
 	vector_foreach_slot (conf->blist_property, ble, i) {
@@ -1535,7 +1536,7 @@ snprint_blacklist (struct config *conf, char * buff, int len)
 			return 0;
 		fwd += snprint_keyword(buff + fwd, len - fwd, "\t%k %v\n",
 				       kw, ble);
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 	}
 	rootkw = find_keyword(conf->keywords, rootkw->sub, "device");
@@ -1544,28 +1545,28 @@ snprint_blacklist (struct config *conf, char * buff, int len)
 
 	vector_foreach_slot (conf->blist_device, bled, i) {
 		fwd += snprintf(buff + fwd, len - fwd, "\tdevice {\n");
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 		kw = find_keyword(conf->keywords, rootkw->sub, "vendor");
 		if (!kw)
 			return 0;
 		fwd += snprint_keyword(buff + fwd, len - fwd, "\t\t%k %v\n",
 				       kw, bled);
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 		kw = find_keyword(conf->keywords, rootkw->sub, "product");
 		if (!kw)
 			return 0;
 		fwd += snprint_keyword(buff + fwd, len - fwd, "\t\t%k %v\n",
 				       kw, bled);
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 		fwd += snprintf(buff + fwd, len - fwd, "\t}\n");
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 	}
 	fwd += snprintf(buff + fwd, len - fwd, "}\n");
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 	return fwd;
 }
@@ -1585,7 +1586,7 @@ snprint_blacklist_except (struct config *conf, char * buff, int len)
 		return 0;
 
 	fwd += snprintf(buff + fwd, len - fwd, "blacklist_exceptions {\n");
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 
 	vector_foreach_slot (conf->elist_devnode, ele, i) {
@@ -1594,7 +1595,7 @@ snprint_blacklist_except (struct config *conf, char * buff, int len)
 			return 0;
 		fwd += snprint_keyword(buff + fwd, len - fwd, "\t%k %v\n",
 				       kw, ele);
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 	}
 	vector_foreach_slot (conf->elist_wwid, ele, i) {
@@ -1603,7 +1604,7 @@ snprint_blacklist_except (struct config *conf, char * buff, int len)
 			return 0;
 		fwd += snprint_keyword(buff + fwd, len - fwd, "\t%k %v\n",
 				       kw, ele);
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 	}
 	vector_foreach_slot (conf->elist_property, ele, i) {
@@ -1612,7 +1613,7 @@ snprint_blacklist_except (struct config *conf, char * buff, int len)
 			return 0;
 		fwd += snprint_keyword(buff + fwd, len - fwd, "\t%k %v\n",
 				       kw, ele);
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 	}
 	rootkw = find_keyword(conf->keywords, rootkw->sub, "device");
@@ -1621,28 +1622,28 @@ snprint_blacklist_except (struct config *conf, char * buff, int len)
 
 	vector_foreach_slot (conf->elist_device, eled, i) {
 		fwd += snprintf(buff + fwd, len - fwd, "\tdevice {\n");
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 		kw = find_keyword(conf->keywords, rootkw->sub, "vendor");
 		if (!kw)
 			return 0;
 		fwd += snprint_keyword(buff + fwd, len - fwd, "\t\t%k %v\n",
 				       kw, eled);
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 		kw = find_keyword(conf->keywords, rootkw->sub, "product");
 		if (!kw)
 			return 0;
 		fwd += snprint_keyword(buff + fwd, len - fwd, "\t\t%k %v\n",
 				       kw, eled);
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 		fwd += snprintf(buff + fwd, len - fwd, "\t}\n");
-		if (fwd > len)
+		if (fwd >= len)
 			return len;
 	}
 	fwd += snprintf(buff + fwd, len - fwd, "}\n");
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 	return fwd;
 }
@@ -1674,7 +1675,7 @@ snprint_status (char * buff, int len, struct vectors *vecs)
 	fwd += snprintf(buff + fwd, len - fwd, "\npaths: %d\nbusy: %s\n",
 			monitored_count, is_uevent_busy()? "True" : "False");
 
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 	return fwd;
 }
@@ -1740,7 +1741,7 @@ snprint_devices (struct config *conf, char * buff, int len, struct vectors *vecs
 	}
 	closedir(blkdir);
 
-	if (fwd > len)
+	if (fwd >= len)
 		return len;
 	return fwd;
 }
-- 
2.8.1.windows.1


--
dm-devel mailing list
dm-devel@redhat.com
https://www.redhat.com/mailman/listinfo/dm-devel

^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2016-11-02  1:41 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <OF5BF4BDA1.F17A7CBD-ON4825805E.00146960-4825805E.001E3DAC@LocalDomain>
     [not found] ` <OF40C7686E.999CA110-ON4825805E.001EC62D-4825805E.002071CC@zte.com.cn>
2016-11-01 17:13   ` [PATCH] multipathd: "show map mpathx json" would cause realloc error possibly Benjamin Marzinski
2016-11-02  1:41 tang.wenjun3
  -- strict thread matches above, loose matches on Subject: below --
2016-10-14  3:13 tang.wenjun3

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).