21ab4e
From e983749c2bdf5f2cf696faf6a6feae74fb1eef9a Mon Sep 17 00:00:00 2001
21ab4e
From: Atin Mukherjee <amukherj@redhat.com>
21ab4e
Date: Wed, 5 Jul 2017 14:58:50 +0530
21ab4e
Subject: [PATCH 542/557] cli/xml: fix return handling
21ab4e
21ab4e
The return code of xmlTextWriter* APIs says it returns either the bytes
21ab4e
written (may be 0 because of buffering) or -1 in case of error. Now if the
21ab4e
volume of the xml data payload is not huge then most of the time the
21ab4e
data to be written gets buffered, however when this grows sometimes this
21ab4e
APIs will return the total number of bytes written and then it becomes
21ab4e
absolutely mandatory that every such call is followed by
21ab4e
XML_RET_CHECK_AND_GOTO otherwise we may end up returning a non zero ret
21ab4e
code which would result into the overall xml generation to fail.
21ab4e
21ab4e
>Reviewed-on: https://review.gluster.org/17702
21ab4e
>Smoke: Gluster Build System <jenkins@build.gluster.org>
21ab4e
>Reviewed-by: Amar Tumballi <amarts@redhat.com>
21ab4e
>CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
21ab4e
>Reviewed-by: Gaurav Yadav <gyadav@redhat.com>
21ab4e
21ab4e
Change-Id: I02ee7076e1d8c26cf654d3dc3e77b1eb17cbdab0
21ab4e
BUG: 1467807
21ab4e
Signed-off-by: Atin Mukherjee <amukherj@redhat.com>
21ab4e
Reviewed-on: https://code.engineering.redhat.com/gerrit/111200
21ab4e
Reviewed-by: Gaurav Yadav <gyadav@redhat.com>
21ab4e
---
21ab4e
 cli/src/cli-xml-output.c | 88 ++++++++++++++++++++++++++++--------------------
21ab4e
 1 file changed, 51 insertions(+), 37 deletions(-)
21ab4e
21ab4e
diff --git a/cli/src/cli-xml-output.c b/cli/src/cli-xml-output.c
21ab4e
index d0d8179..75aceab 100644
21ab4e
--- a/cli/src/cli-xml-output.c
21ab4e
+++ b/cli/src/cli-xml-output.c
21ab4e
@@ -194,6 +194,8 @@ cli_xml_output_data_pair (dict_t *this, char *key, data_t *value,
21ab4e
         ret = xmlTextWriterWriteFormatElement (*writer, (xmlChar *)key,
21ab4e
                                                "%s", value->data);
21ab4e
 
21ab4e
+        XML_RET_CHECK_AND_GOTO (ret, out);
21ab4e
+out:
21ab4e
         return ret;
21ab4e
 }
21ab4e
 #endif
21ab4e
@@ -324,7 +326,7 @@ cli_xml_output_vol_status_common (xmlTextWriterPtr writer, dict_t *dict,
21ab4e
                  ret = xmlTextWriterWriteFormatElement (writer,
21ab4e
                                                         (xmlChar *)"port",
21ab4e
                                                         "%s", "N/A");
21ab4e
-
21ab4e
+        XML_RET_CHECK_AND_GOTO (ret, out);
21ab4e
         ret = xmlTextWriterStartElement (writer, (xmlChar *)"ports");
21ab4e
         if (*online == 1 && (port != 0 || rdma_port != 0)) {
21ab4e
 
21ab4e
@@ -337,7 +339,7 @@ cli_xml_output_vol_status_common (xmlTextWriterPtr writer, dict_t *dict,
21ab4e
                                                        (xmlChar *)"tcp",
21ab4e
                                                        "%s", "N/A");
21ab4e
                 }
21ab4e
-
21ab4e
+                XML_RET_CHECK_AND_GOTO (ret, out);
21ab4e
                 if (rdma_port) {
21ab4e
                 ret = xmlTextWriterWriteFormatElement (writer,
21ab4e
                                                        (xmlChar *)"rdma",
21ab4e
@@ -347,14 +349,16 @@ cli_xml_output_vol_status_common (xmlTextWriterPtr writer, dict_t *dict,
21ab4e
                                                        (xmlChar *)"rdma",
21ab4e
                                                        "%s", "N/A");
21ab4e
                 }
21ab4e
-
21ab4e
+                XML_RET_CHECK_AND_GOTO (ret, out);
21ab4e
         } else {
21ab4e
                 ret = xmlTextWriterWriteFormatElement (writer,
21ab4e
                                                        (xmlChar *)"tcp",
21ab4e
                                                        "%s", "N/A");
21ab4e
+                XML_RET_CHECK_AND_GOTO (ret, out);
21ab4e
                 ret = xmlTextWriterWriteFormatElement (writer,
21ab4e
                                                        (xmlChar *)"rdma",
21ab4e
                                                        "%s", "N/A");
21ab4e
+                XML_RET_CHECK_AND_GOTO (ret, out);
21ab4e
         }
21ab4e
 
21ab4e
         ret = xmlTextWriterEndElement (writer);
21ab4e
@@ -392,51 +396,57 @@ cli_xml_output_vol_status_detail (xmlTextWriterPtr writer, dict_t *dict,
21ab4e
 
21ab4e
         snprintf (key, sizeof (key), "brick%d.total", brick_index);
21ab4e
         ret = dict_get_uint64 (dict, key, &size_total);
21ab4e
-        if (!ret)
21ab4e
+        if (!ret) {
21ab4e
                 ret = xmlTextWriterWriteFormatElement (writer,
21ab4e
                                                        (xmlChar *)"sizeTotal",
21ab4e
                                                        "%"PRIu64, size_total);
21ab4e
-
21ab4e
+                XML_RET_CHECK_AND_GOTO (ret, out);
21ab4e
+        }
21ab4e
         memset (key, 0, sizeof (key));
21ab4e
         snprintf (key, sizeof (key), "brick%d.free", brick_index);
21ab4e
         ret = dict_get_uint64 (dict, key, &size_free);
21ab4e
-        if (!ret)
21ab4e
+        if (!ret) {
21ab4e
                 ret = xmlTextWriterWriteFormatElement (writer,
21ab4e
                                                        (xmlChar *)"sizeFree",
21ab4e
                                                        "%"PRIu64, size_free);
21ab4e
-
21ab4e
+                XML_RET_CHECK_AND_GOTO (ret, out);
21ab4e
+        }
21ab4e
         memset (key, 0, sizeof (key));
21ab4e
         snprintf (key, sizeof (key), "brick%d.device", brick_index);
21ab4e
         ret = dict_get_str (dict, key, &device);
21ab4e
-        if (!ret)
21ab4e
+        if (!ret) {
21ab4e
                 ret = xmlTextWriterWriteFormatElement (writer,
21ab4e
                                                        (xmlChar *)"device",
21ab4e
                                                        "%s", device);
21ab4e
-
21ab4e
+                XML_RET_CHECK_AND_GOTO (ret, out);
21ab4e
+        }
21ab4e
         memset (key, 0, sizeof (key));
21ab4e
         snprintf (key, sizeof (key), "brick%d.block_size", brick_index);
21ab4e
         ret = dict_get_uint64 (dict, key, &block_size);
21ab4e
-        if (!ret)
21ab4e
+        if (!ret) {
21ab4e
                 ret = xmlTextWriterWriteFormatElement (writer,
21ab4e
                                                        (xmlChar *)"blockSize",
21ab4e
                                                        "%"PRIu64, block_size);
21ab4e
-        XML_RET_CHECK_AND_GOTO (ret, out);
21ab4e
-
21ab4e
+                XML_RET_CHECK_AND_GOTO (ret, out);
21ab4e
+        }
21ab4e
         memset (key, 0, sizeof (key));
21ab4e
         snprintf (key, sizeof (key), "brick%d.mnt_options", brick_index);
21ab4e
         ret = dict_get_str (dict, key, &mnt_options);
21ab4e
-        if (!ret)
21ab4e
+        if (!ret) {
21ab4e
                 ret = xmlTextWriterWriteFormatElement (writer,
21ab4e
                                                        (xmlChar *)"mntOptions",
21ab4e
                                                        "%s", mnt_options);
21ab4e
-
21ab4e
+                XML_RET_CHECK_AND_GOTO (ret, out);
21ab4e
+        }
21ab4e
         memset (key, 0, sizeof (key));
21ab4e
         snprintf (key, sizeof (key), "brick%d.fs_name", brick_index);
21ab4e
         ret = dict_get_str (dict, key, &fs_name);
21ab4e
-        if (!ret)
21ab4e
+        if (!ret) {
21ab4e
                 ret = xmlTextWriterWriteFormatElement (writer,
21ab4e
                                                        (xmlChar *)"fsName",
21ab4e
                                                        "%s", fs_name);
21ab4e
+                XML_RET_CHECK_AND_GOTO (ret, out);
21ab4e
+        }
21ab4e
 
21ab4e
         /* inode details are only available for ext 2/3/4 & xfs */
21ab4e
         if (!fs_name || !IS_EXT_FS(fs_name) || strcmp (fs_name, "xfs")) {
21ab4e
@@ -447,26 +457,30 @@ cli_xml_output_vol_status_detail (xmlTextWriterPtr writer, dict_t *dict,
21ab4e
         memset (key, 0, sizeof (key));
21ab4e
         snprintf (key, sizeof (key), "brick%d.inode_size", brick_index);
21ab4e
         ret = dict_get_str (dict, key, &inode_size);
21ab4e
-        if (!ret)
21ab4e
+        if (!ret) {
21ab4e
                 ret = xmlTextWriterWriteFormatElement (writer,
21ab4e
                                                        (xmlChar *)"inodeSize",
21ab4e
                                                        "%s", fs_name);
21ab4e
-
21ab4e
+                XML_RET_CHECK_AND_GOTO (ret, out);
21ab4e
+        }
21ab4e
         memset (key, 0, sizeof (key));
21ab4e
         snprintf (key, sizeof (key), "brick%d.total_inodes", brick_index);
21ab4e
         ret = dict_get_uint64 (dict, key, &inodes_total);
21ab4e
-        if (!ret)
21ab4e
+        if (!ret) {
21ab4e
                 ret = xmlTextWriterWriteFormatElement (writer,
21ab4e
                                                        (xmlChar *)"inodesTotal",
21ab4e
                                                        "%"PRIu64, inodes_total);
21ab4e
-
21ab4e
+                XML_RET_CHECK_AND_GOTO (ret, out);
21ab4e
+        }
21ab4e
         memset (key, 0, sizeof (key));
21ab4e
         snprintf (key, sizeof (key), "brick%d.free_inodes", brick_index);
21ab4e
         ret = dict_get_uint64 (dict, key, &inodes_free);
21ab4e
-        if (!ret)
21ab4e
+        if (!ret) {
21ab4e
                 ret = xmlTextWriterWriteFormatElement (writer,
21ab4e
                                                        (xmlChar *)"inodesFree",
21ab4e
                                                        "%"PRIu64, inodes_free);
21ab4e
+                XML_RET_CHECK_AND_GOTO (ret, out);
21ab4e
+        }
21ab4e
 
21ab4e
 out:
21ab4e
         gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret);
21ab4e
@@ -1382,6 +1396,7 @@ cli_xml_output_vol_status_callpool (xmlTextWriterPtr writer, dict_t *dict,
21ab4e
                 goto out;
21ab4e
         ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"count",
21ab4e
                                                "%d", call_count);
21ab4e
+        XML_RET_CHECK_AND_GOTO (ret, out);
21ab4e
 
21ab4e
         for (i = 0; i < call_count; i++) {
21ab4e
                 memset (key, 0, sizeof (key));
21ab4e
@@ -1492,7 +1507,7 @@ cli_xml_output_remove_brick_task_params (xmlTextWriterPtr writer, dict_t *dict,
21ab4e
 
21ab4e
         /* </param> */
21ab4e
         ret = xmlTextWriterEndElement (writer);
21ab4e
-
21ab4e
+        XML_RET_CHECK_AND_GOTO (ret, out);
21ab4e
 out:
21ab4e
         gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret);
21ab4e
         return ret;
21ab4e
@@ -1576,7 +1591,7 @@ cli_xml_output_vol_status_tasks (cli_local_t *local, dict_t *dict) {
21ab4e
 
21ab4e
         /* </tasks> */
21ab4e
         ret = xmlTextWriterEndElement (local->writer);
21ab4e
-
21ab4e
+        XML_RET_CHECK_AND_GOTO (ret, out);
21ab4e
 out:
21ab4e
         gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret);
21ab4e
         return ret;
21ab4e
@@ -1653,8 +1668,8 @@ cli_xml_output_vol_status (cli_local_t *local, dict_t *dict)
21ab4e
         ret = xmlTextWriterWriteFormatElement (local->writer,
21ab4e
                                                (xmlChar *)"nodeCount", "%d",
21ab4e
                                                brick_count);
21ab4e
-        if (ret)
21ab4e
-                goto out;
21ab4e
+
21ab4e
+        XML_RET_CHECK_AND_GOTO (ret, out);
21ab4e
 
21ab4e
         ret = dict_get_uint32 (dict, "cmd", &cmd);
21ab4e
         if (ret)
21ab4e
@@ -2034,6 +2049,7 @@ cli_xml_output_vol_top (dict_t *dict, int op_ret, int op_errno,
21ab4e
                                 ret = xmlTextWriterWriteFormatElement
21ab4e
                                         (writer, (xmlChar *)"timeTaken",
21ab4e
                                          "%f", time_taken);
21ab4e
+                                XML_RET_CHECK_AND_GOTO (ret, out);
21ab4e
                         }
21ab4e
 
21ab4e
                         break;
21ab4e
@@ -2378,8 +2394,7 @@ cli_xml_output_vol_profile (dict_t *dict, int op_ret, int op_errno,
21ab4e
                                 (writer, (xmlChar *)"clearStats", "%s",
21ab4e
                                 stats_cleared ? "Cleared stats." :
21ab4e
                                                  "Failed to clear stats.");
21ab4e
-                        if (ret)
21ab4e
-                                goto out;
21ab4e
+                        XML_RET_CHECK_AND_GOTO (ret, out);
21ab4e
                 } else {
21ab4e
                         snprintf (key, sizeof (key), "%d-cumulative", i);
21ab4e
                         ret = dict_get_int32 (dict, key, &interval);
21ab4e
@@ -2892,6 +2907,7 @@ cli_xml_output_vol_info (cli_local_t *local, dict_t *dict)
21ab4e
                         ret = xmlTextWriterWriteFormatElement
21ab4e
                                 (local->writer, (xmlChar *)"hotBrickType",
21ab4e
                                  "%s", vol_type_str[tier_vol_type]);
21ab4e
+                        XML_RET_CHECK_AND_GOTO (ret, out);
21ab4e
 
21ab4e
                         ret = xmlTextWriterWriteFormatElement (local->writer,
21ab4e
                                                    (xmlChar *)"hotreplicaCount",
21ab4e
@@ -2912,7 +2928,6 @@ cli_xml_output_vol_info (cli_local_t *local, dict_t *dict)
21ab4e
                                         (local->writer,
21ab4e
                                          (xmlChar *)"numberOfBricks",
21ab4e
                                          "%d", value[HOT_BRICK_COUNT]);
21ab4e
-                                XML_RET_CHECK_AND_GOTO (ret, out);
21ab4e
                         } else {
21ab4e
                                 ret = xmlTextWriterWriteFormatElement
21ab4e
                                         (local->writer,
21ab4e
@@ -2923,6 +2938,7 @@ cli_xml_output_vol_info (cli_local_t *local, dict_t *dict)
21ab4e
                                          hot_dist_count,
21ab4e
                                          value[HOT_BRICK_COUNT]);
21ab4e
                         }
21ab4e
+                        XML_RET_CHECK_AND_GOTO (ret, out);
21ab4e
 
21ab4e
                         while (index <= value[HOT_BRICK_COUNT]) {
21ab4e
                                 snprintf (key, 1024, "volume%d.brick%d", i,
21ab4e
@@ -2980,6 +2996,7 @@ cli_xml_output_vol_info (cli_local_t *local, dict_t *dict)
21ab4e
                         ret = xmlTextWriterWriteFormatElement
21ab4e
                                 (local->writer, (xmlChar *)"coldBrickType",
21ab4e
                                  "%s", vol_type_str[tier_vol_type]);
21ab4e
+                        XML_RET_CHECK_AND_GOTO (ret, out);
21ab4e
 
21ab4e
                         ret = xmlTextWriterWriteFormatElement (local->writer,
21ab4e
                                         (xmlChar *)"coldreplicaCount",
21ab4e
@@ -3009,8 +3026,6 @@ cli_xml_output_vol_info (cli_local_t *local, dict_t *dict)
21ab4e
                                         (local->writer,
21ab4e
                                          (xmlChar *)"numberOfBricks",
21ab4e
                                          "%d", value[COLD_BRICK_COUNT]);
21ab4e
-                                XML_RET_CHECK_AND_GOTO (ret, out);
21ab4e
-
21ab4e
                         } else if (value[COLD_TYPE] ==
21ab4e
                                         GF_CLUSTER_TYPE_DISPERSE) {
21ab4e
                                 ret = xmlTextWriterWriteFormatElement
21ab4e
@@ -3033,6 +3048,7 @@ cli_xml_output_vol_info (cli_local_t *local, dict_t *dict)
21ab4e
                                          value[COLD_DIST_COUNT],
21ab4e
                                          value[COLD_BRICK_COUNT]);
21ab4e
                         }
21ab4e
+                        XML_RET_CHECK_AND_GOTO (ret, out);
21ab4e
 
21ab4e
                         start_index = index = value[HOT_BRICK_COUNT] + 1;
21ab4e
 
21ab4e
@@ -3226,7 +3242,7 @@ cli_xml_output_vol_info_end (cli_local_t *local)
21ab4e
         ret = xmlTextWriterWriteFormatElement (local->writer,
21ab4e
                                                (xmlChar *)"count",
21ab4e
                                                "%d", local->vol_count);
21ab4e
-
21ab4e
+        XML_RET_CHECK_AND_GOTO (ret, out);
21ab4e
         /* </volumes> */
21ab4e
         ret = xmlTextWriterEndElement (local->writer);
21ab4e
         XML_RET_CHECK_AND_GOTO (ret, out);
21ab4e
@@ -3252,9 +3268,7 @@ cli_xml_output_vol_quota_limit_list_end (cli_local_t *local)
21ab4e
         int     ret = -1;
21ab4e
 
21ab4e
         ret = xmlTextWriterEndElement (local->writer);
21ab4e
-        if (ret) {
21ab4e
-                goto out;
21ab4e
-        }
21ab4e
+        XML_RET_CHECK_AND_GOTO (ret, out);
21ab4e
 
21ab4e
         ret = cli_end_xml_output (local->writer, local->doc);
21ab4e
 
21ab4e
@@ -3322,7 +3336,7 @@ cli_xml_output_peer_hostnames (xmlTextWriterPtr writer, dict_t *dict,
21ab4e
 
21ab4e
         /* </hostnames> */
21ab4e
         ret = xmlTextWriterEndElement (writer);
21ab4e
-
21ab4e
+        XML_RET_CHECK_AND_GOTO (ret, out);
21ab4e
 out:
21ab4e
         gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret);
21ab4e
         return ret;
21ab4e
@@ -3526,6 +3540,7 @@ cli_xml_output_vol_rebalance_status (xmlTextWriterPtr writer, dict_t *dict,
21ab4e
                 ret = xmlTextWriterWriteFormatElement (writer,
21ab4e
                                                        (xmlChar *)"nodeName",
21ab4e
                                                        "%s", node_name);
21ab4e
+                XML_RET_CHECK_AND_GOTO (ret, out);
21ab4e
 
21ab4e
                 memset (key, 0, sizeof (key));
21ab4e
                 snprintf (key, sizeof (key), "node-uuid-%d", i);
21ab4e
@@ -3610,6 +3625,7 @@ cli_xml_output_vol_rebalance_status (xmlTextWriterPtr writer, dict_t *dict,
21ab4e
                                                        (xmlChar *)"statusStr",
21ab4e
                                                        "%s",
21ab4e
                                          cli_vol_task_status_str[status_rcd]);
21ab4e
+                XML_RET_CHECK_AND_GOTO (ret, out);
21ab4e
 
21ab4e
                 memset (key, 0, 256);
21ab4e
                 snprintf (key, 256, "run-time-%d", i);
21ab4e
@@ -5880,7 +5896,6 @@ cli_xml_snapshot_delete (xmlTextWriterPtr writer, xmlDocPtr doc, dict_t *dict,
21ab4e
                 ret = xmlTextWriterWriteFormatElement (writer,
21ab4e
                                                        (xmlChar *) "status",
21ab4e
                                                        "Success");
21ab4e
-                XML_RET_CHECK_AND_GOTO (ret, xmlend);
21ab4e
         } else {
21ab4e
                 ret = xmlTextWriterWriteFormatElement (writer,
21ab4e
                                                        (xmlChar *) "status",
21ab4e
@@ -5890,9 +5905,8 @@ cli_xml_snapshot_delete (xmlTextWriterPtr writer, xmlDocPtr doc, dict_t *dict,
21ab4e
                 ret = cli_xml_output_common (writer, rsp->op_ret,
21ab4e
                                              rsp->op_errno,
21ab4e
                                              rsp->op_errstr);
21ab4e
-                XML_RET_CHECK_AND_GOTO (ret, xmlend);
21ab4e
         }
21ab4e
-
21ab4e
+        XML_RET_CHECK_AND_GOTO (ret, xmlend);
21ab4e
 
21ab4e
         ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *) "name",
21ab4e
                                                "%s", str_value);
21ab4e
-- 
21ab4e
1.8.3.1
21ab4e