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