d1681e
From d15e6e4443e8873dc44c6731ce8876bde625b189 Mon Sep 17 00:00:00 2001
d1681e
From: Amar Tumballi <amarts@redhat.com>
d1681e
Date: Thu, 2 Aug 2018 14:27:45 +0530
d1681e
Subject: [PATCH 340/351] protocol: don't use alloca
d1681e
d1681e
current implementation of alloca can cause issues when strings larger
d1681e
than the allocated buffer is passed to the xdr. Hence it makes sense
d1681e
to allow XDR decode functions to deal with memory allocations, which
d1681e
we can free later.
d1681e
d1681e
BUG: 1605227
d1681e
Change-Id: I12d1c5d5498d0a403abd9c4e618bd5b4b60df8ee
d1681e
Signed-off-by: Amar Tumballi <amarts@redhat.com>
d1681e
Reviewed-on: https://code.engineering.redhat.com/gerrit/145897
d1681e
Reviewed-by: FNU Raghavendra Manjunath <raghavendra@redhat.com>
d1681e
Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
d1681e
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
d1681e
---
d1681e
 xlators/protocol/server/src/server-rpc-fops.c | 74 ++++++++++-----------------
d1681e
 1 file changed, 27 insertions(+), 47 deletions(-)
d1681e
d1681e
diff --git a/xlators/protocol/server/src/server-rpc-fops.c b/xlators/protocol/server/src/server-rpc-fops.c
d1681e
index 0bf41d8..a7fd3b5 100644
d1681e
--- a/xlators/protocol/server/src/server-rpc-fops.c
d1681e
+++ b/xlators/protocol/server/src/server-rpc-fops.c
d1681e
@@ -3896,8 +3896,6 @@ server3_3_create (rpcsvc_request_t *req)
d1681e
         if (!req)
d1681e
                 return ret;
d1681e
 
d1681e
-        args.bname = alloca (req->msg[0].iov_len);
d1681e
-
d1681e
         ret = rpc_receive_common (req, &frame, &state, NULL, &args,
d1681e
                                   xdr_gfs3_create_req, GF_FOP_CREATE);
d1681e
         if (ret != 0) {
d1681e
@@ -3931,6 +3929,7 @@ server3_3_create (rpcsvc_request_t *req)
d1681e
 out:
d1681e
         /* memory allocated by libc, don't use GF_FREE */
d1681e
         free (args.xdata.xdata_val);
d1681e
+        free (args.bname);
d1681e
 
d1681e
         if (op_errno)
d1681e
                 SERVER_REQ_SET_ERROR (req, ret);
d1681e
@@ -4453,8 +4452,6 @@ server3_3_unlink (rpcsvc_request_t *req)
d1681e
         if (!req)
d1681e
                 return ret;
d1681e
 
d1681e
-        args.bname = alloca (req->msg[0].iov_len);
d1681e
-
d1681e
         ret = rpc_receive_common (req, &frame, &state, NULL, &args,
d1681e
                                   xdr_gfs3_unlink_req, GF_FOP_UNLINK);
d1681e
         if (ret != 0) {
d1681e
@@ -4479,6 +4476,7 @@ server3_3_unlink (rpcsvc_request_t *req)
d1681e
         resolve_and_resume (frame, server_unlink_resume);
d1681e
 out:
d1681e
         free (args.xdata.xdata_val);
d1681e
+        free (args.bname);
d1681e
 
d1681e
         if (op_errno)
d1681e
                 SERVER_REQ_SET_ERROR (req, ret);
d1681e
@@ -4500,8 +4498,6 @@ server3_3_setxattr (rpcsvc_request_t *req)
d1681e
         if (!req)
d1681e
                 return ret;
d1681e
 
d1681e
-        args.dict.dict_val = alloca (req->msg[0].iov_len);
d1681e
-
d1681e
         ret = rpc_receive_common (req, &frame, &state, NULL, &args,
d1681e
                                   xdr_gfs3_setxattr_req, GF_FOP_SETXATTR);
d1681e
         if (ret != 0) {
d1681e
@@ -4537,6 +4533,7 @@ server3_3_setxattr (rpcsvc_request_t *req)
d1681e
 
d1681e
 out:
d1681e
         free (args.xdata.xdata_val);
d1681e
+        free (args.dict.dict_val);
d1681e
 
d1681e
         if (op_errno)
d1681e
                 SERVER_REQ_SET_ERROR (req, ret);
d1681e
@@ -4562,8 +4559,6 @@ server3_3_fsetxattr (rpcsvc_request_t *req)
d1681e
         if (!req)
d1681e
                 return ret;
d1681e
 
d1681e
-        args.dict.dict_val = alloca (req->msg[0].iov_len);
d1681e
-
d1681e
         ret = rpc_receive_common (req, &frame, &state, NULL, &args,
d1681e
                                   xdr_gfs3_fsetxattr_req, GF_FOP_FSETXATTR);
d1681e
         if (ret != 0) {
d1681e
@@ -4597,6 +4592,7 @@ server3_3_fsetxattr (rpcsvc_request_t *req)
d1681e
 
d1681e
 out:
d1681e
         free (args.xdata.xdata_val);
d1681e
+        free (args.dict.dict_val);
d1681e
 
d1681e
         if (op_errno)
d1681e
                 SERVER_REQ_SET_ERROR (req, ret);
d1681e
@@ -4622,8 +4618,6 @@ server3_3_fxattrop (rpcsvc_request_t *req)
d1681e
         if (!req)
d1681e
                 return ret;
d1681e
 
d1681e
-        args.dict.dict_val = alloca (req->msg[0].iov_len);
d1681e
-
d1681e
         ret = rpc_receive_common (req, &frame, &state, NULL, &args,
d1681e
                                   xdr_gfs3_fxattrop_req, GF_FOP_FXATTROP);
d1681e
         if (ret != 0) {
d1681e
@@ -4657,6 +4651,7 @@ server3_3_fxattrop (rpcsvc_request_t *req)
d1681e
 
d1681e
 out:
d1681e
         free (args.xdata.xdata_val);
d1681e
+        free (args.dict.dict_val);
d1681e
 
d1681e
         if (op_errno)
d1681e
                 SERVER_REQ_SET_ERROR (req, ret);
d1681e
@@ -4682,8 +4677,6 @@ server3_3_xattrop (rpcsvc_request_t *req)
d1681e
         if (!req)
d1681e
                 return ret;
d1681e
 
d1681e
-        args.dict.dict_val = alloca (req->msg[0].iov_len);
d1681e
-
d1681e
         ret = rpc_receive_common (req, &frame, &state, NULL, &args,
d1681e
                                   xdr_gfs3_xattrop_req, GF_FOP_XATTROP);
d1681e
         if (ret != 0) {
d1681e
@@ -4716,6 +4709,7 @@ server3_3_xattrop (rpcsvc_request_t *req)
d1681e
 
d1681e
 out:
d1681e
         free (args.xdata.xdata_val);
d1681e
+        free (args.dict.dict_val);
d1681e
 
d1681e
         if (op_errno)
d1681e
                 SERVER_REQ_SET_ERROR (req, ret);
d1681e
@@ -4739,8 +4733,6 @@ server3_3_getxattr (rpcsvc_request_t *req)
d1681e
         if (!req)
d1681e
                 return ret;
d1681e
 
d1681e
-        args.name = alloca (256);
d1681e
-
d1681e
         ret = rpc_receive_common (req, &frame, &state, NULL, &args,
d1681e
                                   xdr_gfs3_getxattr_req, GF_FOP_GETXATTR);
d1681e
         if (ret != 0) {
d1681e
@@ -4766,6 +4758,7 @@ server3_3_getxattr (rpcsvc_request_t *req)
d1681e
         resolve_and_resume (frame, server_getxattr_resume);
d1681e
 out:
d1681e
         free (args.xdata.xdata_val);
d1681e
+        free (args.name);
d1681e
 
d1681e
         if (op_errno)
d1681e
                 SERVER_REQ_SET_ERROR (req, ret);
d1681e
@@ -4786,8 +4779,6 @@ server3_3_fgetxattr (rpcsvc_request_t *req)
d1681e
         if (!req)
d1681e
                 return ret;
d1681e
 
d1681e
-        args.name = alloca (256);
d1681e
-
d1681e
         ret = rpc_receive_common (req, &frame, &state, NULL, &args,
d1681e
                                   xdr_gfs3_fgetxattr_req, GF_FOP_FGETXATTR);
d1681e
         if (ret != 0) {
d1681e
@@ -4810,6 +4801,7 @@ server3_3_fgetxattr (rpcsvc_request_t *req)
d1681e
         resolve_and_resume (frame, server_fgetxattr_resume);
d1681e
 out:
d1681e
         free (args.xdata.xdata_val);
d1681e
+        free (args.name);
d1681e
 
d1681e
         if (op_errno)
d1681e
                 SERVER_REQ_SET_ERROR (req, ret);
d1681e
@@ -4831,8 +4823,6 @@ server3_3_removexattr (rpcsvc_request_t *req)
d1681e
         if (!req)
d1681e
                 return ret;
d1681e
 
d1681e
-        args.name = alloca (256);
d1681e
-
d1681e
         ret = rpc_receive_common (req, &frame, &state, NULL, &args,
d1681e
                                   xdr_gfs3_removexattr_req,
d1681e
                                   GF_FOP_REMOVEXATTR);
d1681e
@@ -4854,6 +4844,7 @@ server3_3_removexattr (rpcsvc_request_t *req)
d1681e
         resolve_and_resume (frame, server_removexattr_resume);
d1681e
 out:
d1681e
         free (args.xdata.xdata_val);
d1681e
+        free (args.name);
d1681e
 
d1681e
         if (op_errno)
d1681e
                 SERVER_REQ_SET_ERROR (req, ret);
d1681e
@@ -4873,8 +4864,6 @@ server3_3_fremovexattr (rpcsvc_request_t *req)
d1681e
         if (!req)
d1681e
                 return ret;
d1681e
 
d1681e
-        args.name = alloca (4096);
d1681e
-
d1681e
         ret = rpc_receive_common (req, &frame, &state, NULL, &args,
d1681e
                                   xdr_gfs3_fremovexattr_req,
d1681e
                                   GF_FOP_FREMOVEXATTR);
d1681e
@@ -4897,6 +4886,7 @@ server3_3_fremovexattr (rpcsvc_request_t *req)
d1681e
         resolve_and_resume (frame, server_fremovexattr_resume);
d1681e
 out:
d1681e
         free (args.xdata.xdata_val);
d1681e
+        free (args.name);
d1681e
 
d1681e
         if (op_errno)
d1681e
                 SERVER_REQ_SET_ERROR (req, ret);
d1681e
@@ -5107,8 +5097,6 @@ server3_3_mknod (rpcsvc_request_t *req)
d1681e
         if (!req)
d1681e
                 return ret;
d1681e
 
d1681e
-        args.bname = alloca (req->msg[0].iov_len);
d1681e
-
d1681e
         ret = rpc_receive_common (req, &frame, &state, NULL, &args,
d1681e
                                   xdr_gfs3_mknod_req, GF_FOP_MKNOD);
d1681e
         if (ret != 0) {
d1681e
@@ -5140,6 +5128,7 @@ out:
d1681e
 
d1681e
         /* memory allocated by libc, don't use GF_FREE */
d1681e
         free (args.xdata.xdata_val);
d1681e
+        free (args.bname);
d1681e
 
d1681e
         return ret;
d1681e
 
d1681e
@@ -5158,8 +5147,6 @@ server3_3_mkdir (rpcsvc_request_t *req)
d1681e
         if (!req)
d1681e
                 return ret;
d1681e
 
d1681e
-        args.bname = alloca (req->msg[0].iov_len);
d1681e
-
d1681e
         ret = rpc_receive_common (req, &frame, &state, NULL, &args,
d1681e
                                   xdr_gfs3_mkdir_req, GF_FOP_MKDIR);
d1681e
         if (ret != 0) {
d1681e
@@ -5189,6 +5176,7 @@ out:
d1681e
                 SERVER_REQ_SET_ERROR (req, ret);
d1681e
 
d1681e
         free (args.xdata.xdata_val);
d1681e
+        free (args.bname);
d1681e
 
d1681e
         return ret;
d1681e
 }
d1681e
@@ -5206,8 +5194,6 @@ server3_3_rmdir (rpcsvc_request_t *req)
d1681e
         if (!req)
d1681e
                 return ret;
d1681e
 
d1681e
-        args.bname = alloca (req->msg[0].iov_len);
d1681e
-
d1681e
         ret = rpc_receive_common (req, &frame, &state, NULL, &args,
d1681e
                                   xdr_gfs3_rmdir_req, GF_FOP_RMDIR);
d1681e
         if (ret != 0) {
d1681e
@@ -5231,6 +5217,7 @@ server3_3_rmdir (rpcsvc_request_t *req)
d1681e
         resolve_and_resume (frame, server_rmdir_resume);
d1681e
 out:
d1681e
         free (args.xdata.xdata_val);
d1681e
+        free (args.bname);
d1681e
 
d1681e
         if (op_errno)
d1681e
                 SERVER_REQ_SET_ERROR (req, ret);
d1681e
@@ -5253,8 +5240,6 @@ server3_3_inodelk (rpcsvc_request_t *req)
d1681e
         if (!req)
d1681e
                 return ret;
d1681e
 
d1681e
-        args.volume = alloca (256);
d1681e
-
d1681e
         ret = rpc_receive_common (req, &frame, &state, NULL, &args,
d1681e
                                   xdr_gfs3_inodelk_req, GF_FOP_INODELK);
d1681e
         if (ret != 0) {
d1681e
@@ -5304,6 +5289,7 @@ server3_3_inodelk (rpcsvc_request_t *req)
d1681e
         resolve_and_resume (frame, server_inodelk_resume);
d1681e
 out:
d1681e
         free (args.xdata.xdata_val);
d1681e
+        free (args.volume);
d1681e
 
d1681e
         free (args.flock.lk_owner.lk_owner_val);
d1681e
 
d1681e
@@ -5325,8 +5311,6 @@ server3_3_finodelk (rpcsvc_request_t *req)
d1681e
         if (!req)
d1681e
                 return ret;
d1681e
 
d1681e
-        args.volume = alloca (256);
d1681e
-
d1681e
         ret = rpc_receive_common (req, &frame, &state, NULL, &args,
d1681e
                                   xdr_gfs3_finodelk_req,
d1681e
                                   GF_FOP_FINODELK);
d1681e
@@ -5378,6 +5362,7 @@ server3_3_finodelk (rpcsvc_request_t *req)
d1681e
         resolve_and_resume (frame, server_finodelk_resume);
d1681e
 out:
d1681e
         free (args.xdata.xdata_val);
d1681e
+        free (args.volume);
d1681e
 
d1681e
         free (args.flock.lk_owner.lk_owner_val);
d1681e
 
d1681e
@@ -5400,9 +5385,6 @@ server3_3_entrylk (rpcsvc_request_t *req)
d1681e
         if (!req)
d1681e
                 return ret;
d1681e
 
d1681e
-        args.volume = alloca (256);
d1681e
-        args.name   = alloca (256);
d1681e
-
d1681e
         ret = rpc_receive_common (req, &frame, &state, NULL, &args,
d1681e
                                   xdr_gfs3_entrylk_req,
d1681e
                                   GF_FOP_ENTRYLK);
d1681e
@@ -5430,6 +5412,8 @@ server3_3_entrylk (rpcsvc_request_t *req)
d1681e
         resolve_and_resume (frame, server_entrylk_resume);
d1681e
 out:
d1681e
         free (args.xdata.xdata_val);
d1681e
+        free (args.volume);
d1681e
+        free (args.name);
d1681e
 
d1681e
         if (op_errno)
d1681e
                 SERVER_REQ_SET_ERROR (req, ret);
d1681e
@@ -5449,9 +5433,6 @@ server3_3_fentrylk (rpcsvc_request_t *req)
d1681e
         if (!req)
d1681e
                 return ret;
d1681e
 
d1681e
-        args.name   = alloca (256);
d1681e
-        args.volume = alloca (256);
d1681e
-
d1681e
         ret = rpc_receive_common (req, &frame, &state, NULL, &args,
d1681e
                                   xdr_gfs3_fentrylk_req,
d1681e
                                   GF_FOP_FENTRYLK);
d1681e
@@ -5479,6 +5460,8 @@ server3_3_fentrylk (rpcsvc_request_t *req)
d1681e
         resolve_and_resume (frame, server_fentrylk_resume);
d1681e
 out:
d1681e
         free (args.xdata.xdata_val);
d1681e
+        free (args.volume);
d1681e
+        free (args.name);
d1681e
 
d1681e
         if (op_errno)
d1681e
                 SERVER_REQ_SET_ERROR (req, ret);
d1681e
@@ -5539,9 +5522,6 @@ server3_3_symlink (rpcsvc_request_t *req)
d1681e
         if (!req)
d1681e
                 return ret;
d1681e
 
d1681e
-        args.bname    = alloca (req->msg[0].iov_len);
d1681e
-        args.linkname = alloca (4096);
d1681e
-
d1681e
         ret = rpc_receive_common (req, &frame, &state, NULL, &args,
d1681e
                                   xdr_gfs3_symlink_req, GF_FOP_SYMLINK);
d1681e
         if (ret != 0) {
d1681e
@@ -5570,6 +5550,8 @@ out:
d1681e
 
d1681e
         /* memory allocated by libc, don't use GF_FREE */
d1681e
         free (args.xdata.xdata_val);
d1681e
+        free (args.linkname);
d1681e
+        free (args.bname);
d1681e
 
d1681e
         return ret;
d1681e
 }
d1681e
@@ -5588,8 +5570,6 @@ server3_3_link (rpcsvc_request_t *req)
d1681e
         if (!req)
d1681e
                 return ret;
d1681e
 
d1681e
-        args.newbname = alloca (req->msg[0].iov_len);
d1681e
-
d1681e
         ret = rpc_receive_common (req, &frame, &state, NULL, &args,
d1681e
                                   xdr_gfs3_link_req, GF_FOP_LINK);
d1681e
         if (ret != 0) {
d1681e
@@ -5614,6 +5594,7 @@ server3_3_link (rpcsvc_request_t *req)
d1681e
         resolve_and_resume (frame, server_link_resume);
d1681e
 out:
d1681e
         free (args.xdata.xdata_val);
d1681e
+        free (args.newbname);
d1681e
 
d1681e
         if (op_errno)
d1681e
                 SERVER_REQ_SET_ERROR (req, ret);
d1681e
@@ -5634,9 +5615,6 @@ server3_3_rename (rpcsvc_request_t *req)
d1681e
         if (!req)
d1681e
                 return ret;
d1681e
 
d1681e
-        args.oldbname = alloca (req->msg[0].iov_len);
d1681e
-        args.newbname = alloca (req->msg[0].iov_len);
d1681e
-
d1681e
         ret = rpc_receive_common (req, &frame, &state, NULL, &args,
d1681e
                                   xdr_gfs3_rename_req, GF_FOP_RENAME);
d1681e
         if (ret != 0) {
d1681e
@@ -5663,6 +5641,8 @@ server3_3_rename (rpcsvc_request_t *req)
d1681e
         resolve_and_resume (frame, server_rename_resume);
d1681e
 out:
d1681e
         free (args.xdata.xdata_val);
d1681e
+        free (args.newbname);
d1681e
+        free (args.oldbname);
d1681e
 
d1681e
         if (op_errno)
d1681e
                 SERVER_REQ_SET_ERROR (req, ret);
d1681e
@@ -5865,9 +5845,6 @@ server3_3_lookup (rpcsvc_request_t *req)
d1681e
 
d1681e
         GF_VALIDATE_OR_GOTO ("server", req, err);
d1681e
 
d1681e
-        args.bname           = alloca (req->msg[0].iov_len);
d1681e
-        args.xdata.xdata_val = alloca (req->msg[0].iov_len);
d1681e
-
d1681e
         ret = rpc_receive_common (req, &frame, &state, NULL, &args,
d1681e
                                   xdr_gfs3_lookup_req, GF_FOP_LOOKUP);
d1681e
         if (ret != 0) {
d1681e
@@ -5896,6 +5873,9 @@ server3_3_lookup (rpcsvc_request_t *req)
d1681e
 
d1681e
         return ret;
d1681e
 out:
d1681e
+        free (args.bname);
d1681e
+        free (args.xdata.xdata_val);
d1681e
+
d1681e
         server_lookup_cbk (frame, NULL, frame->this, -1, EINVAL, NULL, NULL,
d1681e
                            NULL, NULL);
d1681e
 	ret = 0;
d1681e
-- 
d1681e
1.8.3.1
d1681e