diff options
| -rw-r--r-- | xlators/cluster/afr/src/afr-dir-write.c | 18 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-common.c | 8 | ||||
| -rw-r--r-- | xlators/protocol/client/src/client-messages.h | 10 | ||||
| -rw-r--r-- | xlators/protocol/client/src/client-rpc-fops.c | 9 | ||||
| -rw-r--r-- | xlators/protocol/server/src/server-rpc-fops.c | 7 | ||||
| -rw-r--r-- | xlators/storage/posix/src/posix.c | 10 | 
6 files changed, 52 insertions, 10 deletions
diff --git a/xlators/cluster/afr/src/afr-dir-write.c b/xlators/cluster/afr/src/afr-dir-write.c index b6b81d737b0..457cc988874 100644 --- a/xlators/cluster/afr/src/afr-dir-write.c +++ b/xlators/cluster/afr/src/afr-dir-write.c @@ -732,13 +732,19 @@ afr_mkdir (call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode,          local->cont.mkdir.mode  = mode;          local->umask = umask; -        if (xdata) -                local->xdata_req = dict_copy_with_ref (xdata, NULL); -	else -		local->xdata_req = dict_new (); +        if (!xdata || !dict_get (xdata, "gfid-req")) { +                op_errno = EPERM; +                gf_msg_callingfn (this->name, GF_LOG_WARNING, op_errno, +                                  AFR_MSG_GFID_NULL, "mkdir: %s is received " +                                  "without gfid-req %p", loc->path, xdata); +	        goto out; +        } -	if (!local->xdata_req) -		goto out; +        local->xdata_req = dict_copy_with_ref (xdata, NULL); +        if (!local->xdata_req) { +                op_errno = ENOMEM; +                goto out; +        }          local->op = GF_FOP_MKDIR;          local->transaction.wind   = afr_mkdir_wind; diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index 3dea94d7376..01b6123d1b3 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -7346,6 +7346,14 @@ dht_mkdir (call_frame_t *frame, xlator_t *this,          conf = this->private; +        if (!params || !dict_get (params, "gfid-req")) { +                op_errno = EPERM; +                gf_msg_callingfn (this->name, GF_LOG_WARNING, op_errno, +                                  DHT_MSG_GFID_NULL, "mkdir: %s is received " +                                  "without gfid-req %p", loc->path, params); +                goto err; +        } +          dht_get_du_info (frame, this, loc);          local = dht_local_init (frame, loc, NULL, GF_FOP_MKDIR); diff --git a/xlators/protocol/client/src/client-messages.h b/xlators/protocol/client/src/client-messages.h index a4b391b8331..db27661715b 100644 --- a/xlators/protocol/client/src/client-messages.h +++ b/xlators/protocol/client/src/client-messages.h @@ -45,7 +45,7 @@   */  #define GLFS_PC_BASE                GLFS_MSGID_COMP_PC -#define GLFS_PC_NUM_MESSAGES        63 +#define GLFS_PC_NUM_MESSAGES        65  #define GLFS_PC_MSGID_END           (GLFS_PC_BASE + GLFS_NUM_MESSAGES + 1)  /* Messages with message IDs */  #define glfs_msg_start_x GLFS_PC_BASE, "Invalid: Start of messages" @@ -619,6 +619,14 @@   */  #define PC_MSG_CHILD_STATUS                     (GLFS_PC_BASE + 64) +/*! + * @messageid + * @diagnosis + * @recommendedaction + * + */ +#define PC_MSG_GFID_NULL                       (GLFS_PC_BASE + 65) +  /*------------*/  #define glfs_msg_end_x GLFS_MSGID_END, "Invalid: End of messages" diff --git a/xlators/protocol/client/src/client-rpc-fops.c b/xlators/protocol/client/src/client-rpc-fops.c index e1fee8c7c66..c95a973ec72 100644 --- a/xlators/protocol/client/src/client-rpc-fops.c +++ b/xlators/protocol/client/src/client-rpc-fops.c @@ -4110,6 +4110,15 @@ client3_3_mkdir (call_frame_t *frame, xlator_t *this,          args = data; +        if (!args->xdata || !dict_get (args->xdata, "gfid-req")) { +                op_errno = EPERM; +                gf_msg_callingfn (this->name, GF_LOG_WARNING, op_errno, +                                  PC_MSG_GFID_NULL, "mkdir: %s is received " +                                  "without gfid-req %p", args->loc->path, +                                  args->xdata); +                goto unwind; +        } +          local = mem_get0 (this->local_pool);          if (!local) {                  op_errno = ENOMEM; diff --git a/xlators/protocol/server/src/server-rpc-fops.c b/xlators/protocol/server/src/server-rpc-fops.c index 7056af1d437..b9236705532 100644 --- a/xlators/protocol/server/src/server-rpc-fops.c +++ b/xlators/protocol/server/src/server-rpc-fops.c @@ -491,20 +491,23 @@ server_mkdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          server_state_t      *state      = NULL;          inode_t             *link_inode = NULL;          rpcsvc_request_t    *req        = NULL; +        client_t            *client     = NULL;          GF_PROTOCOL_DICT_SERIALIZE (this, xdata, &rsp.xdata.xdata_val,                                      rsp.xdata.xdata_len, op_errno, out);          state = CALL_STATE (frame); +        client = frame->root->client;          if (op_ret < 0) {                  gf_msg (this->name, fop_log_level (GF_FOP_MKDIR, op_errno),                          op_errno, PS_MSG_DIR_INFO, -                        "%"PRId64": MKDIR %s (%s/%s) ==> (%s)", +                        "%"PRId64": MKDIR %s (%s/%s) client: %s",                          frame->root->unique,                          (state->loc.path) ? state->loc.path : "",                          uuid_utoa (state->resolve.pargfid), -                        state->resolve.bname, strerror (op_errno)); +                        state->resolve.bname, +                     (!client || !client->client_uid) ? "-":client->client_uid);                  goto out;          } diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c index 4f286fda333..b823257d540 100644 --- a/xlators/storage/posix/src/posix.c +++ b/xlators/storage/posix/src/posix.c @@ -1449,7 +1449,8 @@ posix_mkdir (call_frame_t *frame, xlator_t *this,          SET_FS_ID (frame->root->uid, gid); -        op_ret = dict_get_ptr (xdata, "gfid-req", &uuid_req); +        if (xdata) +                op_ret = dict_get_ptr (xdata, "gfid-req", &uuid_req);          if (uuid_req && !gf_uuid_is_null (uuid_req)) {                  op_ret = posix_istat (this, uuid_req, NULL, &stbuf);                  if ((op_ret == 0) && IA_ISDIR (stbuf.ia_type)) { @@ -1470,6 +1471,13 @@ posix_mkdir (call_frame_t *frame, xlator_t *this,                                  loc->path, uuid_utoa (uuid_req),                                  gfid_path ? gfid_path : "<NULL>");                  } +        } else if (!uuid_req && frame->root->pid != GF_SERVER_PID_TRASH) { +                op_ret = -1; +                op_errno = EPERM; +                gf_msg_callingfn (this->name, GF_LOG_WARNING, op_errno, +                        P_MSG_NULL_GFID, "mkdir (%s): is issued without " +                        "gfid-req %p", loc->path, xdata); +                goto out;          }          op_ret = posix_pstat (this, loc->pargfid, par_path, &preparent);  | 
