diff options
39 files changed, 1392 insertions, 630 deletions
diff --git a/cli/src/cli-rpc-ops.c b/cli/src/cli-rpc-ops.c index 8da3fc8aa6c..602267b06a2 100644 --- a/cli/src/cli-rpc-ops.c +++ b/cli/src/cli-rpc-ops.c @@ -8240,8 +8240,8 @@ cli_print_volume_status_tasks (dict_t *dict)          char           *op          = NULL;          char           *task_id_str = NULL;          char           *volname     = NULL; -        char            key[1024]   = {0,}; -        char            task[1024]  = {0,}; +        char            key[64]     = {0,}; +        char            task[32]    = {0,};          char           *brick       = NULL;          ret = dict_get_str (dict, "volname", &volname); @@ -10627,7 +10627,7 @@ gf_cli_generate_snapshot_event (gf_cli_rsp *rsp, dict_t *dict,          char       *auto_delete       = NULL;          char       *snap_activate     = NULL;          char        msg[PATH_MAX]     = {0, }; -        char        option[PATH_MAX]  = {0, }; +        char        option[512]       = {0, };          GF_VALIDATE_OR_GOTO ("cli", dict, out);          GF_VALIDATE_OR_GOTO ("cli", rsp, out); @@ -11846,9 +11846,9 @@ cli_to_glusterd (gf_cli_req *req, call_frame_t *frame,          }          for (i = 0; words[i]; i++) { -                strncat (cmd, words[i], strlen (words[i])); +                strncat (cmd, words[i], len - 1);                  if (words[i+1] != NULL) -                        strncat (cmd, " ", strlen (" ")); +                        strncat (cmd, " ", len - 1);          }          cmd [len - 1] = '\0'; diff --git a/configure.ac b/configure.ac index c20309b232e..627a7a939a6 100644 --- a/configure.ac +++ b/configure.ac @@ -702,9 +702,6 @@ fi  AM_CONDITIONAL([ENABLE_BD_XLATOR], [test x$BUILD_BD_XLATOR = xyes]) -dnl check for old openssl -AC_CHECK_LIB([crypto], CRYPTO_THREADID_set_callback, [AC_DEFINE([HAVE_CRYPTO_THREADID], [1], [use new OpenSSL functions])]) -  AC_CHECK_LIB([ssl], TLS_method, [HAVE_OPENSSL_1_1="yes"], [HAVE_OPENSSL_1_1="no"])  if test "x$HAVE_OPENSSL_1_1" = "xyes"; then      AC_DEFINE([HAVE_TLS_METHOD], [1], [Using OpenSSL-1.1 TLS_method]) diff --git a/libglusterfs/src/common-utils.c b/libglusterfs/src/common-utils.c index 60725769096..09f0caa7e8a 100644 --- a/libglusterfs/src/common-utils.c +++ b/libglusterfs/src/common-utils.c @@ -3061,8 +3061,9 @@ gf_canonicalize_path (char *path)                  strncpy ((path + path_len + 1), dir, dir_path_len);                  path_len += dir_path_len + 1;                  dir = strtok_r (NULL, "/", &tmpstr); -                if (dir) -                        strncpy ((path + path_len), "/", 1); +                if (dir) { +                        path[path_len] = '/'; +                }          }          path[path_len] = '\0';          ret = 0; diff --git a/libglusterfs/src/statedump.c b/libglusterfs/src/statedump.c index 874326f44ce..21a916ea6b8 100644 --- a/libglusterfs/src/statedump.c +++ b/libglusterfs/src/statedump.c @@ -858,11 +858,16 @@ gf_proc_dump_info (int signum, glusterfs_ctx_t *ctx)          if (ret < 0)                  goto out; -        snprintf (path, sizeof (path), "%s/%s.%d.dump.%"PRIu64, -                  ((dump_options.dump_path != NULL)?dump_options.dump_path: -                   ((ctx->statedump_path != NULL)?ctx->statedump_path: -                    DEFAULT_VAR_RUN_DIRECTORY)), brick_name, getpid(), -                  (uint64_t) time (NULL)); +        ret = snprintf (path, sizeof (path), "%s/%s.%d.dump.%"PRIu64, +                        ((dump_options.dump_path != NULL) +                                ? dump_options.dump_path +                                : ((ctx->statedump_path != NULL) +                                        ? ctx->statedump_path +                                        : DEFAULT_VAR_RUN_DIRECTORY)), +                        brick_name, getpid(), (uint64_t) time (NULL)); +        if ((ret < 0) || (ret >= sizeof(path))) { +                goto out; +        }          snprintf (tmp_dump_name, PATH_MAX, "%s/dumpXXXXXX",                    ((dump_options.dump_path != NULL)?dump_options.dump_path: @@ -939,10 +944,10 @@ gf_proc_dump_info (int signum, glusterfs_ctx_t *ctx)                    timestr);          ret = sys_write (gf_dump_fd, sign_string, strlen (sign_string)); -out:          if (gf_dump_fd != -1)                  gf_proc_dump_close ();          sys_rename (tmp_dump_name, path); +out:          GF_FREE (dump_options.dump_path);          dump_options.dump_path = NULL;          gf_proc_dump_unlock (); diff --git a/libglusterfs/src/statedump.h b/libglusterfs/src/statedump.h index 0a7a97e10d4..92246e1e37e 100644 --- a/libglusterfs/src/statedump.h +++ b/libglusterfs/src/statedump.h @@ -41,13 +41,18 @@ __attribute__ ((__format__ (__printf__, 3, 4)))  static inline void  _gf_proc_dump_build_key (char *key, const char *prefix, const char *fmt, ...)  { -        char buf[GF_DUMP_MAX_BUF_LEN] = { 0, };          va_list ap; +        int32_t len; -        va_start(ap, fmt); -        vsnprintf(buf, GF_DUMP_MAX_BUF_LEN, fmt, ap); -        va_end(ap); -        snprintf(key, GF_DUMP_MAX_BUF_LEN, "%s.%s", prefix, buf); +        len = snprintf(key, GF_DUMP_MAX_BUF_LEN, "%s.", prefix); +        if (len >= 0) { +                va_start(ap, fmt); +                len = vsnprintf(key + len, GF_DUMP_MAX_BUF_LEN - len, fmt, ap); +                va_end(ap); +        } +        if (len < 0) { +                *key = 0; +        }  }  #define gf_proc_dump_build_key(key, key_prefix, fmt...)                 \ diff --git a/rpc/rpc-lib/src/xdr-rpc.h b/rpc/rpc-lib/src/xdr-rpc.h index 5560e89328f..9f0e78a0fc1 100644 --- a/rpc/rpc-lib/src/xdr-rpc.h +++ b/rpc/rpc-lib/src/xdr-rpc.h @@ -75,7 +75,7 @@ xdr_to_auth_unix_cred (char *msgbuf, int msglen, struct authunix_parms *au,  #define rpc_call_verf_len(call)         (rpc_opaque_auth_len ((&(call)->ru.RM_cmb.cb_verf))) -#if defined(GF_DARWIN_HOST_OS) || defined (IPV6_DEFAULT) +#if defined(GF_DARWIN_HOST_OS) || !defined (HAVE_RPC_RPC_H)  #define GF_PRI_RPC_XID          PRIu32  #define GF_PRI_RPC_VERSION      PRIu32  #define GF_PRI_RPC_PROG_ID      PRIu32 diff --git a/rpc/rpc-transport/socket/src/socket.c b/rpc/rpc-transport/socket/src/socket.c index 34bdbdea9d0..3d0e22b88f9 100644 --- a/rpc/rpc-transport/socket/src/socket.c +++ b/rpc/rpc-transport/socket/src/socket.c @@ -4128,6 +4128,7 @@ out:  } +#if OPENSSL_VERSION_NUMBER < 0x1010000f  static pthread_mutex_t  *lock_array     = NULL;  static void @@ -4140,7 +4141,7 @@ locking_func (int mode, int type, const char *file, int line)          }  } -#if HAVE_CRYPTO_THREADID +#if OPENSSL_VERSION_NUMBER >= 0x1000000f  static void  threadid_func (CRYPTO_THREADID *id)  { @@ -4163,15 +4164,15 @@ legacy_threadid_func (void)          /* See comments above, it applies here too. */          return (unsigned long)pthread_self();  } -#endif +#endif /* OPENSSL_VERSION_NUMBER >= 0x1000000f */ +#endif /* OPENSSL_VERSION_NUMBER < 0x1010000f */  static void  init_openssl_mt (void)  { -        int     num_locks       = CRYPTO_num_locks(); -        int     i; +        static gf_boolean_t initialized = _gf_false; -        if (lock_array) { +        if (initialized) {                  /* this only needs to be initialized once GLOBALLY no                     matter how many translators/sockets we end up with. */                  return; @@ -4180,25 +4181,32 @@ init_openssl_mt (void)          SSL_library_init();          SSL_load_error_strings(); +        initialized = _gf_true; + +#if OPENSSL_VERSION_NUMBER < 0x1010000f +        int     num_locks       = CRYPTO_num_locks(); +        int     i; +          lock_array = GF_CALLOC (num_locks, sizeof(pthread_mutex_t),                                  gf_sock_mt_lock_array);          if (lock_array) {                  for (i = 0; i < num_locks; ++i) {                          pthread_mutex_init (&lock_array[i], NULL);                  } -#if HAVE_CRYPTO_THREADID +#if OPENSSL_VERSION_NUMBER >= 0x1000000f                  CRYPTO_THREADID_set_callback (threadid_func);  #else /* older openssl */                  CRYPTO_set_id_callback (legacy_threadid_func);  #endif                  CRYPTO_set_locking_callback (locking_func);          } - +#endif  }  static void __attribute__((destructor))  fini_openssl_mt (void)  { +#if OPENSSL_VERSION_NUMBER < 0x1010000f          int i;          if (!lock_array) { @@ -4206,7 +4214,7 @@ fini_openssl_mt (void)          }          CRYPTO_set_locking_callback(NULL); -#if HAVE_CRYPTO_THREADID +#if OPENSSL_VERSION_NUMBER >= 0x1000000f          CRYPTO_THREADID_set_callback (NULL);  #else /* older openssl */          CRYPTO_set_id_callback (NULL); @@ -4218,6 +4226,7 @@ fini_openssl_mt (void)          GF_FREE (lock_array);          lock_array = NULL; +#endif          ERR_free_strings();  } diff --git a/xlators/cluster/dht/src/tier.c b/xlators/cluster/dht/src/tier.c index 5fa50a26d80..e4294f4fda9 100644 --- a/xlators/cluster/dht/src/tier.c +++ b/xlators/cluster/dht/src/tier.c @@ -1690,7 +1690,7 @@ tier_migrate_files_using_qfile (migration_args_t *comp,          int ret                                 = -1;          tier_brick_list_t *local_brick          = NULL;          tier_brick_list_t *temp                 = NULL; -        char query_file_path_err[PATH_MAX+128]  = {0,}; +        char query_file_path_err[PATH_MAX]      = {0,};          struct tm tm                            = {0,};          gfdb_time_t current_time                = {0,};          char time_str[128]                      = {0,}; @@ -1698,6 +1698,7 @@ tier_migrate_files_using_qfile (migration_args_t *comp,          int count                               = 0;          int temp_fd                             = 0;          gf_tier_conf_t  *tier_conf              = NULL; +        int32_t len                             = 0;          tier_conf = &(query_cbk_args->defrag->tier_conf); @@ -1762,14 +1763,17 @@ out:                  list_for_each_entry_safe (local_brick, temp, comp->brick_list,                                          list) {                          /* rename error qfile*/ -                        snprintf (query_file_path_err, -                                  sizeof (query_file_path_err), -                                  "%s-%s.err", local_brick->qfile_path, -                                  time_str); -                        if (sys_rename (local_brick->qfile_path, -                                        query_file_path_err) == -1) -                                gf_msg_debug ("tier", 0, "rename " -                                              "failed"); +                        len = snprintf (query_file_path_err, +                                        sizeof (query_file_path_err), +                                        "%s-%s.err", local_brick->qfile_path, +                                        time_str); +                        if ((len >= 0) && +                            (len < sizeof(query_file_path_err))) { +                                if (sys_rename (local_brick->qfile_path, +                                                query_file_path_err) == -1) +                                        gf_msg_debug ("tier", 0, "rename " +                                                      "failed"); +                        }                  }          } @@ -2118,6 +2122,7 @@ tier_get_bricklist (xlator_t *xl, struct list_head *local_bricklist_head)          char                    db_name[PATH_MAX] = "";          int                     ret = 0;          tier_brick_list_t       *local_brick = NULL; +        int32_t                 len = 0;          GF_VALIDATE_OR_GOTO ("tier", xl, out);          GF_VALIDATE_OR_GOTO ("tier", local_bricklist_head, out); @@ -2155,12 +2160,20 @@ tier_get_bricklist (xlator_t *xl, struct list_head *local_bricklist_head)                                          DHT_MSG_LOG_TIER_STATUS,                                          "Failed to allocate memory for"                                          " bricklist."); +                                ret = -1;                                  goto out;                          } -                        snprintf(local_brick->brick_db_path, -                                PATH_MAX, "%s/%s/%s", rv, -                                GF_HIDDEN_PATH, db_name); +                        len = snprintf(local_brick->brick_db_path, +                                       PATH_MAX, "%s/%s/%s", rv, +                                       GF_HIDDEN_PATH, db_name); +                        if ((len < 0) || (len >= PATH_MAX)) { +                                gf_msg ("tier", GF_LOG_ERROR, EINVAL, +                                        DHT_MSG_LOG_TIER_STATUS, +                                        "DB path too long"); +                                ret = -1; +                                goto out; +                        }                          local_brick->xlator = xl; diff --git a/xlators/debug/trace/src/trace.c b/xlators/debug/trace/src/trace.c index be2f84d936f..ec14a6dbb1b 100644 --- a/xlators/debug/trace/src/trace.c +++ b/xlators/debug/trace/src/trace.c @@ -22,9 +22,9 @@  static void  trace_stat_to_str(struct iatt *buf, char *str, size_t len)  { -        char     atime_buf[256]    = {0,}; -        char     mtime_buf[256]    = {0,}; -        char     ctime_buf[256]    = {0,}; +        char     atime_buf[200]    = {0,}; +        char     mtime_buf[200]    = {0,}; +        char     ctime_buf[200]    = {0,};          if (!buf)                  return; @@ -80,9 +80,9 @@ trace_create_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                    struct iatt *preparent, struct iatt *postparent,                    dict_t *xdata)  { -        char          statstr[4096]       = {0, }; -        char          preparentstr[4096]  = {0, }; -        char          postparentstr[4096] = {0, }; +        char          statstr[1024]       = {0, }; +        char          preparentstr[1024]  = {0, }; +        char          postparentstr[1024] = {0, };          trace_conf_t  *conf               = NULL;          conf = this->private; @@ -155,7 +155,7 @@ trace_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                  int32_t op_ret, int32_t op_errno, struct iatt *buf,                  dict_t *xdata)  { -        char          statstr[4096] = {0, }; +        char          statstr[1024] = {0, };          trace_conf_t  *conf         = NULL;          conf = this->private; @@ -166,18 +166,18 @@ trace_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                  char string[4096] = {0,};                  if (op_ret == 0) {                          TRACE_STAT_TO_STR (buf, statstr); -                        snprintf (string, sizeof (string), -                                  "%"PRId64": gfid=%s op_ret=%d buf=%s", -                                  frame->root->unique, -                                  uuid_utoa (frame->local), op_ret, -                                  statstr); +                        (void)snprintf (string, sizeof (string), +                                        "%"PRId64": gfid=%s op_ret=%d buf=%s", +                                        frame->root->unique, +                                        uuid_utoa (frame->local), op_ret, +                                        statstr);                  } else { -                        snprintf (string, sizeof (string), -                                  "%"PRId64": gfid=%s op_ret=%d, " -                                  "op_errno=%d)", -                                  frame->root->unique, -                                  uuid_utoa (frame->local), op_ret, -                                  op_errno); +                        (void)snprintf (string, sizeof (string), +                                        "%"PRId64": gfid=%s op_ret=%d, " +                                        "op_errno=%d)", +                                        frame->root->unique, +                                        uuid_utoa (frame->local), op_ret, +                                        op_errno);                  }                  LOG_ELEMENT (conf, string);          } @@ -192,7 +192,7 @@ trace_readv_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                   int32_t count, struct iatt *buf, struct iobref *iobref,                   dict_t *xdata)  { -        char          statstr[4096] = {0, }; +        char          statstr[1024] = {0, };          trace_conf_t  *conf         = NULL;          conf = this->private; @@ -229,8 +229,8 @@ trace_writev_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                    int32_t op_ret, int32_t op_errno,                    struct iatt *prebuf, struct iatt *postbuf, dict_t *xdata)  { -        char         preopstr[4096]  = {0, }; -        char         postopstr[4096] = {0, }; +        char         preopstr[1024]  = {0, }; +        char         postopstr[1024] = {0, };          trace_conf_t *conf           = NULL;          conf = this->private; @@ -295,7 +295,7 @@ trace_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                      dict_t *xdata)  {          int             count         = 0; -        char            statstr[4096] = {0,}; +        char            statstr[1024] = {0,};          char            string[4096]  = {0,};          trace_conf_t   *conf          = NULL;          gf_dirent_t    *entry         = NULL; @@ -334,8 +334,8 @@ trace_fsync_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                   int32_t op_ret, int32_t op_errno,                   struct iatt *prebuf, struct iatt *postbuf, dict_t *xdata)  { -        char          preopstr[4096]  = {0, }; -        char          postopstr[4096] = {0, }; +        char          preopstr[1024]  = {0, }; +        char          postopstr[1024] = {0, };          trace_conf_t  *conf           = NULL;          conf = this->private; @@ -375,8 +375,8 @@ trace_setattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                     int32_t op_ret, int32_t op_errno,                     struct iatt *statpre, struct iatt *statpost, dict_t *xdata)  { -        char          preopstr[4096]  = {0, }; -        char          postopstr[4096] = {0, }; +        char          preopstr[1024]  = {0, }; +        char          postopstr[1024] = {0, };          trace_conf_t  *conf           = NULL;          conf = this->private; @@ -414,8 +414,8 @@ trace_fsetattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                      int32_t op_ret, int32_t op_errno,                      struct iatt *statpre, struct iatt *statpost, dict_t *xdata)  { -        char          preopstr[4096]  = {0, }; -        char          postopstr[4096] = {0, }; +        char          preopstr[1024]  = {0, }; +        char          postopstr[1024] = {0, };          trace_conf_t  *conf           = NULL;          conf = this->private; @@ -453,8 +453,8 @@ trace_unlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                    struct iatt *preparent, struct iatt *postparent,                    dict_t *xdata)  { -        char          preparentstr[4096]  = {0, }; -        char          postparentstr[4096] = {0, }; +        char          preparentstr[1024]  = {0, }; +        char          postparentstr[1024] = {0, };          trace_conf_t  *conf               = NULL;          conf = this->private; @@ -498,11 +498,11 @@ trace_rename_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                    struct iatt *prenewparent, struct iatt *postnewparent,                    dict_t *xdata)  { -        char           statstr[4096]          = {0, }; -        char           preoldparentstr[4096]  = {0, }; -        char           postoldparentstr[4096] = {0, }; -        char           prenewparentstr[4096]  = {0, }; -        char           postnewparentstr[4096] = {0, }; +        char           statstr[1024]          = {0, }; +        char           preoldparentstr[1024]  = {0, }; +        char           postoldparentstr[1024] = {0, }; +        char           prenewparentstr[1024]  = {0, }; +        char           postnewparentstr[1024] = {0, };          trace_conf_t   *conf                  = NULL;          conf = this->private; @@ -510,7 +510,7 @@ trace_rename_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          if (!conf->log_file && !conf->log_history)  		goto out;          if (trace_fop_names[GF_FOP_RENAME].enabled) { -                char  string[4096] = {0,}; +                char  string[6044] = {0,};                  if (op_ret == 0) {                          TRACE_STAT_TO_STR (buf, statstr);                          TRACE_STAT_TO_STR (preoldparent, preoldparentstr); @@ -549,7 +549,7 @@ trace_readlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                      int32_t op_ret, int32_t op_errno,                      const char *buf, struct iatt *stbuf, dict_t *xdata)  { -        char          statstr[4096] = {0, }; +        char          statstr[1024] = {0, };          trace_conf_t  *conf         = NULL;          conf = this->private; @@ -588,8 +588,8 @@ trace_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                    inode_t *inode, struct iatt *buf,                    dict_t *xdata, struct iatt *postparent)  { -        char          statstr[4096]       = {0, }; -        char          postparentstr[4096] = {0, }; +        char          statstr[1024]       = {0, }; +        char          postparentstr[1024] = {0, };          trace_conf_t  *conf               = NULL;          conf = this->private; @@ -638,9 +638,9 @@ trace_symlink_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                     struct iatt *preparent, struct iatt *postparent,                     dict_t *xdata)  { -        char          statstr[4096]       = {0, }; -        char          preparentstr[4096]  = {0, }; -        char          postparentstr[4096] = {0, }; +        char          statstr[1024]       = {0, }; +        char          preparentstr[1024]  = {0, }; +        char          postparentstr[1024] = {0, };          trace_conf_t  *conf               = NULL;          conf = this->private; @@ -682,9 +682,9 @@ trace_mknod_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                   inode_t *inode, struct iatt *buf,                   struct iatt *preparent, struct iatt *postparent, dict_t *xdata)  { -        char          statstr[4096]       = {0, }; -        char          preparentstr[4096]  = {0, }; -        char          postparentstr[4096] = {0, }; +        char          statstr[1024]       = {0, }; +        char          preparentstr[1024]  = {0, }; +        char          postparentstr[1024] = {0, };          trace_conf_t  *conf               = NULL;          conf = this->private; @@ -726,9 +726,9 @@ trace_mkdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                   inode_t *inode, struct iatt *buf,                   struct iatt *preparent, struct iatt *postparent, dict_t *xdata)  { -        char          statstr[4096]       = {0, }; -        char          preparentstr[4096]  = {0, }; -        char          postparentstr[4096] = {0, }; +        char          statstr[1024]       = {0, }; +        char          preparentstr[1024]  = {0, }; +        char          postparentstr[1024] = {0, };          trace_conf_t  *conf               = NULL;          conf = this->private; @@ -770,9 +770,9 @@ trace_link_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                  inode_t *inode, struct iatt *buf,                  struct iatt *preparent, struct iatt *postparent, dict_t *xdata)  { -        char          statstr[4096]       = {0, }; -        char          preparentstr[4096]  = {0, }; -        char          postparentstr[4096] = {0, }; +        char          statstr[1024]       = {0, }; +        char          preparentstr[1024]  = {0, }; +        char          postparentstr[1024] = {0, };          trace_conf_t  *conf               = NULL;          conf = this->private; @@ -866,8 +866,8 @@ trace_rmdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                   int32_t op_ret, int32_t op_errno,                   struct iatt *preparent, struct iatt *postparent, dict_t *xdata)  { -        char           preparentstr[4096]  = {0, }; -        char           postparentstr[4096] = {0, }; +        char           preparentstr[1024]  = {0, }; +        char           postparentstr[1024] = {0, };          trace_conf_t   *conf               = NULL;          conf = this->private; @@ -906,8 +906,8 @@ trace_truncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                      int32_t op_ret, int32_t op_errno,                      struct iatt *prebuf, struct iatt *postbuf, dict_t *xdata)  { -        char           preopstr[4096]  = {0, }; -        char           postopstr[4096] = {0, }; +        char           preopstr[1024]  = {0, }; +        char           postopstr[1024] = {0, };          trace_conf_t   *conf           = NULL;          conf = this->private; @@ -1166,8 +1166,8 @@ trace_ftruncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                       int32_t op_ret, int32_t op_errno,                       struct iatt *prebuf, struct iatt *postbuf, dict_t *xdata)  { -        char          prebufstr[4096]  = {0, }; -        char          postbufstr[4096] = {0, }; +        char          prebufstr[1024]  = {0, }; +        char          postbufstr[1024] = {0, };          trace_conf_t  *conf            = NULL;          conf = this->private; @@ -1204,7 +1204,7 @@ int  trace_fstat_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                   int32_t op_ret, int32_t op_errno, struct iatt *buf, dict_t *xdata)  { -        char          statstr[4096] = {0, }; +        char          statstr[1024] = {0, };          trace_conf_t  *conf         = NULL;          conf = this->private; diff --git a/xlators/features/bit-rot/src/bitd/bit-rot-scrub.c b/xlators/features/bit-rot/src/bitd/bit-rot-scrub.c index ee996525f76..e393ae0f64e 100644 --- a/xlators/features/bit-rot/src/bitd/bit-rot-scrub.c +++ b/xlators/features/bit-rot/src/bitd/bit-rot-scrub.c @@ -1750,6 +1750,7 @@ br_collect_bad_objects_of_child (xlator_t *this, br_child_t *child,          char       *entry = NULL;          char       tmp[PATH_MAX]  = {0, };          char       *path = NULL; +        int32_t     len = 0;          ret = dict_get_int32 (child_dict, "count", &count);          if (ret) @@ -1764,8 +1765,11 @@ br_collect_bad_objects_of_child (xlator_t *this, br_child_t *child,                          continue;                  ret = dict_get_str (child_dict, entry, &path); -                snprintf (tmp, PATH_MAX, "%s ==> BRICK: %s\n path: %s", -                          entry, child->brick_path, path); +                len = snprintf (tmp, PATH_MAX, "%s ==> BRICK: %s\n path: %s", +                                entry, child->brick_path, path); +                if ((len < 0) || (len >= PATH_MAX)) { +                        continue; +                }                  snprintf (main_key, PATH_MAX, "quarantine-%d",                            tmp_count); diff --git a/xlators/features/changelog/src/changelog-helpers.c b/xlators/features/changelog/src/changelog-helpers.c index 306287ecd11..8bc994fa417 100644 --- a/xlators/features/changelog/src/changelog-helpers.c +++ b/xlators/features/changelog/src/changelog-helpers.c @@ -629,6 +629,7 @@ htime_open (xlator_t *this,          ssize_t size                    = 0;          struct stat stat_buf            = {0,};          unsigned long record_len        = 0; +        int32_t len                     = 0;          CHANGELOG_FILL_HTIME_DIR(priv->changelog_dir, ht_dir_path); @@ -672,8 +673,12 @@ htime_open (xlator_t *this,          gf_smsg (this->name, GF_LOG_INFO, 0, CHANGELOG_MSG_HTIME_INFO,                   "HTIME_CURRENT",                   "path=%s", ht_file_bname, NULL); -        (void) snprintf (ht_file_path, PATH_MAX, "%s/%s", -                         ht_dir_path, ht_file_bname); +        len = snprintf (ht_file_path, PATH_MAX, "%s/%s", ht_dir_path, +                        ht_file_bname); +        if ((len < 0) || (len >= PATH_MAX)) { +                ret = -1; +                goto out; +        }          /* Open in append mode as existing htime file is used */          flags |= (O_RDWR | O_SYNC | O_APPEND); @@ -763,6 +768,7 @@ htime_create (xlator_t *this,          char ht_file_path[PATH_MAX]         = {0,};          char ht_file_bname[NAME_MAX + 1]    = {0,};          int flags                           = 0; +        int32_t len                         = 0;          gf_smsg (this->name, GF_LOG_INFO, 0,                   CHANGELOG_MSG_HTIME_INFO, "Changelog enable: Creating new " @@ -773,8 +779,12 @@ htime_create (xlator_t *this,          CHANGELOG_FILL_HTIME_DIR(priv->changelog_dir, ht_dir_path);          /* get the htime file name in ht_file_path */ -        (void) snprintf (ht_file_path,PATH_MAX,"%s/%s.%lu",ht_dir_path, +        len = snprintf (ht_file_path, PATH_MAX, "%s/%s.%lu", ht_dir_path,                          HTIME_FILE_NAME, ts); +        if ((len < 0) || (len >= PATH_MAX)) { +                ret = -1; +                goto out; +        }          flags |= (O_CREAT | O_RDWR | O_SYNC);          ht_file_fd = open (ht_file_path, flags, @@ -865,12 +875,16 @@ changelog_snap_open (xlator_t *this,          char buffer[1024]             = {0,};          char c_snap_path[PATH_MAX]    = {0,};          char csnap_dir_path[PATH_MAX] = {0,}; +        int32_t len                   = 0;          CHANGELOG_FILL_CSNAP_DIR(priv->changelog_dir, csnap_dir_path); -        (void) snprintf (c_snap_path, PATH_MAX, -                        "%s/"CSNAP_FILE_NAME, +        len = snprintf (c_snap_path, PATH_MAX, "%s/"CSNAP_FILE_NAME,                          csnap_dir_path); +        if ((len < 0) || (len >= PATH_MAX)) { +                ret = -1; +                goto out; +        }          flags |= (O_CREAT | O_RDWR | O_TRUNC); @@ -2002,8 +2016,12 @@ resolve_pargfid_to_path (xlator_t *this, const uuid_t pgfid,                           priv->changelog_brick);          while (!(__is_root_gfid (pargfid))) { -                snprintf (dir_handle, PATH_MAX, "%s/%02x/%02x/%s", gpath, -                          pargfid[0], pargfid[1], uuid_utoa (pargfid)); +                len = snprintf (dir_handle, PATH_MAX, "%s/%02x/%02x/%s", gpath, +                                pargfid[0], pargfid[1], uuid_utoa (pargfid)); +                if ((len < 0) || (len >= PATH_MAX)) { +                        ret = -1; +                        goto out; +                }                  len = sys_readlink (dir_handle, linkname, PATH_MAX);                  if (len < 0) { @@ -2023,7 +2041,12 @@ resolve_pargfid_to_path (xlator_t *this, const uuid_t pgfid,                                       &saveptr);                  dir_name = strtok_r (NULL, "/", &saveptr); -                snprintf (result, PATH_MAX, "%s/%s", dir_name, pre_dir_name); +                len = snprintf (result, PATH_MAX, "%s/%s", dir_name, +                                pre_dir_name); +                if ((len < 0) || (len >= PATH_MAX)) { +                        ret = -1; +                        goto out; +                }                  strncpy (pre_dir_name, result, sizeof(pre_dir_name));                  gf_uuid_parse (pgfidstr, tmp_gfid); diff --git a/xlators/features/index/src/index.c b/xlators/features/index/src/index.c index f39d901d624..86c21e9aa83 100644 --- a/xlators/features/index/src/index.c +++ b/xlators/features/index/src/index.c @@ -810,6 +810,7 @@ index_entry_create (xlator_t *this, inode_t *inode, char *filename)          char                entry_path[PATH_MAX]            = {0};          index_priv_t       *priv                            = NULL;          index_inode_ctx_t  *ctx                             = NULL; +        int32_t             len                             = 0;          priv = this->private; @@ -841,10 +842,15 @@ index_entry_create (xlator_t *this, inode_t *inode, char *filename)                  ctx->state[ENTRY_CHANGES] = IN;          } +        len = snprintf (entry_path, sizeof(entry_path), "%s/%s", pgfid_path, +                        filename); +        if ((len < 0) || (len >= sizeof(entry_path))) { +                op_errno = EINVAL; +                goto out; +        } +          op_errno = 0; -        snprintf (entry_path, sizeof(entry_path), "%s/%s", pgfid_path, -                  filename);          ret = index_link_to_base (this, entry_path, ENTRY_CHANGES_SUBDIR);  out:          if (op_errno) @@ -860,6 +866,7 @@ index_entry_delete (xlator_t *this, uuid_t pgfid, char *filename)          char                pgfid_path[PATH_MAX]            = {0};          char                entry_path[PATH_MAX]            = {0};          index_priv_t       *priv                            = NULL; +        int32_t             len                             = 0;          priv = this->private; @@ -870,8 +877,12 @@ index_entry_delete (xlator_t *this, uuid_t pgfid, char *filename)          make_gfid_path (priv->index_basepath, ENTRY_CHANGES_SUBDIR, pgfid,                          pgfid_path, sizeof (pgfid_path)); -        snprintf (entry_path, sizeof(entry_path), "%s/%s", pgfid_path, -                  filename); +        len = snprintf (entry_path, sizeof(entry_path), "%s/%s", pgfid_path, +                        filename); +        if ((len < 0) || (len >= sizeof(entry_path))) { +                op_errno = EINVAL; +                goto out; +        }          ret = sys_unlink (entry_path);          if (ret && (errno != ENOENT)) { diff --git a/xlators/mgmt/glusterd/src/glusterd-brick-ops.c b/xlators/mgmt/glusterd/src/glusterd-brick-ops.c index c82bc3158e1..3362f7323c9 100644 --- a/xlators/mgmt/glusterd/src/glusterd-brick-ops.c +++ b/xlators/mgmt/glusterd/src/glusterd-brick-ops.c @@ -783,6 +783,7 @@ glusterd_set_detach_bricks(dict_t *dict, glusterd_volinfo_t *volinfo)          int hot_brick_num = 0;          glusterd_brickinfo_t *brickinfo;          int ret = 0; +        int32_t len = 0;          /* cold tier bricks at tail of list so use reverse iteration */          cds_list_for_each_entry_reverse (brickinfo, &volinfo->bricks, @@ -791,9 +792,12 @@ glusterd_set_detach_bricks(dict_t *dict, glusterd_volinfo_t *volinfo)                  if (brick_num > volinfo->tier_info.cold_brick_count) {                          hot_brick_num++;                          sprintf (key, "brick%d", hot_brick_num); -                        snprintf (value, 256, "%s:%s", -                                  brickinfo->hostname, -                                  brickinfo->path); +                        len = snprintf (value, sizeof(value), "%s:%s", +                                        brickinfo->hostname, +                                        brickinfo->path); +                        if ((len < 0) || (len >= sizeof(value))) { +                                return -1; +                        }                          ret = dict_set_str (dict, key, strdup(value));                          if (ret) @@ -1677,6 +1681,7 @@ glusterd_op_stage_add_brick (dict_t *dict, char **op_errstr, dict_t *rsp_dict)          char                                    *str_ret = NULL;          gf_boolean_t                            is_force = _gf_false;          glusterd_conf_t                         *conf = NULL; +        uint32_t                                 len = 0;          this = THIS;          GF_ASSERT (this); @@ -1778,10 +1783,14 @@ glusterd_op_stage_add_brick (dict_t *dict, char **op_errstr, dict_t *rsp_dict)                                  continue;                          if (brickinfo->status == GF_BRICK_STOPPED) {                                  ret = -1; -                                snprintf (msg, sizeof (msg), "Brick %s is down," -                                          " changing replica count needs all " -                                          "the bricks to be up to avoid data " -                                          "loss", brickinfo->path); +                                len = snprintf (msg, sizeof (msg), "Brick %s " +                                                "is down, changing replica " +                                                "count needs all the bricks " +                                                "to be up to avoid data loss", +                                                brickinfo->path); +                                if (len < 0) { +                                        strcpy(msg, "<error>"); +                                }                                  gf_msg (THIS->name, GF_LOG_ERROR, 0,                                          GD_MSG_BRICK_ADD_FAIL, "%s", msg);                                  *op_errstr = gf_strdup (msg); diff --git a/xlators/mgmt/glusterd/src/glusterd-geo-rep.c b/xlators/mgmt/glusterd/src/glusterd-geo-rep.c index fa40674510f..5a5d4ec2540 100644 --- a/xlators/mgmt/glusterd/src/glusterd-geo-rep.c +++ b/xlators/mgmt/glusterd/src/glusterd-geo-rep.c @@ -941,6 +941,7 @@ gsyncd_getpidfile (char *master, char *slave, char *pidfile,          int                 ret                      = -1;          struct stat         stbuf                    = {0,};          xlator_t            *this                    = NULL; +        int32_t             len                      = 0;          this = THIS;          GF_ASSERT (this); @@ -953,8 +954,11 @@ gsyncd_getpidfile (char *master, char *slave, char *pidfile,          GF_VALIDATE_OR_GOTO ("gsync", master, out);          GF_VALIDATE_OR_GOTO ("gsync", slave, out); -        snprintf (temp_conf_path, sizeof(temp_conf_path) - 1, -                  "%s/"GSYNC_CONF_TEMPLATE, priv->workdir); +        len = snprintf (temp_conf_path, sizeof(temp_conf_path), +                        "%s/"GSYNC_CONF_TEMPLATE, priv->workdir); +        if ((len < 0) || (len >= sizeof(temp_conf_path))) { +                goto out; +        }          ret = sys_lstat (conf_path, &stbuf);          if (!ret) { @@ -2417,6 +2421,7 @@ glusterd_op_stage_copy_file (dict_t *dict, char **op_errstr)          char             workdir[PATH_MAX]      = {0,};          char             realpath_filename[PATH_MAX] = {0,};          char             realpath_workdir[PATH_MAX]  = {0,}; +        int32_t          len                    = 0;          this = THIS;          GF_ASSERT (this); @@ -2458,13 +2463,20 @@ glusterd_op_stage_copy_file (dict_t *dict, char **op_errstr)                          *op_errstr = gf_strdup ("command unsuccessful");                          goto out;                  } -                snprintf (abs_filename, sizeof(abs_filename), -                          "%s/%s", priv->workdir, filename); +                len = snprintf (abs_filename, sizeof(abs_filename), +                                "%s/%s", priv->workdir, filename); +                if ((len < 0) || (len >= sizeof(abs_filename))) { +                        ret = -1; +                        goto out; +                }                  if (!realpath (priv->workdir, realpath_workdir)) { -                        snprintf (errmsg, sizeof (errmsg), "Failed to get " -                                  "realpath of %s: %s", priv->workdir, -                                  strerror (errno)); +                        len = snprintf (errmsg, sizeof (errmsg), "Failed to " +                                        "get realpath of %s: %s", +                                        priv->workdir, strerror (errno)); +                        if (len < 0) { +                                strcpy(errmsg, "<error>"); +                        }                          *op_errstr = gf_strdup (errmsg);                          ret = -1;                          goto out; @@ -2481,12 +2493,21 @@ glusterd_op_stage_copy_file (dict_t *dict, char **op_errstr)                  /* Add Trailing slash to workdir, without slash strncmp                     will succeed for /var/lib/glusterd_bad */ -                snprintf (workdir, sizeof(workdir), "%s/", realpath_workdir); +                len = snprintf (workdir, sizeof(workdir), "%s/", +                                realpath_workdir); +                if ((len < 0) || (len >= sizeof(workdir))) { +                        ret = -1; +                        goto out; +                }                  /* Protect against file copy outside $workdir */                  if (strncmp (workdir, realpath_filename, strlen (workdir))) { -                        snprintf (errmsg, sizeof (errmsg), "Source file" -                                  " is outside of %s directory", priv->workdir); +                        len = snprintf (errmsg, sizeof (errmsg), "Source file" +                                        " is outside of %s directory", +                                        priv->workdir); +                        if (len < 0) { +                                strcpy(errmsg, "<error>"); +                        }                          *op_errstr = gf_strdup (errmsg);                          ret = -1;                          goto out; @@ -2494,8 +2515,12 @@ glusterd_op_stage_copy_file (dict_t *dict, char **op_errstr)                  ret = sys_lstat (abs_filename, &stbuf);                  if (ret) { -                        snprintf (errmsg, sizeof (errmsg), "Source file" -                                  " does not exist in %s", priv->workdir); +                        len = snprintf (errmsg, sizeof (errmsg), "Source file" +                                        " does not exist in %s", +                                        priv->workdir); +                        if (len < 0) { +                                strcpy(errmsg, "<error>"); +                        }                          *op_errstr = gf_strdup (errmsg);                          goto out;                  } @@ -2532,6 +2557,7 @@ glusterd_get_statefile_name (glusterd_volinfo_t *volinfo, char *slave,          int              ret                      = -1;          struct stat      stbuf                    = {0,};          xlator_t        *this                     = NULL; +        int32_t          len                      = 0;          this = THIS;          GF_ASSERT (this); @@ -2552,8 +2578,11 @@ glusterd_get_statefile_name (glusterd_volinfo_t *volinfo, char *slave,          priv = THIS->private; -        snprintf (temp_conf_path, sizeof(temp_conf_path) - 1, -                  "%s/"GSYNC_CONF_TEMPLATE, priv->workdir); +        len = snprintf (temp_conf_path, sizeof(temp_conf_path), +                        "%s/"GSYNC_CONF_TEMPLATE, priv->workdir); +        if ((len < 0) || (len >= sizeof(temp_conf_path))) { +                goto out; +        }          ret = sys_lstat (conf_path, &stbuf);          if (!ret) { @@ -3028,6 +3057,7 @@ glusterd_op_stage_gsync_create (dict_t *dict, char **op_errstr)          char                     *slave_user                = NULL;          char                     *save_ptr                  = NULL;          char                     *slave_url_buf             = NULL; +        int32_t                   len                       = 0;          this = THIS;          GF_ASSERT (this); @@ -3157,23 +3187,33 @@ glusterd_op_stage_gsync_create (dict_t *dict, char **op_errstr)                  ret = dict_get_int32 (dict, "push_pem", &is_pem_push);                  if (!ret && is_pem_push) {                          ret = snprintf (common_pem_file, -                                        sizeof(common_pem_file) - 1, +                                        sizeof(common_pem_file),                                          "%s"GLUSTERD_COMMON_PEM_PUB_FILE,                                          conf->workdir); -                        common_pem_file[ret] = '\0'; +                        if ((ret < 0) || (ret >= sizeof(common_pem_file))) { +                                ret = -1; +                                goto out; +                        } -                        ret = snprintf (hook_script, sizeof(hook_script) - 1, +                        ret = snprintf (hook_script, sizeof(hook_script),                                          "%s"GLUSTERD_CREATE_HOOK_SCRIPT,                                          conf->workdir); -                        hook_script[ret] = '\0'; +                        if ((ret < 0) || (ret >= sizeof(hook_script))) { +                                ret = -1; +                                goto out; +                        }                          ret = sys_lstat (common_pem_file, &stbuf);                          if (ret) { -                                snprintf (errmsg, sizeof (errmsg), "%s" -                                          " required for push-pem is" -                                          " not present. Please run" -                                          " \"gluster system:: execute" -                                          " gsec_create\"", common_pem_file); +                                len = snprintf (errmsg, sizeof (errmsg), "%s" +                                                " required for push-pem is" +                                                " not present. Please run" +                                                " \"gluster system:: execute" +                                                " gsec_create\"", +                                                common_pem_file); +                                if (len < 0) { +                                        strcpy(errmsg, "<error>"); +                                }                                  gf_msg (this->name, GF_LOG_ERROR, ENOENT,                                          GD_MSG_FILE_OP_FAILED,                                          "%s", errmsg); @@ -3184,11 +3224,15 @@ glusterd_op_stage_gsync_create (dict_t *dict, char **op_errstr)                          ret = sys_lstat (hook_script, &stbuf);                          if (ret) { -                                snprintf (errmsg, sizeof (errmsg), -                                          "The hook-script (%s) required " -                                          "for push-pem is not present. " -                                          "Please install the hook-script " -                                          "and retry", hook_script); +                                len = snprintf (errmsg, sizeof (errmsg), +                                                "The hook-script (%s) " +                                                "required for push-pem is not " +                                                "present. Please install the " +                                                "hook-script and retry", +                                                hook_script); +                                if (len < 0) { +                                        strcpy(errmsg, "<error>"); +                                }                                  gf_msg (this->name, GF_LOG_ERROR, ENOENT,                                          GD_MSG_FILE_OP_FAILED, "%s", errmsg);                                  *op_errstr = gf_strdup (errmsg); @@ -3197,11 +3241,15 @@ glusterd_op_stage_gsync_create (dict_t *dict, char **op_errstr)                          }                          if (!S_ISREG(stbuf.st_mode)) { -                                snprintf (errmsg, sizeof (errmsg), "%s" -                                          " required for push-pem is" -                                          " not a regular file. Please run" -                                          " \"gluster system:: execute" -                                          " gsec_create\"", common_pem_file); +                                len = snprintf (errmsg, sizeof (errmsg), "%s" +                                                " required for push-pem is" +                                                " not a regular file. Please" +                                                " run \"gluster system:: " +                                                "execute gsec_create\"", +                                                common_pem_file); +                                if (len < 0) { +                                        strcpy(errmsg, "<error>"); +                                }                                  gf_msg (this->name, GF_LOG_ERROR, 0,                                          GD_MSG_REG_FILE_MISSING, "%s", errmsg);                                  ret = -1; @@ -3314,16 +3362,23 @@ glusterd_op_stage_gsync_create (dict_t *dict, char **op_errstr)                  /* Do the check, only if different slave host/slave user */                  if (is_different_slavehost || is_different_username) { -                        (void) snprintf (old_confpath, sizeof(old_confpath) - 1, -                                         "%s/"GEOREP"/%s_%s_%s/gsyncd.conf", -                                         conf->workdir, volinfo->volname, -                                         slave1.old_slvhost, slave_vol); +                        len = snprintf (old_confpath, sizeof(old_confpath), +                                        "%s/"GEOREP"/%s_%s_%s/gsyncd.conf", +                                        conf->workdir, volinfo->volname, +                                        slave1.old_slvhost, slave_vol); +                        if ((len < 0) || (len >= sizeof(old_confpath))) { +                                ret = -1; +                                goto out; +                        }                          /* construct old slave url with (old) slave host */ -                        (void) snprintf (old_slave_url, -                                         sizeof(old_slave_url) - 1, -                                         "%s::%s", slave1.old_slvhost, -                                         slave_vol); +                        len = snprintf (old_slave_url, sizeof(old_slave_url), +                                        "%s::%s", slave1.old_slvhost, +                                        slave_vol); +                        if ((len < 0) || (len >= sizeof(old_slave_url))) { +                                ret = -1; +                                goto out; +                        }                          ret = glusterd_check_gsync_running_local (volinfo->volname,                                   old_slave_url, old_confpath, &is_running); @@ -4450,6 +4505,7 @@ glusterd_read_status_file (glusterd_volinfo_t *volinfo, char *slave,          glusterd_conf_t        *priv                       = NULL;          struct stat             stbuf                      = {0,};          xlator_t               *this                       = NULL; +        int32_t                 len                        = 0;          this = THIS;          GF_ASSERT (this); @@ -4469,8 +4525,11 @@ glusterd_read_status_file (glusterd_volinfo_t *volinfo, char *slave,          priv = THIS->private; -        snprintf (temp_conf_path, sizeof(temp_conf_path) - 1, -                  "%s/"GSYNC_CONF_TEMPLATE, priv->workdir); +        len = snprintf (temp_conf_path, sizeof(temp_conf_path), +                        "%s/"GSYNC_CONF_TEMPLATE, priv->workdir); +        if ((len < 0) || (len >= sizeof(temp_conf_path))) { +                return -1; +        }          ret = sys_lstat (conf_path, &stbuf);          if (!ret) { @@ -5296,6 +5355,7 @@ glusterd_op_copy_file (dict_t *dict, char **op_errstr)          struct stat      stbuf                  = {0,};          gf_boolean_t     free_contents          = _gf_true;          xlator_t *this = NULL; +        int32_t len = 0;          this = THIS;          GF_ASSERT (this); @@ -5321,15 +5381,22 @@ glusterd_op_copy_file (dict_t *dict, char **op_errstr)                 *op_errstr = gf_strdup ("command unsuccessful");                 goto out;          } -        snprintf (abs_filename, sizeof(abs_filename), -                  "%s/%s", priv->workdir, filename); +        len = snprintf (abs_filename, sizeof(abs_filename), +                        "%s/%s", priv->workdir, filename); +        if ((len < 0) || (len >= sizeof(abs_filename))) { +                ret = -1; +                goto out; +        }          uuid_utoa_r (MY_UUID, uuid_str);          if (!strcmp (uuid_str, host_uuid)) {                  ret = sys_lstat (abs_filename, &stbuf);                  if (ret) { -                        snprintf (errmsg, sizeof (errmsg), "Source file" -                                 " does not exist in %s", priv->workdir); +                        len = snprintf (errmsg, sizeof (errmsg), "Source file " +                                        "does not exist in %s", priv->workdir); +                        if (len < 0) { +                                strcpy(errmsg, "<error>"); +                        }                          *op_errstr = gf_strdup (errmsg);                          gf_msg (this->name, GF_LOG_ERROR, ENOENT,                                  GD_MSG_FILE_OP_FAILED, "%s", errmsg); @@ -5350,8 +5417,11 @@ glusterd_op_copy_file (dict_t *dict, char **op_errstr)                  fd = open (abs_filename, O_RDONLY);                  if (fd < 0) { -                        snprintf (errmsg, sizeof (errmsg), "Unable to open %s", -                                  abs_filename); +                        len = snprintf (errmsg, sizeof (errmsg), +                                        "Unable to open %s", abs_filename); +                        if (len < 0) { +                                strcpy(errmsg, "<error>"); +                        }                          *op_errstr = gf_strdup (errmsg);                          gf_msg (this->name, GF_LOG_ERROR, 0,                                  GD_MSG_FILE_OP_FAILED, @@ -5370,8 +5440,12 @@ glusterd_op_copy_file (dict_t *dict, char **op_errstr)                  } while (ret > 0);                  if (bytes_read != stbuf.st_size) { -                        snprintf (errmsg, sizeof (errmsg), "Unable to read all " -                                  "the data from %s", abs_filename); +                        len = snprintf (errmsg, sizeof (errmsg), +                                        "Unable to read all the data from %s", +                                        abs_filename); +                        if (len < 0) { +                                strcpy(errmsg, "<error>"); +                        }                          *op_errstr = gf_strdup (errmsg);                          gf_msg (this->name, GF_LOG_ERROR, 0, GD_MSG_READ_ERROR,                                  "%s", errmsg); @@ -5446,8 +5520,11 @@ glusterd_op_copy_file (dict_t *dict, char **op_errstr)                  fd = open (abs_filename, O_WRONLY | O_TRUNC | O_CREAT, 0600);                  if (fd < 0) { -                        snprintf (errmsg, sizeof (errmsg), "Unable to open %s", -                                  abs_filename); +                        len = snprintf (errmsg, sizeof (errmsg), +                                        "Unable to open %s", abs_filename); +                        if (len < 0) { +                                strcpy(errmsg, "<error>"); +                        }                          *op_errstr = gf_strdup (errmsg);                          gf_msg (this->name, GF_LOG_ERROR, 0,                                  GD_MSG_FILE_OP_FAILED, "%s", errmsg); @@ -5458,8 +5535,11 @@ glusterd_op_copy_file (dict_t *dict, char **op_errstr)                  bytes_writen = sys_write (fd, contents, contents_size);                  if (bytes_writen != contents_size) { -                        snprintf (errmsg, sizeof (errmsg), "Failed to write" -                                  " to %s", abs_filename); +                        len = snprintf (errmsg, sizeof (errmsg), +                                        "Failed to write to %s", abs_filename); +                        if (len < 0) { +                                strcpy(errmsg, "<error>"); +                        }                          *op_errstr = gf_strdup (errmsg);                          gf_msg (this->name, GF_LOG_ERROR, 0,                                  GD_MSG_FILE_OP_FAILED, "%s", errmsg); @@ -6174,6 +6254,7 @@ glusterd_create_essential_dir_files (glusterd_volinfo_t *volinfo, dict_t *dict,          glusterd_conf_t   *conf             = NULL;          struct stat        stbuf            = {0,};          xlator_t          *this = NULL; +        int32_t            len = 0;          this = THIS;          GF_ASSERT (this); @@ -6198,13 +6279,19 @@ glusterd_create_essential_dir_files (glusterd_volinfo_t *volinfo, dict_t *dict,                  goto out;          } -        ret = snprintf (buf, sizeof(buf) - 1, "%s/"GEOREP"/%s_%s_%s", +        ret = snprintf (buf, sizeof(buf), "%s/"GEOREP"/%s_%s_%s",                          conf->workdir, volinfo->volname, slave_host, slave_vol); -        buf[ret] = '\0'; +        if ((ret < 0) || (ret >= sizeof(buf))) { +                ret = -1; +                goto out; +        }          ret = mkdir_p (buf, 0777, _gf_true);          if (ret) { -                snprintf (errmsg, sizeof (errmsg), "Unable to create %s" -                          ". Error : %s", buf, strerror (errno)); +                len = snprintf (errmsg, sizeof (errmsg), "Unable to create %s" +                                ". Error : %s", buf, strerror (errno)); +                if (len < 0) { +                        strcpy(errmsg, "<error>"); +                }                  *op_errstr = gf_strdup (errmsg);                  gf_msg (this->name, GF_LOG_ERROR, errno, GD_MSG_DIR_OP_FAILED,                          "%s", errmsg); @@ -6213,11 +6300,17 @@ glusterd_create_essential_dir_files (glusterd_volinfo_t *volinfo, dict_t *dict,          ret = snprintf (buf, PATH_MAX, DEFAULT_LOG_FILE_DIRECTORY"/"GEOREP"/%s",                          volinfo->volname); -        buf[ret] = '\0'; +        if ((ret < 0) || (ret >= PATH_MAX)) { +                ret = -1; +                goto out; +        }          ret = mkdir_p (buf, 0777, _gf_true);          if (ret) { -                snprintf (errmsg, sizeof (errmsg), "Unable to create %s" -                          ". Error : %s", buf, strerror (errno)); +                len = snprintf (errmsg, sizeof (errmsg), "Unable to create %s" +                                ". Error : %s", buf, strerror (errno)); +                if (len < 0) { +                        strcpy(errmsg, "<error>"); +                }                  *op_errstr = gf_strdup (errmsg);                  gf_msg (this->name, GF_LOG_ERROR, errno, GD_MSG_DIR_OP_FAILED,                          "%s", errmsg); @@ -6294,6 +6387,7 @@ glusterd_op_gsync_create (dict_t *dict, char **op_errstr, dict_t *rsp_dict)          char               *slave_voluuid             = NULL;          char               *old_slavehost             = NULL;          gf_boolean_t        is_existing_session       = _gf_false; +        int32_t             len                       = 0;          this = THIS;          GF_ASSERT (this); @@ -6307,8 +6401,12 @@ glusterd_op_gsync_create (dict_t *dict, char **op_errstr, dict_t *rsp_dict)          if (ret)                  goto out; -        snprintf (common_pem_file, sizeof(common_pem_file), -                  "%s"GLUSTERD_COMMON_PEM_PUB_FILE, conf->workdir); +        len = snprintf (common_pem_file, sizeof(common_pem_file), +                        "%s"GLUSTERD_COMMON_PEM_PUB_FILE, conf->workdir); +        if ((len < 0) || (len >= sizeof(common_pem_file))) { +                ret = -1; +                goto out; +        }          ret = glusterd_volinfo_find (volname, &volinfo);          if (ret) { @@ -6390,11 +6488,15 @@ glusterd_op_gsync_create (dict_t *dict, char **op_errstr, dict_t *rsp_dict)                  } else                          is_pem_push = 0; -                snprintf(hooks_args, sizeof(hooks_args), -                         "is_push_pem=%d,pub_file=%s,slave_user=%s,slave_ip=%s," -                         "slave_vol=%s,ssh_port=%d", is_pem_push, -                         common_pem_file, slave_user, slave_ip, slave_vol, -                         ssh_port); +                len = snprintf(hooks_args, sizeof(hooks_args), +                               "is_push_pem=%d,pub_file=%s,slave_user=%s," +                               "slave_ip=%s,slave_vol=%s,ssh_port=%d", +                               is_pem_push, common_pem_file, slave_user, +                               slave_ip, slave_vol, ssh_port); +                if ((len < 0) || (len >= sizeof(hooks_args))) { +                        ret = -1; +                        goto out; +                }          } else                  snprintf(hooks_args, sizeof(hooks_args),                           "This argument will stop the hooks script"); @@ -6477,11 +6579,16 @@ create_essentials:                                                 "not present.",                                                 old_working_dir);                          } else { -                                snprintf (errmsg, sizeof (errmsg), -                                          "rename of old working dir %s to " -                                          "new working dir %s failed! Error: %s", -                                          old_working_dir, new_working_dir, -                                          strerror (errno)); +                                len = snprintf (errmsg, sizeof (errmsg), +                                                "rename of old working dir %s " +                                                "to new working dir %s " +                                                "failed! Error: %s", +                                                old_working_dir, +                                                new_working_dir, +                                                strerror (errno)); +                                if (len < 0) { +                                        strcpy(errmsg, "<error>"); +                                }                                  gf_msg (this->name,  GF_LOG_INFO, 0,                                          GD_MSG_FORCE_CREATE_SESSION,                                          "rename of old working dir %s to " diff --git a/xlators/mgmt/glusterd/src/glusterd-gfproxyd-svc-helper.c b/xlators/mgmt/glusterd/src/glusterd-gfproxyd-svc-helper.c index 2949297788f..7098ae27eaf 100644 --- a/xlators/mgmt/glusterd/src/glusterd-gfproxyd-svc-helper.c +++ b/xlators/mgmt/glusterd/src/glusterd-gfproxyd-svc-helper.c @@ -33,10 +33,14 @@ glusterd_svc_build_gfproxyd_socket_filepath (glusterd_volinfo_t *volinfo,  {          char                    sockfilepath[PATH_MAX] = {0,};          char                    rundir[PATH_MAX]       = {0,}; +        int32_t                 len                    = 0;          glusterd_svc_build_gfproxyd_rundir (volinfo, rundir, sizeof (rundir)); -        snprintf (sockfilepath, sizeof (sockfilepath), "%s/run-%s", -                  rundir, uuid_utoa (MY_UUID)); +        len = snprintf (sockfilepath, sizeof (sockfilepath), "%s/run-%s", +                        rundir, uuid_utoa (MY_UUID)); +        if ((len < 0) || (len >= sizeof(sockfilepath))) { +                sockfilepath[0] = 0; +        }          glusterd_set_socket_filepath (sockfilepath, path, path_len);  } diff --git a/xlators/mgmt/glusterd/src/glusterd-gfproxyd-svc.c b/xlators/mgmt/glusterd/src/glusterd-gfproxyd-svc.c index c0b96b10995..9ac649db60d 100644 --- a/xlators/mgmt/glusterd/src/glusterd-gfproxyd-svc.c +++ b/xlators/mgmt/glusterd/src/glusterd-gfproxyd-svc.c @@ -62,6 +62,7 @@ int glusterd_gfproxydsvc_init (glusterd_volinfo_t *volinfo)          glusterd_conn_notify_t  notify             = NULL;          xlator_t               *this               = NULL;          char                    *volfileserver     = NULL; +        int32_t                 len                = 0;          this = THIS;          GF_VALIDATE_OR_GOTO ("glusterd", this, out); @@ -101,7 +102,12 @@ int glusterd_gfproxydsvc_init (glusterd_volinfo_t *volinfo)                  goto out;          }          glusterd_svc_build_gfproxyd_logfile (logfile, logdir, sizeof (logfile)); -        snprintf (volfileid, sizeof (volfileid), "gfproxyd/%s", volinfo->volname); +        len = snprintf (volfileid, sizeof (volfileid), "gfproxyd/%s", +                        volinfo->volname); +        if ((len < 0) || (len >= sizeof(volfileid))) { +                ret = -1; +                goto out; +        }          if (dict_get_str (this->options, "transport.socket.bind-address",                            &volfileserver) != 0) { @@ -264,6 +270,7 @@ glusterd_gfproxydsvc_start (glusterd_svc_t *svc, int flags)          char                 gfproxyd_id[PATH_MAX]      = {0,};          glusterd_volinfo_t  *volinfo                    = NULL;          char                *localtime_logging          = NULL; +        int32_t              len                        = 0;          this = THIS;          GF_VALIDATE_OR_GOTO ("glusterd", this, out); @@ -292,8 +299,12 @@ glusterd_gfproxydsvc_start (glusterd_svc_t *svc, int flags)          runinit (&runner);          if (this->ctx->cmd_args.valgrind) { -                snprintf (valgrind_logfile, PATH_MAX, "%s/valgrind-%s", -                          svc->proc.logdir, svc->proc.logfile); +                len = snprintf (valgrind_logfile, PATH_MAX, "%s/valgrind-%s", +                                svc->proc.logdir, svc->proc.logfile); +                if ((len < 0) || (len >= PATH_MAX)) { +                        ret = -1; +                        goto out; +                }                  runner_add_args (&runner, "valgrind", "--leak-check=full",                                   "--trace-children=yes", "--track-origins=yes", diff --git a/xlators/mgmt/glusterd/src/glusterd-handler.c b/xlators/mgmt/glusterd/src/glusterd-handler.c index dd81887ed1f..b59d3819d95 100644 --- a/xlators/mgmt/glusterd/src/glusterd-handler.c +++ b/xlators/mgmt/glusterd/src/glusterd-handler.c @@ -471,6 +471,7 @@ glusterd_add_volume_detail_to_dict (glusterd_volinfo_t *volinfo,          struct args_pack        pack = {0,};          xlator_t                *this = NULL;          GF_UNUSED int           caps = 0; +        int32_t                 len = 0;          GF_ASSERT (volinfo);          GF_ASSERT (volumes); @@ -654,8 +655,12 @@ glusterd_add_volume_detail_to_dict (glusterd_volinfo_t *volinfo,                  char    brick[1024] = {0,};                  char    brick_uuid[64] = {0,};                  snprintf (key, 256, "volume%d.brick%d", count, i); -                snprintf (brick, 1024, "%s:%s", brickinfo->hostname, -                          brickinfo->path); +                len = snprintf (brick, 1024, "%s:%s", brickinfo->hostname, +                                brickinfo->path); +                if ((len < 0) || (len >= 1024)) { +                        ret = -1; +                        goto out; +                }                  buf = gf_strdup (brick);                  ret = dict_set_dynstr (volumes, key, buf);                  if (ret) diff --git a/xlators/mgmt/glusterd/src/glusterd-handshake.c b/xlators/mgmt/glusterd/src/glusterd-handshake.c index 84dd077af73..35b6bed409e 100644 --- a/xlators/mgmt/glusterd/src/glusterd-handshake.c +++ b/xlators/mgmt/glusterd/src/glusterd-handshake.c @@ -196,6 +196,7 @@ build_volfile_path (char *volume_id, char *path,          xlator_t                *this                   = NULL;          glusterd_volinfo_t      *volinfo                = NULL;          glusterd_conf_t         *priv                   = NULL; +        int32_t                  len                    = 0;          this = THIS;          GF_ASSERT (this); @@ -321,13 +322,18 @@ build_volfile_path (char *volume_id, char *path,                          goto out;                  } -                snprintf (path_prefix, sizeof (path_prefix), "%s/snaps/%s", -                          priv->workdir, volinfo->snapshot->snapname); - +                len = snprintf (path_prefix, sizeof (path_prefix), +                                "%s/snaps/%s", priv->workdir, +                                volinfo->snapshot->snapname);                  volid_ptr = volname;                  /* this is to ensure that volname recvd from                     get_snap_volname_and_volinfo is free'd */                  free_ptr = volname; +                if ((len < 0) || (len >= sizeof(path_prefix))) { +                        ret = -1; +                        goto out; +                } +                  goto gotvolinfo;          } @@ -408,8 +414,12 @@ build_volfile_path (char *volume_id, char *path,                  volid_ptr = volume_id;          } -        snprintf (path_prefix, sizeof (path_prefix), "%s/vols", -                  priv->workdir); +        len = snprintf (path_prefix, sizeof (path_prefix), "%s/vols", +                        priv->workdir); +        if ((len < 0) || (len >= sizeof(path_prefix))) { +                ret = -1; +                goto out; +        }          ret = glusterd_volinfo_find (volid_ptr, &volinfo); diff --git a/xlators/mgmt/glusterd/src/glusterd-hooks.c b/xlators/mgmt/glusterd/src/glusterd-hooks.c index b310bc2a109..914d029ed39 100644 --- a/xlators/mgmt/glusterd/src/glusterd-hooks.c +++ b/xlators/mgmt/glusterd/src/glusterd-hooks.c @@ -80,6 +80,7 @@ glusterd_hooks_create_hooks_directory (char *basedir)                                                             "pre",                                                             "post"};          glusterd_conf_t *priv                           = NULL; +        int32_t len                                     = 0;          priv = THIS->private; @@ -106,8 +107,12 @@ glusterd_hooks_create_hooks_directory (char *basedir)                  if (strlen (cmd_subdir) == 0)                          continue; -                snprintf (path, sizeof (path), "%s/%s", version_dir, -                          cmd_subdir); +                len = snprintf (path, sizeof (path), "%s/%s", version_dir, +                                cmd_subdir); +                if ((len < 0) || (len >= sizeof(path))) { +                        ret = -1; +                        goto out; +                }                  ret = mkdir_p (path, 0777, _gf_true);                  if (ret) {                          gf_msg (THIS->name, GF_LOG_CRITICAL, errno, @@ -119,8 +124,13 @@ glusterd_hooks_create_hooks_directory (char *basedir)                  for (type = GD_COMMIT_HOOK_PRE; type < GD_COMMIT_HOOK_MAX;                       type++) { -                        snprintf (path, sizeof (path), "%s/%s/%s", -                                  version_dir, cmd_subdir, type_subdir[type]); +                        len = snprintf (path, sizeof (path), "%s/%s/%s", +                                        version_dir, cmd_subdir, +                                        type_subdir[type]); +                        if ((len < 0) || (len >= sizeof(path))) { +                                ret = -1; +                                goto out; +                        }                          ret = mkdir_p (path, 0777, _gf_true);                          if (ret) {                                  gf_msg (THIS->name, GF_LOG_CRITICAL, errno, diff --git a/xlators/mgmt/glusterd/src/glusterd-hooks.h b/xlators/mgmt/glusterd/src/glusterd-hooks.h index 7bab6adb626..752e459f89c 100644 --- a/xlators/mgmt/glusterd/src/glusterd-hooks.h +++ b/xlators/mgmt/glusterd/src/glusterd-hooks.h @@ -13,8 +13,14 @@  #include <fnmatch.h>  #define GLUSTERD_GET_HOOKS_DIR(path, version, priv) \ -        snprintf (path, PATH_MAX, "%s/hooks/%d", priv->workdir,\ -                  version); +        do { \ +                int32_t len; \ +                len = snprintf (path, PATH_MAX, "%s/hooks/%d", priv->workdir,\ +                                version); \ +                if (len < 0) { \ +                        path[0] = 0; \ +                } \ +        } while (0)  #define GLUSTERD_HOOK_VER       1 diff --git a/xlators/mgmt/glusterd/src/glusterd-mgmt.c b/xlators/mgmt/glusterd/src/glusterd-mgmt.c index 33d5de45cd5..5b7d782a1e6 100644 --- a/xlators/mgmt/glusterd/src/glusterd-mgmt.c +++ b/xlators/mgmt/glusterd/src/glusterd-mgmt.c @@ -41,6 +41,7 @@ gd_mgmt_v3_collate_errors (struct syncargs *args, int op_ret, int op_errno,          int        is_operrstr_blk   = 0;          char       *err_string       = NULL;          glusterd_peerinfo_t *peerinfo = NULL; +        int32_t len = 0;          this = THIS;          GF_ASSERT (this); @@ -113,8 +114,11 @@ gd_mgmt_v3_collate_errors (struct syncargs *args, int op_ret, int op_errno,                  }                  if (args->errstr) { -                        snprintf (err_str, sizeof(err_str), -                                  "%s\n%s", args->errstr, op_err); +                        len = snprintf (err_str, sizeof(err_str), +                                        "%s\n%s", args->errstr, op_err); +                        if (len < 0) { +                                strcpy(err_str, "<error>"); +                        }                          GF_FREE (args->errstr);                          args->errstr = NULL;                  } else diff --git a/xlators/mgmt/glusterd/src/glusterd-op-sm.c b/xlators/mgmt/glusterd/src/glusterd-op-sm.c index e49b9c720e5..a19d98a51c2 100644 --- a/xlators/mgmt/glusterd/src/glusterd-op-sm.c +++ b/xlators/mgmt/glusterd/src/glusterd-op-sm.c @@ -790,6 +790,7 @@ glusterd_validate_shared_storage (char *key, char *value, char *errstr)          char               hook_script[PATH_MAX]    = "";          xlator_t          *this                     = NULL;          glusterd_conf_t   *conf                     = NULL; +        int32_t            len                      = 0;          this = THIS;          GF_VALIDATE_OR_GOTO ("glusterd", this, out); @@ -818,16 +819,23 @@ glusterd_validate_shared_storage (char *key, char *value, char *errstr)                  goto out;          } -        snprintf (hook_script, sizeof(hook_script), -                  "%s"GLUSTERD_SHRD_STRG_HOOK_SCRIPT, conf->workdir); +        len = snprintf (hook_script, sizeof(hook_script), +                        "%s"GLUSTERD_SHRD_STRG_HOOK_SCRIPT, conf->workdir); +        if ((len < 0) || (len >= sizeof(hook_script))) { +                ret = -1; +                goto out; +        }          ret = sys_access (hook_script, R_OK|X_OK);          if (ret) { -                snprintf (errstr, PATH_MAX, -                          "The hook-script (%s) required " -                          "for this operation is not present. " -                          "Please install the hook-script " -                          "and retry", hook_script); +                len = snprintf (errstr, PATH_MAX, +                                "The hook-script (%s) required " +                                "for this operation is not present. " +                                "Please install the hook-script " +                                "and retry", hook_script); +                if (len < 0) { +                        strncpy(errstr, "<error>", PATH_MAX); +                }                  gf_msg (this->name, GF_LOG_ERROR, ENOENT,                          GD_MSG_FILE_OP_FAILED, "%s", errstr);                  goto out; @@ -2806,6 +2814,7 @@ glusterd_set_shared_storage (dict_t *dict, char *key, char *value,          char          hooks_args[PATH_MAX] = {0, };          char          errstr[PATH_MAX]     = {0, };          xlator_t     *this                 = NULL; +        int32_t       len                  = 0;          this = THIS;          GF_VALIDATE_OR_GOTO ("glusterd", this, out); @@ -2849,13 +2858,17 @@ glusterd_set_shared_storage (dict_t *dict, char *key, char *value,          }          if (is_origin_glusterd (dict)) { -                snprintf(hooks_args, sizeof(hooks_args), -                         "is_originator=1,local_node_hostname=%s", -                         local_node_hostname); +                len = snprintf(hooks_args, sizeof(hooks_args), +                               "is_originator=1,local_node_hostname=%s", +                               local_node_hostname);          } else { -                snprintf(hooks_args, sizeof(hooks_args), -                         "is_originator=0,local_node_hostname=%s", -                         local_node_hostname); +                len = snprintf(hooks_args, sizeof(hooks_args), +                               "is_originator=0,local_node_hostname=%s", +                               local_node_hostname); +        } +        if ((len < 0) || (len >= sizeof(hooks_args))) { +                ret = -1; +                goto out;          }          ret = dict_set_dynstr_with_alloc (dict, "hooks_args", hooks_args); @@ -3402,6 +3415,7 @@ _add_remove_bricks_to_dict (dict_t *dict, glusterd_volinfo_t *volinfo,          char            dict_key[1024] ={0,};          char            *brick = NULL;          xlator_t        *this = NULL; +        int32_t          len = 0;          GF_ASSERT (dict);          GF_ASSERT (volinfo); @@ -3440,8 +3454,12 @@ _add_remove_bricks_to_dict (dict_t *dict, glusterd_volinfo_t *volinfo,                  }                  memset (dict_key, 0, sizeof (dict_key)); -                snprintf (dict_key, sizeof (dict_key), "%s.%s", prefix, -                          brick_key); +                len = snprintf (dict_key, sizeof (dict_key), "%s.%s", prefix, +                                brick_key); +                if ((len < 0) || (len >= sizeof(dict_key))) { +                        ret = -1; +                        goto out; +                }                  ret = dict_set_str (dict, dict_key, brick);                  if (ret) {                          gf_msg (this->name, GF_LOG_ERROR, 0, @@ -5300,9 +5318,10 @@ glusterd_op_commit_hook (glusterd_op_t op, dict_t *op_ctx,          glusterd_conf_t *priv                   = NULL;          char            hookdir[PATH_MAX]       = {0, };          char            scriptdir[PATH_MAX]     = {0, }; -        char            type_subdir[256]        = {0, }; +        char            *type_subdir            = "";          char            *cmd_subdir             = NULL;          int             ret                     = -1; +        int32_t         len                     = 0;          priv = THIS->private;          switch (type) { @@ -5312,10 +5331,10 @@ glusterd_op_commit_hook (glusterd_op_t op, dict_t *op_ctx,                          break;                  case GD_COMMIT_HOOK_PRE: -                        strcpy (type_subdir, "pre"); +                        type_subdir = "pre";                          break;                  case GD_COMMIT_HOOK_POST: -                        strcpy (type_subdir, "post"); +                        type_subdir = "post";                          break;          } @@ -5324,8 +5343,11 @@ glusterd_op_commit_hook (glusterd_op_t op, dict_t *op_ctx,                  return -1;          GLUSTERD_GET_HOOKS_DIR (hookdir, GLUSTERD_HOOK_VER, priv); -        snprintf (scriptdir, sizeof (scriptdir), "%s/%s/%s", -                  hookdir, cmd_subdir, type_subdir); +        len = snprintf (scriptdir, sizeof (scriptdir), "%s/%s/%s", +                        hookdir, cmd_subdir, type_subdir); +        if ((len < 0) || (len >= sizeof(scriptdir))) { +                return -1; +        }          switch (type) {                  case GD_COMMIT_HOOK_NONE: @@ -6981,7 +7003,7 @@ fill_shd_status_for_local_bricks (dict_t *dict, glusterd_volinfo_t *volinfo,                                    dict_t *req_dict)  {          glusterd_brickinfo_t    *brickinfo = NULL; -        char                    msg[1024] = {0,}; +        char                    *msg = "self-heal-daemon is not running on";          char                    key[1024]  = {0,};          char                    value[1024] = {0,};          int                     ret = 0; @@ -6989,7 +7011,6 @@ fill_shd_status_for_local_bricks (dict_t *dict, glusterd_volinfo_t *volinfo,          int                     cmd_replica_index = -1;          this = THIS; -        snprintf (msg, sizeof (msg), "self-heal-daemon is not running on");          if (type == PER_HEAL_XL) {                  cmd_replica_index = get_replica_index_for_per_replica_cmd diff --git a/xlators/mgmt/glusterd/src/glusterd-quota.c b/xlators/mgmt/glusterd/src/glusterd-quota.c index 6231fe3a7f4..847c1a721d0 100644 --- a/xlators/mgmt/glusterd/src/glusterd-quota.c +++ b/xlators/mgmt/glusterd/src/glusterd-quota.c @@ -249,6 +249,7 @@ _glusterd_quota_initiate_fs_crawl (glusterd_conf_t *priv,          runner_t                   runner              = {0};          char                      *volfileserver       = NULL;          FILE                      *pidfp               = NULL; +        int32_t                    len                 = 0;          GF_VALIDATE_OR_GOTO ("glusterd", THIS, out); @@ -272,16 +273,25 @@ _glusterd_quota_initiate_fs_crawl (glusterd_conf_t *priv,          }          GLUSTERD_REMOVE_SLASH_FROM_PATH (brick->path, brickpath); -        snprintf (logfile, sizeof (logfile), -                  DEFAULT_QUOTA_CRAWL_LOG_DIRECTORY"/%s.log", -                  brickpath); +        len = snprintf (logfile, sizeof (logfile), +                        DEFAULT_QUOTA_CRAWL_LOG_DIRECTORY"/%s.log", +                        brickpath); +        if ((len < 0) || (len >= sizeof(vol_id))) { +                ret = -1; +                goto out; +        }          if (dict_get_str (THIS->options, "transport.socket.bind-address",                            &volfileserver) != 0)                  volfileserver = "localhost"; -        snprintf (vol_id, sizeof (vol_id), "client_per_brick/%s.%s.%s.%s.vol", -                  volinfo->volname, "client", brick->hostname, brickpath); +        len = snprintf (vol_id, sizeof (vol_id), +                        "client_per_brick/%s.%s.%s.%s.vol", volinfo->volname, +                        "client", brick->hostname, brickpath); +        if ((len < 0) || (len >= sizeof(vol_id))) { +                ret = -1; +                goto out; +        }          runinit (&runner); @@ -370,13 +380,15 @@ _glusterd_quota_initiate_fs_crawl (glusterd_conf_t *priv,                          _exit (EXIT_FAILURE);                  } -                snprintf (pidfile, sizeof (pidfile), "%s/%s.pid", pid_dir, -                          brickpath); -                pidfp = fopen (pidfile, "w"); -                if (pidfp) { -                        fprintf (pidfp, "%d\n", runner.chpid); -                        fflush (pidfp); -                        fclose (pidfp); +                len = snprintf (pidfile, sizeof (pidfile), "%s/%s.pid", +                                pid_dir, brickpath); +                if ((len >= 0) && (len < sizeof(pidfile))) { +                        pidfp = fopen (pidfile, "w"); +                        if (pidfp >= 0) { +                                fprintf (pidfp, "%d\n", runner.chpid); +                                fflush (pidfp); +                                fclose (pidfp); +                        }                  }  #ifndef GF_LINUX_HOST_OS @@ -402,6 +414,7 @@ glusterd_stop_all_quota_crawl_service (glusterd_conf_t *priv,          struct dirent              scratch[2]         = {{0,},};          char                       pid_dir[PATH_MAX]  = {0,};          char                       pidfile[PATH_MAX]  = {0,}; +        int32_t                    len                = 0;          GLUSTERD_GET_QUOTA_CRAWL_PIDDIR (pid_dir, volinfo, type); @@ -411,12 +424,13 @@ glusterd_stop_all_quota_crawl_service (glusterd_conf_t *priv,          GF_SKIP_IRRELEVANT_ENTRIES (entry, dir, scratch);          while (entry) { -                snprintf (pidfile, sizeof (pidfile), "%s/%s", -                          pid_dir, entry->d_name); - -                glusterd_service_stop_nolock ("quota_crawl", pidfile, SIGKILL, -                                              _gf_true); -                sys_unlink (pidfile); +                len = snprintf (pidfile, sizeof (pidfile), "%s/%s", +                                pid_dir, entry->d_name); +                if ((len >= 0) && (len < sizeof(pidfile))) { +                        glusterd_service_stop_nolock ("quota_crawl", pidfile, +                                                      SIGKILL, _gf_true); +                        sys_unlink (pidfile); +                }                  GF_SKIP_IRRELEVANT_ENTRIES (entry, dir, scratch);          } diff --git a/xlators/mgmt/glusterd/src/glusterd-snapd-svc-helper.c b/xlators/mgmt/glusterd/src/glusterd-snapd-svc-helper.c index b2e06825c32..8f1630f1871 100644 --- a/xlators/mgmt/glusterd/src/glusterd-snapd-svc-helper.c +++ b/xlators/mgmt/glusterd/src/glusterd-snapd-svc-helper.c @@ -29,10 +29,14 @@ glusterd_svc_build_snapd_socket_filepath (glusterd_volinfo_t *volinfo,  {          char                    sockfilepath[PATH_MAX] = {0,};          char                    rundir[PATH_MAX]       = {0,}; +        int32_t                 len                    = 0;          glusterd_svc_build_snapd_rundir (volinfo, rundir, sizeof (rundir)); -        snprintf (sockfilepath, sizeof (sockfilepath), "%s/run-%s", -                  rundir, uuid_utoa (MY_UUID)); +        len = snprintf (sockfilepath, sizeof (sockfilepath), "%s/run-%s", +                        rundir, uuid_utoa (MY_UUID)); +        if ((len < 0) || (len >= sizeof(sockfilepath))) { +                sockfilepath[0] = 0; +        }          glusterd_set_socket_filepath (sockfilepath, path, path_len);  } diff --git a/xlators/mgmt/glusterd/src/glusterd-snapd-svc.c b/xlators/mgmt/glusterd/src/glusterd-snapd-svc.c index c32a081156e..3c713291f91 100644 --- a/xlators/mgmt/glusterd/src/glusterd-snapd-svc.c +++ b/xlators/mgmt/glusterd/src/glusterd-snapd-svc.c @@ -62,6 +62,7 @@ glusterd_snapdsvc_init (void *data)          glusterd_conn_notify_t  notify             = NULL;          xlator_t               *this               = NULL;          char                    *volfileserver     = NULL; +        int32_t                 len                = 0;          this = THIS;          GF_ASSERT (this); @@ -102,7 +103,12 @@ glusterd_snapdsvc_init (void *data)                  goto out;          }          glusterd_svc_build_snapd_logfile (logfile, logdir, sizeof (logfile)); -        snprintf (volfileid, sizeof (volfileid), "snapd/%s", volinfo->volname); +        len = snprintf (volfileid, sizeof (volfileid), "snapd/%s", +                        volinfo->volname); +        if ((len < 0) || (len >= sizeof(volfileid))) { +                ret = -1; +                goto out; +        }          if (dict_get_str (this->options, "transport.socket.bind-address",                            &volfileserver) != 0) { @@ -227,6 +233,7 @@ glusterd_snapdsvc_start (glusterd_svc_t *svc, int flags)          glusterd_volinfo_t  *volinfo                    = NULL;          glusterd_snapdsvc_t *snapd                      = NULL;          char                *localtime_logging          = NULL; +        int32_t              len                        = 0;          this = THIS;          GF_ASSERT(this); @@ -282,8 +289,12 @@ glusterd_snapdsvc_start (glusterd_svc_t *svc, int flags)          runinit (&runner);          if (this->ctx->cmd_args.valgrind) { -                snprintf (valgrind_logfile, PATH_MAX, "%s/valgrind-snapd.log", -                          svc->proc.logdir); +                len = snprintf (valgrind_logfile, PATH_MAX, +                                "%s/valgrind-snapd.log", svc->proc.logdir); +                if ((len < 0) || (len >= PATH_MAX)) { +                        ret = -1; +                        goto out; +                }                  runner_add_args (&runner, "valgrind", "--leak-check=full",                                   "--trace-children=yes", "--track-origins=yes", diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c b/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c index 340289f74e8..249d99ea3dd 100644 --- a/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c @@ -669,8 +669,8 @@ int32_t  glusterd_add_snap_to_dict (glusterd_snap_t *snap, dict_t *peer_data,                             int32_t snap_count)  { -        char                    buf[NAME_MAX]    = ""; -        char                    prefix[NAME_MAX] = ""; +        char                    buf[64]          = ""; +        char                    prefix[32]       = "";          int32_t                 ret              = -1;          int32_t                 volcount         = 0;          glusterd_volinfo_t     *volinfo          = NULL; @@ -1551,8 +1551,8 @@ int32_t  glusterd_import_friend_snap (dict_t *peer_data, int32_t snap_count,                               char *peer_snap_name, char *peer_snap_id)  { -        char                 buf[NAME_MAX]    = ""; -        char                 prefix[NAME_MAX] = ""; +        char                 buf[64]          = ""; +        char                 prefix[32]       = "";          dict_t              *dict             = NULL;          glusterd_snap_t     *snap             = NULL;          glusterd_volinfo_t  *snap_vol         = NULL; @@ -1792,8 +1792,8 @@ int32_t  glusterd_compare_snap (dict_t *peer_data, int32_t snap_count,                         char *peername, uuid_t peerid)  { -        char              buf[NAME_MAX]    = ""; -        char              prefix[NAME_MAX] = ""; +        char              buf[64]          = ""; +        char              prefix[32]       = "";          char             *peer_snap_name   = NULL;          char             *peer_snap_id     = NULL;          glusterd_snap_t  *snap             = NULL; @@ -1994,8 +1994,8 @@ glusterd_update_snaps_synctask (void *opaque)          int               i                = 1;          xlator_t         *this             = NULL;          dict_t           *peer_data        = NULL; -        char              buf[NAME_MAX]    = ""; -        char              prefix[NAME_MAX] = ""; +        char              buf[64]          = ""; +        char              prefix[32]       = "";          char             *peer_snap_name   = NULL;          char             *peer_snap_id     = NULL;          char             *peername         = NULL; @@ -2205,8 +2205,8 @@ glusterd_add_snapd_to_dict (glusterd_volinfo_t *volinfo,          int             ret                   = -1;          int32_t         pid                   = -1;          int32_t         brick_online          = -1; -        char            key[1024]             = {0}; -        char            base_key[1024]        = {0}; +        char            key[64]               = {0}; +        char            base_key[32]          = {0};          char            pidfile[PATH_MAX]     = {0};          xlator_t        *this                 = NULL; @@ -2433,8 +2433,8 @@ glusterd_merge_brick_status (dict_t *dst, dict_t *src)          int64_t        j                        = 0;          int64_t        brick_count              = 0;          int64_t        brick_order              = 0; -        char           key[PATH_MAX]            = {0, }; -        char           key_prefix[PATH_MAX]     = {0, }; +        char           key[64]                  = {0, }; +        char           key_prefix[16]           = {0, };          char           snapbrckcnt[PATH_MAX]    = {0, };          char           snapbrckord[PATH_MAX]    = {0, };          char          *clonename                = NULL; @@ -2510,7 +2510,7 @@ glusterd_merge_brick_status (dict_t *dst, dict_t *src)                                  goto out;                          } -                        snprintf (key, sizeof (key) - 1, +                        snprintf (key, sizeof (key),                                    "%s%"PRId64".brick%"PRId64".status",                                    key_prefix, index+1, brick_order);                          ret = dict_get_int32 (src, key, &brick_online); @@ -2852,6 +2852,7 @@ glusterd_mount_lvm_snapshot (glusterd_brickinfo_t *brickinfo,          int32_t            ret            = -1;          runner_t           runner         = {0, };          xlator_t          *this           = NULL; +        int32_t            len            = 0;          this = THIS;          GF_ASSERT (this); @@ -2860,8 +2861,11 @@ glusterd_mount_lvm_snapshot (glusterd_brickinfo_t *brickinfo,          runinit (&runner); -        snprintf (msg, sizeof (msg), "mount %s %s", -                  brickinfo->device_path, brick_mount_path); +        len = snprintf (msg, sizeof (msg), "mount %s %s", +                        brickinfo->device_path, brick_mount_path); +        if (len < 0) { +                strcpy(msg, "<error>"); +        }          gf_strncpy (mnt_opts, brickinfo->mnt_opts, sizeof(mnt_opts)); diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot.c b/xlators/mgmt/glusterd/src/glusterd-snapshot.c index 4a4c379cd86..4be89779465 100644 --- a/xlators/mgmt/glusterd/src/glusterd-snapshot.c +++ b/xlators/mgmt/glusterd/src/glusterd-snapshot.c @@ -280,8 +280,11 @@ snap_max_limits_display_commit (dict_t *rsp_dict, char *volname,                                    count);                          ret = dict_set_str (rsp_dict, buf, volinfo->volname);                          if (ret) { -                                snprintf (err_str, PATH_MAX, -                                          "Failed to set %s", buf); +                                len = snprintf (err_str, PATH_MAX, +                                                "Failed to set %s", buf); +                                if (len < 0) { +                                        strcpy(err_str, "<error>"); +                                }                                  goto out;                          } @@ -289,8 +292,11 @@ snap_max_limits_display_commit (dict_t *rsp_dict, char *volname,                                    "volume%"PRId64"-snap-max-hard-limit", count);                          ret = dict_set_uint64 (rsp_dict, buf, snap_max_limit);                          if (ret) { -                                snprintf (err_str, PATH_MAX, -                                          "Failed to set %s", buf); +                                len = snprintf (err_str, PATH_MAX, +                                                "Failed to set %s", buf); +                                if (len < 0) { +                                        strcpy(err_str, "<error>"); +                                }                                  goto out;                          } @@ -299,8 +305,11 @@ snap_max_limits_display_commit (dict_t *rsp_dict, char *volname,                          ret = dict_set_uint64 (rsp_dict, buf,                                                 active_hard_limit);                          if (ret) { -                                snprintf (err_str, PATH_MAX, -                                          "Failed to set %s", buf); +                                len = snprintf (err_str, PATH_MAX, +                                                "Failed to set %s", buf); +                                if (len < 0) { +                                        strcpy(err_str, "<error>"); +                                }                                  goto out;                          } @@ -308,8 +317,11 @@ snap_max_limits_display_commit (dict_t *rsp_dict, char *volname,                                    "volume%"PRId64"-snap-max-soft-limit", count);                          ret = dict_set_uint64 (rsp_dict, buf, soft_limit_value);                          if (ret) { -                                snprintf (err_str, PATH_MAX, -                                          "Failed to set %s", buf); +                                len = snprintf (err_str, PATH_MAX, +                                                "Failed to set %s", buf); +                                if (len < 0) { +                                        strcpy(err_str, "<error>"); +                                }                                  goto out;                          }                          count++; @@ -342,8 +354,11 @@ snap_max_limits_display_commit (dict_t *rsp_dict, char *volname,                  snprintf (buf, sizeof(buf), "volume%"PRId64"-volname", count);                  ret = dict_set_str (rsp_dict, buf, volinfo->volname);                  if (ret) { -                        snprintf (err_str, PATH_MAX, -                                  "Failed to set %s", buf); +                        len = snprintf (err_str, PATH_MAX, +                                        "Failed to set %s", buf); +                        if (len < 0) { +                                strcpy(err_str, "<error>"); +                        }                          goto out;                  } @@ -351,8 +366,11 @@ snap_max_limits_display_commit (dict_t *rsp_dict, char *volname,                            "volume%"PRId64"-snap-max-hard-limit", count);                  ret = dict_set_uint64 (rsp_dict, buf, snap_max_limit);                  if (ret) { -                        snprintf (err_str, PATH_MAX, -                                  "Failed to set %s", buf); +                        len = snprintf (err_str, PATH_MAX, +                                        "Failed to set %s", buf); +                        if (len < 0) { +                                strcpy(err_str, "<error>"); +                        }                          goto out;                  } @@ -360,8 +378,11 @@ snap_max_limits_display_commit (dict_t *rsp_dict, char *volname,                            "volume%"PRId64"-active-hard-limit", count);                  ret = dict_set_uint64 (rsp_dict, buf, active_hard_limit);                  if (ret) { -                        snprintf (err_str, PATH_MAX, -                                  "Failed to set %s", buf); +                        len = snprintf (err_str, PATH_MAX, +                                        "Failed to set %s", buf); +                        if (len < 0) { +                                strcpy(err_str, "<error>"); +                        }                          goto out;                  } @@ -369,8 +390,11 @@ snap_max_limits_display_commit (dict_t *rsp_dict, char *volname,                            "volume%"PRId64"-snap-max-soft-limit", count);                  ret = dict_set_uint64 (rsp_dict, buf, soft_limit_value);                  if (ret) { -                        snprintf (err_str, PATH_MAX, -                                  "Failed to set %s", buf); +                        len = snprintf (err_str, PATH_MAX, +                                        "Failed to set %s", buf); +                        if (len < 0) { +                                strcpy(err_str, "<error>"); +                        }                          goto out;                  } @@ -605,6 +629,7 @@ glusterd_snapshot_backup_vol (glusterd_volinfo_t *volinfo)          char             trashdir[PATH_MAX]    = {0,};          glusterd_conf_t *priv                  = NULL;          xlator_t        *this                  = NULL; +        int32_t          len                   = 0;          this = THIS;          GF_ASSERT (this); @@ -614,12 +639,18 @@ glusterd_snapshot_backup_vol (glusterd_volinfo_t *volinfo)          GLUSTERD_GET_VOLUME_DIR (pathname, volinfo, priv); -        snprintf (delete_path, sizeof (delete_path), -                  "%s/"GLUSTERD_TRASH"/vols-%s.deleted", priv->workdir, -                  volinfo->volname); +        len = snprintf (delete_path, sizeof (delete_path), +                        "%s/"GLUSTERD_TRASH"/vols-%s.deleted", priv->workdir, +                        volinfo->volname); +        if ((len < 0) || (len >= sizeof(delete_path))) { +                goto out; +        } -        snprintf (trashdir, sizeof (trashdir), "%s/"GLUSTERD_TRASH, -                  priv->workdir); +        len = snprintf (trashdir, sizeof (trashdir), "%s/"GLUSTERD_TRASH, +                        priv->workdir); +        if ((len < 0) || (len >= sizeof(delete_path))) { +                goto out; +        }          /* Create trash folder if it is not there */          ret = sys_mkdir (trashdir, 0777); @@ -2110,6 +2141,7 @@ glusterd_snap_create_clone_common_prevalidate (dict_t *rsp_dict, int flags,          xlator_t              *this              = NULL;          glusterd_conf_t       *conf              = NULL;          glusterd_brickinfo_t  *brickinfo         = NULL; +        int32_t                len               = 0;          this = THIS;          conf = this->private; @@ -2170,10 +2202,13 @@ glusterd_snap_create_clone_common_prevalidate (dict_t *rsp_dict, int flags,                  orig_device = glusterd_get_brick_mount_device                                                      (brickinfo->path);                  if (!orig_device) { -                        snprintf (err_str, PATH_MAX, -                                  "getting device name for the brick " -                                 "%s:%s failed", brickinfo->hostname, -                                  brickinfo->path); +                        len = snprintf (err_str, PATH_MAX, +                                        "getting device name for the brick " +                                        "%s:%s failed", brickinfo->hostname, +                                        brickinfo->path); +                        if (len < 0) { +                                strcpy(err_str, "<error>"); +                        }                          ret = -1;                          goto out;                  } @@ -2746,6 +2781,7 @@ glusterd_do_lvm_snapshot_remove (glusterd_volinfo_t *snap_vol,          int                     retry_count       = 0;          char                   *mnt_pt            = NULL;          gf_boolean_t            unmount           = _gf_true; +        int32_t                 len               = 0;          this = THIS;          GF_ASSERT (this); @@ -2834,9 +2870,12 @@ glusterd_do_lvm_snapshot_remove (glusterd_volinfo_t *snap_vol,          }          runinit (&runner); -        snprintf (msg, sizeof(msg), "remove snapshot of the brick %s:%s, " -                  "device: %s", brickinfo->hostname, brickinfo->path, -                  snap_device); +        len = snprintf (msg, sizeof(msg), "remove snapshot of the brick %s:%s, " +                        "device: %s", brickinfo->hostname, brickinfo->path, +                        snap_device); +        if (len < 0) { +                strcpy(msg, "<error>"); +        }          runner_add_args (&runner, LVM_REMOVE, "-f", snap_device, NULL);          runner_log (&runner, "", GF_LOG_DEBUG, msg); @@ -4612,6 +4651,7 @@ glusterd_add_missed_snaps_to_dict (dict_t *rsp_dict,          int32_t                 missed_snap_count               = -1;          int32_t                 ret                             = -1;          xlator_t               *this                            = NULL; +        int32_t                 len                             = 0;          this = THIS;          GF_ASSERT (this); @@ -4625,10 +4665,13 @@ glusterd_add_missed_snaps_to_dict (dict_t *rsp_dict,                  goto out;          } -        snprintf (missed_snap_entry, sizeof(missed_snap_entry), -                  "%s:%s=%s:%d:%s:%d:%d", uuid_utoa(brickinfo->uuid), -                  snap_uuid, snap_vol->volname, brick_number, brickinfo->path, -                  op, GD_MISSED_SNAP_PENDING); +        len = snprintf (missed_snap_entry, sizeof(missed_snap_entry), +                        "%s:%s=%s:%d:%s:%d:%d", uuid_utoa(brickinfo->uuid), +                        snap_uuid, snap_vol->volname, brick_number, +                        brickinfo->path, op, GD_MISSED_SNAP_PENDING); +        if ((len < 0) || (len >= sizeof(missed_snap_entry))) { +                goto out; +        }          /* Fetch the missed_snap_count from the dict */          ret = dict_get_int32 (rsp_dict, "missed_snap_count", @@ -4767,6 +4810,7 @@ glusterd_snap_brick_create (glusterd_volinfo_t *snap_volinfo,          char             snap_brick_mount_path[PATH_MAX] = "";          char             clone_uuid[64]                  = "";          struct stat      statbuf                         = {0, }; +        int32_t          len                             = 0;          this = THIS; @@ -4775,13 +4819,18 @@ glusterd_snap_brick_create (glusterd_volinfo_t *snap_volinfo,          if (clone) {                  GLUSTERD_GET_UUID_NOHYPHEN(clone_uuid, snap_volinfo->volume_id); -                snprintf (snap_brick_mount_path, sizeof (snap_brick_mount_path), -                          "%s/%s/brick%d",  snap_mount_dir, -                          clone_uuid, brick_count + 1); +                len = snprintf (snap_brick_mount_path, +                                sizeof (snap_brick_mount_path), +                                "%s/%s/brick%d",  snap_mount_dir, clone_uuid, +                                brick_count + 1);          } else { -                snprintf (snap_brick_mount_path, sizeof (snap_brick_mount_path), -                          "%s/%s/brick%d",  snap_mount_dir, -                          snap_volinfo->volname, brick_count + 1); +                len = snprintf (snap_brick_mount_path, +                                sizeof (snap_brick_mount_path), +                               "%s/%s/brick%d",  snap_mount_dir, +                               snap_volinfo->volname, brick_count + 1); +        } +        if ((len < 0) || (len >= sizeof(snap_brick_mount_path))) { +                goto out;          }          ret = mkdir_p (snap_brick_mount_path, 0777, _gf_true); @@ -4864,6 +4913,7 @@ glusterd_add_brick_to_snap_volume (dict_t *dict, dict_t *rsp_dict,          int32_t                 ret                             = -1;          xlator_t               *this                            = NULL;          char                    abspath[PATH_MAX]               = {0}; +        int32_t                 len                             = 0;          this = THIS;          GF_ASSERT (this); @@ -4978,15 +5028,19 @@ glusterd_add_brick_to_snap_volume (dict_t *dict, dict_t *rsp_dict,           */          if (clone) {                  GLUSTERD_GET_UUID_NOHYPHEN(clone_uuid, snap_vol->volume_id); -                snprintf (snap_brick_path, sizeof(snap_brick_path), -                          "%s/%s/brick%d%s", snap_mount_dir, -                          clone_uuid, brick_count+1, -                          snap_brick_dir); +                len = snprintf (snap_brick_path, sizeof(snap_brick_path), +                                "%s/%s/brick%d%s", snap_mount_dir, +                                clone_uuid, brick_count+1, +                                snap_brick_dir);          } else { -                snprintf (snap_brick_path, sizeof(snap_brick_path), -                          "%s/%s/brick%d%s", snap_mount_dir, -                          snap_vol->volname, brick_count+1, -                          snap_brick_dir); +                len = snprintf (snap_brick_path, sizeof(snap_brick_path), +                                "%s/%s/brick%d%s", snap_mount_dir, +                                snap_vol->volname, brick_count+1, +                                snap_brick_dir); +        } +        if ((len < 0) || (len >= sizeof(snap_brick_path))) { +                ret = -1; +                goto out;          }          snprintf (key, sizeof(key), "vol%"PRId64".brick_snapdevice%d", @@ -5070,6 +5124,7 @@ glusterd_update_fs_label (glusterd_brickinfo_t *brickinfo)          uuid_t          uuid                    = {0,};          runner_t        runner                  = {0,};          xlator_t       *this                    = NULL; +        int32_t         len                     = 0;          this = THIS;          GF_ASSERT (this); @@ -5090,8 +5145,11 @@ glusterd_update_fs_label (glusterd_brickinfo_t *brickinfo)                  /* XFS label is of size 12. Therefore we should truncate the                   * label to 12 bytes*/                  label [12] = '\0'; -                snprintf (msg, sizeof (msg), "Changing filesystem label of " -                          "%s brick to %s", brickinfo->path, label); +                len = snprintf (msg, sizeof (msg), "Changing filesystem label " +                                "of %s brick to %s", brickinfo->path, label); +                if (len < 0) { +                        strcpy(msg, "<error>"); +                }                  /* Run the run xfs_admin tool to change the label                   * of the file-system */                  runner_add_args (&runner, "xfs_admin", "-L", label, @@ -5102,8 +5160,11 @@ glusterd_update_fs_label (glusterd_brickinfo_t *brickinfo)                  /* Ext2/Ext3/Ext4 label is of size 16. Therefore we should                   * truncate the label to 16 bytes*/                  label [16] = '\0'; -                snprintf (msg, sizeof (msg), "Changing filesystem label of " -                          "%s brick to %s", brickinfo->path, label); +                len = snprintf (msg, sizeof (msg), "Changing filesystem label " +                                "of %s brick to %s", brickinfo->path, label); +                if (len < 0) { +                        strcpy(msg, "<error>"); +                }                  /* For ext2/ext3/ext4 run tune2fs to change the                   * file-system label */                  runner_add_args (&runner, "tune2fs", "-L", label, @@ -8818,6 +8879,7 @@ glusterd_remove_trashpath (char *volname)          xlator_t               *this                    = NULL;          glusterd_conf_t        *priv                    = NULL;          struct stat             stbuf                   = {0, }; +        int32_t                 len                     = 0;          this = THIS;          GF_ASSERT (this); @@ -8825,9 +8887,12 @@ glusterd_remove_trashpath (char *volname)          GF_ASSERT (volname); -        snprintf (delete_path, sizeof (delete_path), -                  "%s/"GLUSTERD_TRASH"/vols-%s.deleted", priv->workdir, -                  volname); +        len = snprintf (delete_path, sizeof (delete_path), +                        "%s/"GLUSTERD_TRASH"/vols-%s.deleted", priv->workdir, +                        volname); +        if ((len < 0) || (len >= sizeof(delete_path))) { +                goto out; +        }          ret = sys_lstat (delete_path, &stbuf);          if (ret) { @@ -8927,6 +8992,7 @@ glusterd_snapshot_revert_partial_restored_vol (glusterd_volinfo_t *volinfo)          glusterd_volinfo_t     *tmp_vol                 = NULL;          glusterd_conf_t        *priv                    = NULL;          xlator_t               *this                    = NULL; +        int32_t                 len                     = 0;          this = THIS;          GF_ASSERT (this); @@ -8936,9 +9002,13 @@ glusterd_snapshot_revert_partial_restored_vol (glusterd_volinfo_t *volinfo)          GLUSTERD_GET_VOLUME_DIR (pathname, volinfo, priv); -        snprintf (trash_path, sizeof (trash_path), -                  "%s/"GLUSTERD_TRASH"/vols-%s.deleted", priv->workdir, -                  volinfo->volname); +        len = snprintf (trash_path, sizeof (trash_path), +                        "%s/"GLUSTERD_TRASH"/vols-%s.deleted", priv->workdir, +                        volinfo->volname); +        if ((len < 0) || (len >= sizeof(trash_path))) { +                ret = -1; +                goto out; +        }          /* Since snapshot restore failed we cannot rely on the volume           * data stored under vols folder. Therefore delete the origin diff --git a/xlators/mgmt/glusterd/src/glusterd-statedump.c b/xlators/mgmt/glusterd/src/glusterd-statedump.c index d0a97053485..02b6ddc9662 100644 --- a/xlators/mgmt/glusterd/src/glusterd-statedump.c +++ b/xlators/mgmt/glusterd/src/glusterd-statedump.c @@ -20,10 +20,10 @@ static void  glusterd_dump_peer (glusterd_peerinfo_t *peerinfo, char *input_key, int index,                      gf_boolean_t xpeers)  { -        char   subkey[50]               = {0,}; -        char   key[GF_DUMP_MAX_BUF_LEN] = {0,}; +        char   subkey[144] = {0,}; +        char   key[128] = {0,}; -        strncpy (key, input_key, (GF_DUMP_MAX_BUF_LEN - 1)); +        strncpy (key, input_key, sizeof(key) - 1);          snprintf (subkey, sizeof (subkey), "%s%d", key, index); @@ -64,10 +64,10 @@ glusterd_dump_peer_rpcstat (glusterd_peerinfo_t *peerinfo, char *input_key,          int                    ret                                 = -1;          rpc_clnt_t            *rpc                                 = NULL;          char                   rpcsvc_peername[RPCSVC_PEER_STRLEN] = {0,}; -        char                   subkey[50]                          = {0,}; -        char                   key[GF_DUMP_MAX_BUF_LEN]            = {0,}; +        char                   subkey[144]                         = {0,}; +        char                   key[128]                            = {0,}; -        strncpy (key, input_key, (GF_DUMP_MAX_BUF_LEN - 1)); +        strncpy (key, input_key, sizeof(key) - 1);          /* Dump the rpc connection statistics */          rpc = peerinfo->rpc; diff --git a/xlators/mgmt/glusterd/src/glusterd-store.c b/xlators/mgmt/glusterd/src/glusterd-store.c index b6efac5a51a..c42c5ea613e 100644 --- a/xlators/mgmt/glusterd/src/glusterd-store.c +++ b/xlators/mgmt/glusterd/src/glusterd-store.c @@ -291,7 +291,7 @@ gd_store_brick_snap_details_write (int fd, glusterd_brickinfo_t *brickinfo)          int ret = -1;          xlator_t *this = NULL;          glusterd_conf_t *conf = NULL; -        char value[256] = {0,}; +        char value[PATH_MAX] = {0,};          this = THIS;          GF_ASSERT (this != NULL); @@ -640,6 +640,7 @@ glusterd_store_remove_bricks (glusterd_volinfo_t *volinfo, char *delete_path)          struct dirent          scratch[2] = {{0,},};          char                   path[PATH_MAX] = {0,};          char                   brickdir[PATH_MAX] = {0,}; +        int32_t                len = 0;          this = THIS;          GF_ASSERT (this); @@ -655,20 +656,26 @@ glusterd_store_remove_bricks (glusterd_volinfo_t *volinfo, char *delete_path)          priv = this->private;          GF_ASSERT (priv); -        snprintf (brickdir, sizeof (brickdir), "%s/%s", delete_path, -                  GLUSTERD_BRICK_INFO_DIR); +        len = snprintf (brickdir, sizeof (brickdir), "%s/%s", delete_path, +                        GLUSTERD_BRICK_INFO_DIR); +        if ((len < 0) || (len >= sizeof(brickdir))) { +                ret = -1; +                goto out; +        }          dir = sys_opendir (brickdir);          GF_SKIP_IRRELEVANT_ENTRIES (entry, dir, scratch);          while (entry) { -                snprintf (path, sizeof (path), "%s/%s", -                          brickdir, entry->d_name); -                ret = sys_unlink (path); -                if (ret && errno != ENOENT) { -                        gf_msg_debug (this->name, 0, "Unable to unlink %s", -                                      path); +                len = snprintf (path, sizeof (path), "%s/%s", +                                brickdir, entry->d_name); +                if ((len >= 0) && (len < sizeof(path))) { +                        ret = sys_unlink (path); +                        if (ret && errno != ENOENT) { +                                gf_msg_debug (this->name, 0, +                                              "Unable to unlink %s", path); +                        }                  }                  GF_SKIP_IRRELEVANT_ENTRIES (entry, dir, scratch);          } @@ -1846,6 +1853,7 @@ glusterd_store_delete_volume (glusterd_volinfo_t *volinfo)          char             trashdir[PATH_MAX]    = {0,};          xlator_t        *this                  = NULL;          gf_boolean_t     rename_fail           = _gf_false; +        int32_t          len                   = 0;          this = THIS;          GF_ASSERT (this); @@ -1857,12 +1865,20 @@ glusterd_store_delete_volume (glusterd_volinfo_t *volinfo)          GLUSTERD_GET_VOLUME_DIR (pathname, volinfo, priv); -        snprintf (delete_path, sizeof (delete_path), -        "%s/"GLUSTERD_TRASH"/%s.deleted", priv->workdir, -        uuid_utoa (volinfo->volume_id)); +        len = snprintf (delete_path, sizeof (delete_path), +                        "%s/"GLUSTERD_TRASH"/%s.deleted", priv->workdir, +                        uuid_utoa (volinfo->volume_id)); +        if ((len < 0) || (len >= sizeof(delete_path))) { +                ret = -1; +                goto out; +        } -        snprintf (trashdir, sizeof (trashdir), "%s/"GLUSTERD_TRASH, -                  priv->workdir); +        len = snprintf (trashdir, sizeof (trashdir), "%s/"GLUSTERD_TRASH, +                        priv->workdir); +        if ((len < 0) || (len >= sizeof(trashdir))) { +                ret = -1; +                goto out; +        }          ret = sys_mkdir (trashdir, 0777);          if (ret && errno != EEXIST) { @@ -1916,6 +1932,7 @@ glusterd_store_delete_snap (glusterd_snap_t *snap)          struct stat      st                    = {0, };          xlator_t        *this                  = NULL;          gf_boolean_t     rename_fail           = _gf_false; +        int32_t          len                   = 0;          this = THIS;          priv = this->private; @@ -1924,12 +1941,20 @@ glusterd_store_delete_snap (glusterd_snap_t *snap)          GF_ASSERT (snap);          GLUSTERD_GET_SNAP_DIR (pathname, snap, priv); -        snprintf (delete_path, sizeof (delete_path), -        "%s/"GLUSTERD_TRASH"/snap-%s.deleted", priv->workdir, -        uuid_utoa (snap->snap_id)); +        len = snprintf (delete_path, sizeof (delete_path), +                        "%s/"GLUSTERD_TRASH"/snap-%s.deleted", priv->workdir, +                        uuid_utoa (snap->snap_id)); +        if ((len < 0) || (len >= sizeof(delete_path))) { +                ret = -1; +                goto out; +        } -        snprintf (trashdir, sizeof (trashdir), "%s/"GLUSTERD_TRASH, -                  priv->workdir); +        len = snprintf (trashdir, sizeof (trashdir), "%s/"GLUSTERD_TRASH, +                        priv->workdir); +        if ((len < 0) || (len >= sizeof(trashdir))) { +                ret = -1; +                goto out; +        }          ret = sys_mkdir (trashdir, 0777);          if (ret && errno != EEXIST) { @@ -1959,7 +1984,12 @@ glusterd_store_delete_snap (glusterd_snap_t *snap)          GF_SKIP_IRRELEVANT_ENTRIES (entry, dir, scratch);          while (entry) { -                snprintf (path, PATH_MAX, "%s/%s", delete_path, entry->d_name); +                len = snprintf (path, PATH_MAX, "%s/%s", delete_path, +                                entry->d_name); +                if ((len < 0) || (len >= PATH_MAX)) { +                        ret = -1; +                        goto stat_failed; +                }                  ret = sys_stat (path, &st);                  if (ret == -1) {                          gf_msg_debug (this->name, 0, "Failed to stat " @@ -2022,6 +2052,7 @@ glusterd_store_global_info (xlator_t *this)          char                    path[PATH_MAX]          = {0,};          gf_store_handle_t       *handle                 = NULL;          char                    *uuid_str               = NULL; +        int32_t                  len                    = 0;          conf = this->private; @@ -2030,8 +2061,11 @@ glusterd_store_global_info (xlator_t *this)                  goto out;          if (!conf->handle) { -                snprintf (path, PATH_MAX, "%s/%s", conf->workdir, -                          GLUSTERD_INFO_FILE); +                len = snprintf (path, PATH_MAX, "%s/%s", conf->workdir, +                                GLUSTERD_INFO_FILE); +                if ((len < 0) || (len >= PATH_MAX)) { +                        goto out; +                }                  ret = gf_store_handle_new (path, &handle);                  if (ret) {                          gf_msg (this->name, GF_LOG_ERROR, 0, @@ -2114,12 +2148,16 @@ glusterd_retrieve_op_version (xlator_t *this, int *op_version)          char                    *tmp            = NULL;          char                    path[PATH_MAX]  = {0,};          gf_store_handle_t       *handle         = NULL; +        int32_t                  len            = 0;          priv = this->private;          if (!priv->handle) { -                snprintf (path, PATH_MAX, "%s/%s", priv->workdir, -                          GLUSTERD_INFO_FILE); +                len = snprintf (path, PATH_MAX, "%s/%s", priv->workdir, +                                GLUSTERD_INFO_FILE); +                if ((len < 0) || (len >= PATH_MAX)) { +                        goto out; +                }                  ret = gf_store_handle_retrieve (path, &handle);                  if (ret) { @@ -2167,6 +2205,7 @@ glusterd_retrieve_sys_snap_max_limit (xlator_t *this, uint64_t *limit,          char                    *tmp            = NULL;          char                    path[PATH_MAX]  = {0,};          gf_store_handle_t       *handle         = NULL; +        int32_t                  len            = 0;          GF_ASSERT (this);          priv = this->private; @@ -2176,8 +2215,11 @@ glusterd_retrieve_sys_snap_max_limit (xlator_t *this, uint64_t *limit,          GF_ASSERT (key);          if (!priv->handle) { -                snprintf (path, PATH_MAX, "%s/%s", priv->workdir, -                          GLUSTERD_INFO_FILE); +                len = snprintf (path, PATH_MAX, "%s/%s", priv->workdir, +                                GLUSTERD_INFO_FILE); +                if ((len < 0) || (len >= PATH_MAX)) { +                        goto out; +                }                  ret = gf_store_handle_retrieve (path, &handle);                  if (ret) { @@ -2282,13 +2324,17 @@ glusterd_retrieve_uuid ()          glusterd_conf_t *priv = NULL;          xlator_t        *this = NULL;          char            path[PATH_MAX] = {0,}; +        int32_t         len = 0;          this = THIS;          priv = this->private;          if (!priv->handle) { -                snprintf (path, PATH_MAX, "%s/%s", priv->workdir, -                          GLUSTERD_INFO_FILE); +                len = snprintf (path, PATH_MAX, "%s/%s", priv->workdir, +                                GLUSTERD_INFO_FILE); +                if ((len < 0) || (len >= PATH_MAX)) { +                        goto out; +                }                  ret = gf_store_handle_retrieve (path, &handle);                  if (ret) { @@ -2332,6 +2378,7 @@ glusterd_store_retrieve_snapd (glusterd_volinfo_t *volinfo)          glusterd_conf_t         *conf                   = NULL;          gf_store_iter_t         *iter                   = NULL;          gf_store_op_errno_t     op_errno                = GD_STORE_SUCCESS; +        int32_t                 len                     = 0;          this = THIS;          GF_ASSERT (this); @@ -2364,8 +2411,11 @@ glusterd_store_retrieve_snapd (glusterd_volinfo_t *volinfo)          GLUSTERD_GET_VOLUME_DIR(volpath, volinfo, conf); -        snprintf (path, sizeof (path), "%s/%s", volpath, -                  GLUSTERD_VOLUME_SNAPD_INFO_FILE); +        len = snprintf (path, sizeof (path), "%s/%s", volpath, +                        GLUSTERD_VOLUME_SNAPD_INFO_FILE); +        if ((len < 0) || (len >= sizeof(path))) { +                goto out; +        }          ret = gf_store_handle_retrieve (path, &volinfo->snapd.handle);          if (ret) { @@ -2438,6 +2488,7 @@ glusterd_store_retrieve_bricks (glusterd_volinfo_t *volinfo)          xlator_t                *this = NULL;          int                      brickid = 0;          gf_store_op_errno_t     op_errno = GD_STORE_SUCCESS; +        int32_t                  len = 0;          GF_ASSERT (volinfo);          GF_ASSERT (volinfo->volname); @@ -2460,11 +2511,14 @@ glusterd_store_retrieve_bricks (glusterd_volinfo_t *volinfo)                  snprintf (tmpkey, sizeof (tmpkey), "%s-%d",                            GLUSTERD_STORE_KEY_VOL_BRICK,brick_count);                  ret = gf_store_iter_get_matching (tmpiter, tmpkey, &tmpvalue); -                snprintf (path, sizeof (path), "%s/%s", brickdir, tmpvalue); - +                len = snprintf (path, sizeof (path), "%s/%s", brickdir, +                                tmpvalue);                  GF_FREE (tmpvalue); -                  tmpvalue = NULL; +                if ((len < 0) || (len >= sizeof(path))) { +                        ret = -1; +                        goto out; +                }                  ret = gf_store_handle_retrieve (path, &brickinfo->shandle); @@ -2674,6 +2728,7 @@ glusterd_store_retrieve_node_state (glusterd_volinfo_t *volinfo)          gf_store_op_errno_t  op_errno          = GD_STORE_SUCCESS;          dict_t              *tmp_dict          = NULL;          xlator_t            *this              = NULL; +        int32_t              len               = 0;          this = THIS;          GF_ASSERT (this); @@ -2682,8 +2737,11 @@ glusterd_store_retrieve_node_state (glusterd_volinfo_t *volinfo)          GF_ASSERT (volinfo);          GLUSTERD_GET_VOLUME_DIR(volpath, volinfo, priv); -        snprintf (path, sizeof (path), "%s/%s", volpath, -                  GLUSTERD_NODE_STATE_FILE); +        len = snprintf (path, sizeof (path), "%s/%s", volpath, +                        GLUSTERD_NODE_STATE_FILE); +        if ((len < 0) || (len >= PATH_MAX)) { +                goto out; +        }          ret = gf_store_handle_retrieve (path, &volinfo->node_state_shandle);          if (ret) @@ -2846,6 +2904,7 @@ glusterd_store_update_volinfo (glusterd_volinfo_t *volinfo)          glusterd_conf_t         *conf                   = NULL;          gf_store_iter_t         *iter                   = NULL;          gf_store_op_errno_t     op_errno                = GD_STORE_SUCCESS; +        int32_t                 len                     = 0;          this = THIS;          GF_ASSERT (this); @@ -2854,8 +2913,11 @@ glusterd_store_update_volinfo (glusterd_volinfo_t *volinfo)          GLUSTERD_GET_VOLUME_DIR(volpath, volinfo, conf); -        snprintf (path, sizeof (path), "%s/%s", volpath, -                  GLUSTERD_VOLUME_INFO_FILE); +        len = snprintf (path, sizeof (path), "%s/%s", volpath, +                        GLUSTERD_VOLUME_INFO_FILE); +        if ((len < 0) || (len >= sizeof(path))) { +                goto out; +        }          ret = gf_store_handle_retrieve (path, &volinfo->shandle);          if (ret) { @@ -3332,6 +3394,7 @@ glusterd_store_retrieve_volumes (xlator_t  *this, glusterd_snap_t *snap)          glusterd_volinfo_t    *volinfo          = NULL;          struct stat            st               = {0,};          char                   entry_path[PATH_MAX]   = {0,}; +        int32_t                len              = 0;          GF_ASSERT (this);          priv = this->private; @@ -3339,11 +3402,14 @@ glusterd_store_retrieve_volumes (xlator_t  *this, glusterd_snap_t *snap)          GF_ASSERT (priv);          if (snap) -                snprintf (path, PATH_MAX, "%s/snaps/%s", priv->workdir, -                          snap->snapname); +                len = snprintf (path, PATH_MAX, "%s/snaps/%s", priv->workdir, +                                snap->snapname);          else -                snprintf (path, PATH_MAX, "%s/%s", priv->workdir, -                          GLUSTERD_VOLUME_DIR_PREFIX); +                len = snprintf (path, PATH_MAX, "%s/%s", priv->workdir, +                                GLUSTERD_VOLUME_DIR_PREFIX); +        if ((len < 0) || (len >= PATH_MAX)) { +                goto out; +        }          dir = sys_opendir (path); @@ -3360,7 +3426,12 @@ glusterd_store_retrieve_volumes (xlator_t  *this, glusterd_snap_t *snap)                               (!strcmp (entry->d_name, "info"))))                          goto next; -                snprintf (entry_path, PATH_MAX, "%s/%s", path, entry->d_name); +                len = snprintf (entry_path, PATH_MAX, "%s/%s", path, +                                entry->d_name); +                if ((len < 0) || (len >= PATH_MAX)) { +                        ret = -1; +                        goto next; +                }                  ret = sys_lstat (entry_path, &st);                  if (ret == -1) {                          gf_msg (this->name, GF_LOG_ERROR, 0, @@ -3678,6 +3749,7 @@ glusterd_store_update_snap (glusterd_snap_t *snap)          glusterd_conf_t         *conf                   = NULL;          gf_store_iter_t         *iter                   = NULL;          gf_store_op_errno_t     op_errno                = GD_STORE_SUCCESS; +        int32_t                 len                     = 0;          this = THIS;          conf = this->private; @@ -3685,8 +3757,11 @@ glusterd_store_update_snap (glusterd_snap_t *snap)          GLUSTERD_GET_SNAP_DIR (snappath, snap, conf); -        snprintf (path, sizeof (path), "%s/%s", snappath, -                  GLUSTERD_SNAP_INFO_FILE); +        len = snprintf (path, sizeof (path), "%s/%s", snappath, +                        GLUSTERD_SNAP_INFO_FILE); +        if ((len < 0) || (len >= sizeof(path))) { +                goto out; +        }          ret = gf_store_handle_retrieve (path, &snap->shandle);          if (ret) { @@ -3918,13 +3993,18 @@ glusterd_store_retrieve_snaps (xlator_t  *this)          DIR                   *dir              = NULL;          struct dirent         *entry            = NULL;          struct dirent          scratch[2]       = {{0,},}; +        int32_t                len              = 0;          GF_ASSERT (this);          priv = this->private;          GF_ASSERT (priv); -        snprintf (path, PATH_MAX, "%s/snaps", priv->workdir); +        len = snprintf (path, PATH_MAX, "%s/snaps", priv->workdir); +        if ((len < 0) || (len >= PATH_MAX)) { +                ret = -1; +                goto out; +        }          dir = sys_opendir (path); @@ -4093,6 +4173,7 @@ glusterd_store_delete_peerinfo (glusterd_peerinfo_t *peerinfo)          char                            peerdir[PATH_MAX] = {0,};          char                            filepath[PATH_MAX] = {0,};          char                            hostname_path[PATH_MAX] = {0,}; +        int32_t                         len = 0;          if (!peerinfo) { @@ -4103,24 +4184,34 @@ glusterd_store_delete_peerinfo (glusterd_peerinfo_t *peerinfo)          this = THIS;          priv = this->private; -        snprintf (peerdir, PATH_MAX, "%s/peers", priv->workdir); - +        len = snprintf (peerdir, PATH_MAX, "%s/peers", priv->workdir); +        if ((len < 0) || (len >= PATH_MAX)) { +                goto out; +        }          if (gf_uuid_is_null (peerinfo->uuid)) {                  if (peerinfo->hostname) { -                        snprintf (filepath, PATH_MAX, "%s/%s", peerdir, -                                  peerinfo->hostname); +                        len = snprintf (filepath, PATH_MAX, "%s/%s", peerdir, +                                        peerinfo->hostname); +                        if ((len < 0) || (len >= PATH_MAX)) { +                                goto out; +                        }                  } else {                         ret = 0;                         goto out;                  }          } else { - -                snprintf (filepath, PATH_MAX, "%s/%s", peerdir, -                          uuid_utoa (peerinfo->uuid)); -                snprintf (hostname_path, PATH_MAX, "%s/%s", -                          peerdir, peerinfo->hostname); +                len = snprintf (filepath, PATH_MAX, "%s/%s", peerdir, +                                uuid_utoa (peerinfo->uuid)); +                if ((len < 0) || (len >= PATH_MAX)) { +                        goto out; +                } +                len = snprintf (hostname_path, PATH_MAX, "%s/%s", +                                peerdir, peerinfo->hostname); +                if ((len < 0) || (len >= PATH_MAX)) { +                        goto out; +                }                  ret = sys_unlink (hostname_path); @@ -4362,14 +4453,19 @@ glusterd_store_retrieve_peers (xlator_t *this)          glusterd_peer_hostname_t *address            = NULL;          uuid_t                    tmp_uuid;          gf_boolean_t              is_ok; +        int32_t                   len;          GF_ASSERT (this);          priv = this->private;          GF_ASSERT (priv); -        snprintf (path, PATH_MAX, "%s/%s", priv->workdir, -                  GLUSTERD_PEER_DIR_PREFIX); +        len = snprintf (path, PATH_MAX, "%s/%s", priv->workdir, +                        GLUSTERD_PEER_DIR_PREFIX); +        if ((len < 0) || (len >= PATH_MAX)) { +                ret = -1; +                goto out; +        }          dir = sys_opendir (path); @@ -4392,7 +4488,11 @@ glusterd_store_retrieve_peers (xlator_t *this)                          continue;                  }                  is_ok = _gf_false; -                snprintf (filepath, PATH_MAX, "%s/%s", path, entry->d_name); +                len = snprintf (filepath, PATH_MAX, "%s/%s", path, +                                entry->d_name); +                if ((len < 0) || (len >= PATH_MAX)) { +                        goto next; +                }                  ret = gf_store_handle_retrieve (filepath, &shandle);                  if (ret)                          goto next; @@ -4751,6 +4851,7 @@ glusterd_store_retrieve_quota_version (glusterd_volinfo_t *volinfo)          xlator_t           *this                 = NULL;          glusterd_conf_t    *conf                 = NULL;          gf_store_handle_t  *handle               = NULL; +        int32_t             len                  = 0;          this = THIS;          GF_ASSERT (this); @@ -4758,8 +4859,11 @@ glusterd_store_retrieve_quota_version (glusterd_volinfo_t *volinfo)          GF_ASSERT (conf);          GLUSTERD_GET_VOLUME_DIR (path, volinfo, conf); -        snprintf (cksum_path, sizeof (cksum_path), "%s/%s", path, -                  GLUSTERD_VOL_QUOTA_CKSUM_FILE); +        len = snprintf (cksum_path, sizeof (cksum_path), "%s/%s", path, +                        GLUSTERD_VOL_QUOTA_CKSUM_FILE); +        if ((len < 0) || (len >= sizeof(cksum_path))) { +                goto out; +        }          ret = gf_store_handle_new (cksum_path, &handle);          if (ret) { @@ -4803,13 +4907,17 @@ glusterd_store_save_quota_version_and_cksum (glusterd_volinfo_t *volinfo)          char                            buf[256] = {0};          int                             fd = -1;          int32_t                         ret = -1; +        int32_t                         len = 0;          this = THIS;          conf = this->private;          GLUSTERD_GET_VOLUME_DIR (path, volinfo, conf); -        snprintf (cksum_path, sizeof (cksum_path), "%s/%s", path, -                  GLUSTERD_VOL_QUOTA_CKSUM_FILE); +        len = snprintf (cksum_path, sizeof (cksum_path), "%s/%s", path, +                        GLUSTERD_VOL_QUOTA_CKSUM_FILE); +        if ((len < 0) || (len >= sizeof(cksum_path))) { +                goto out; +        }          ret = gf_store_handle_new (cksum_path, &shandle);          if (ret) diff --git a/xlators/mgmt/glusterd/src/glusterd-svc-mgmt.c b/xlators/mgmt/glusterd/src/glusterd-svc-mgmt.c index ebb288c7191..fcf8e666d3e 100644 --- a/xlators/mgmt/glusterd/src/glusterd-svc-mgmt.c +++ b/xlators/mgmt/glusterd/src/glusterd-svc-mgmt.c @@ -153,6 +153,7 @@ glusterd_svc_start (glusterd_svc_t *svc, int flags, dict_t *cmdline)          char                *localtime_logging          = NULL;          char                *log_level                  = NULL;          char                 daemon_log_level[30]       = {0}; +        int32_t              len                        = 0;          this = THIS;          GF_ASSERT (this); @@ -176,8 +177,13 @@ glusterd_svc_start (glusterd_svc_t *svc, int flags, dict_t *cmdline)          runinit (&runner);          if (this->ctx->cmd_args.valgrind) { -                snprintf (valgrind_logfile, PATH_MAX, "%s/valgrind-%s.log", -                          svc->proc.logfile, svc->name); +                len = snprintf (valgrind_logfile, PATH_MAX, +                                "%s/valgrind-%s.log", svc->proc.logfile, +                                svc->name); +                if ((len < 0) || (len >= PATH_MAX)) { +                        ret = -1; +                        goto out; +                }                  runner_add_args (&runner, "valgrind", "--leak-check=full",                                   "--trace-children=yes", "--track-origins=yes", diff --git a/xlators/mgmt/glusterd/src/glusterd-tier.c b/xlators/mgmt/glusterd/src/glusterd-tier.c index 264e36295a8..446cb33ff11 100644 --- a/xlators/mgmt/glusterd/src/glusterd-tier.c +++ b/xlators/mgmt/glusterd/src/glusterd-tier.c @@ -1113,7 +1113,7 @@ glusterd_add_tierd_to_dict (glusterd_volinfo_t *volinfo,          int32_t         pid                   = -1;          int32_t         brick_online          = -1;          char            key[1024]             = {0}; -        char            base_key[1024]        = {0}; +        char            base_key[32]          = {0};          char            pidfile[PATH_MAX]     = {0};          xlator_t        *this                 = NULL; diff --git a/xlators/mgmt/glusterd/src/glusterd-tierd-svc-helper.c b/xlators/mgmt/glusterd/src/glusterd-tierd-svc-helper.c index b555a1a9ccb..42cf8968429 100644 --- a/xlators/mgmt/glusterd/src/glusterd-tierd-svc-helper.c +++ b/xlators/mgmt/glusterd/src/glusterd-tierd-svc-helper.c @@ -34,10 +34,14 @@ glusterd_svc_build_tierd_socket_filepath (glusterd_volinfo_t *volinfo,  {          char                    sockfilepath[PATH_MAX] = {0,};          char                    rundir[PATH_MAX]       = {0,}; +        int32_t                 len                    = 0;          glusterd_svc_build_tierd_rundir (volinfo, rundir, sizeof (rundir)); -        snprintf (sockfilepath, sizeof (sockfilepath), "%s/run-%s", -                  rundir, uuid_utoa (MY_UUID)); +        len = snprintf (sockfilepath, sizeof (sockfilepath), "%s/run-%s", +                        rundir, uuid_utoa (MY_UUID)); +        if ((len < 0) || (len >= sizeof(sockfilepath))) { +                sockfilepath[0] = 0; +        }          glusterd_set_socket_filepath (sockfilepath, path, path_len);  } diff --git a/xlators/mgmt/glusterd/src/glusterd-tierd-svc.c b/xlators/mgmt/glusterd/src/glusterd-tierd-svc.c index 9adb8462cdb..9ea6f16a74c 100644 --- a/xlators/mgmt/glusterd/src/glusterd-tierd-svc.c +++ b/xlators/mgmt/glusterd/src/glusterd-tierd-svc.c @@ -53,6 +53,7 @@ glusterd_tierdsvc_init (void *data)          glusterd_conn_notify_t  notify             = NULL;          xlator_t               *this               = NULL;          char                    *volfileserver     = NULL; +        int32_t                 len                = 0;          this = THIS;          GF_VALIDATE_OR_GOTO (THIS->name, this, out); @@ -98,7 +99,12 @@ glusterd_tierdsvc_init (void *data)                  goto out;          }          glusterd_svc_build_tierd_logfile (logfile, logdir, sizeof (logfile)); -        snprintf (volfileid, sizeof (volfileid), "tierd/%s", volinfo->volname); +        len = snprintf (volfileid, sizeof (volfileid), "tierd/%s", +                        volinfo->volname); +        if ((len < 0) || (len >= sizeof(volfileid))) { +                ret = -1; +                goto out; +        }          if (dict_get_str (this->options, "transport.socket.bind-address",                            &volfileserver) != 0) { @@ -260,6 +266,7 @@ glusterd_tierdsvc_start (glusterd_svc_t *svc, int flags)          glusterd_tierdsvc_t *tierd                      = NULL;          int                  cmd                        = GF_DEFRAG_CMD_START_TIER;          char                *localtime_logging          = NULL; +        int32_t              len                        = 0;          this = THIS;          GF_VALIDATE_OR_GOTO (THIS->name, this, out); @@ -315,8 +322,12 @@ glusterd_tierdsvc_start (glusterd_svc_t *svc, int flags)          runinit (&runner);          if (this->ctx->cmd_args.valgrind) { -                snprintf (valgrind_logfile, PATH_MAX, "%s/valgrind-tierd.log", -                          svc->proc.logdir); +                len = snprintf (valgrind_logfile, PATH_MAX, +                                "%s/valgrind-tierd.log", svc->proc.logdir); +                if ((len < 0) || (len >= PATH_MAX)) { +                        ret = -1; +                        goto out; +                }                  runner_add_args (&runner, "valgrind", "--leak-check=full",                                   "--trace-children=yes", "--track-origins=yes", diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index 7d039a23f1a..385df1ea01b 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -1449,14 +1449,15 @@ glusterd_validate_and_create_brickpath (glusterd_brickinfo_t *brickinfo,          char         msg[2048]           = {0,};          gf_boolean_t is_created          = _gf_false;          char         glusterfs_dir_path[PATH_MAX] = {0}; +        int32_t      len                 = 0;          ret = sys_mkdir (brickinfo->path, 0777);          if (ret) {                  if (errno != EEXIST) { -                        snprintf (msg, sizeof (msg), "Failed to create brick " -                                  "directory for brick %s:%s. Reason : %s ", -                                  brickinfo->hostname, brickinfo->path, -                                  strerror (errno)); +                        len = snprintf (msg, sizeof (msg), "Failed to create " +                                        "brick directory for brick %s:%s. " +                                        "Reason : %s ", brickinfo->hostname, +                                        brickinfo->path, strerror (errno));                          goto out;                  }          } else { @@ -1465,60 +1466,70 @@ glusterd_validate_and_create_brickpath (glusterd_brickinfo_t *brickinfo,          ret = sys_lstat (brickinfo->path, &brick_st);          if (ret) { -                snprintf (msg, sizeof (msg), "lstat failed on %s. Reason : %s", -                          brickinfo->path, strerror (errno)); +                len = snprintf (msg, sizeof (msg), "lstat failed on %s. " +                                "Reason : %s", brickinfo->path, +                                strerror (errno));                  goto out;          }          if ((!is_created) && (!S_ISDIR (brick_st.st_mode))) { -                snprintf (msg, sizeof (msg), "The provided path %s which is " -                          "already present, is not a directory", -                          brickinfo->path); +                len = snprintf (msg, sizeof (msg), "The provided path %s " +                                "which is already present, is not a directory", +                                brickinfo->path);                  ret = -1;                  goto out;          } -        snprintf (parentdir, sizeof (parentdir), "%s/..", brickinfo->path); +        len = snprintf (parentdir, sizeof (parentdir), "%s/..", +                        brickinfo->path); +        if ((len < 0) || (len >= sizeof(parentdir))) { +                ret = -1; +                goto out; +        }          ret = sys_lstat ("/", &root_st);          if (ret) { -                snprintf (msg, sizeof (msg), "lstat failed on /. Reason : %s", -                          strerror (errno)); +                len = snprintf (msg, sizeof (msg), "lstat failed on /. " +                                "Reason : %s", strerror (errno));                  goto out;          }          ret = sys_lstat (parentdir, &parent_st);          if (ret) { -                snprintf (msg, sizeof (msg), "lstat failed on %s. Reason : %s", -                          parentdir, strerror (errno)); +                len = snprintf (msg, sizeof (msg), "lstat failed on %s. " +                                "Reason : %s", parentdir, strerror (errno));                  goto out;          }          if (!is_force) {                  if (brick_st.st_dev != parent_st.st_dev) { -                        snprintf (msg, sizeof (msg), "The brick %s:%s is a " -                                  "mount point. Please create a sub-directory " -                                  "under the mount point and use that as the " -                                  "brick directory. Or use 'force' at the end " -                                  "of the command if you want to override this " -                                  "behavior.", brickinfo->hostname, -                                  brickinfo->path); +                        len = snprintf (msg, sizeof (msg), "The brick %s:%s " +                                        "is a mount point. Please create a " +                                        "sub-directory under the mount point " +                                        "and use that as the brick directory. " +                                        "Or use 'force' at the end of the " +                                        "command if you want to override this " +                                        "behavior.", brickinfo->hostname, +                                        brickinfo->path);                          ret = -1;                          goto out;                  }                  else if (parent_st.st_dev == root_st.st_dev) { -                        snprintf (msg, sizeof (msg), "The brick %s:%s " -                                  "is being created in the root partition. It " -                                  "is recommended that you don't use the " -                                  "system's root partition for storage backend." -                                  " Or use 'force' at the end of the command if" -                                  " you want to override this behavior.", -                                  brickinfo->hostname, brickinfo->path); +                        len = snprintf (msg, sizeof (msg), "The brick %s:%s " +                                        "is being created in the root " +                                        "partition. It is recommended that " +                                        "you don't use the system's root " +                                        "partition for storage backend. Or " +                                        "use 'force' at the end of the " +                                        "command if you want to override this " +                                        "behavior.", brickinfo->hostname, +                                        brickinfo->path);                          /* If --wignore-partition flag is used, ignore warnings                           * related to bricks being on root partition when 'force'                           * is not used */ -                        if (!ignore_partition) { +                        if ((len < 0) || (len >= sizeof(msg)) || +                            !ignore_partition) {                                  ret = -1;                                  goto out;                          } @@ -1540,20 +1551,28 @@ glusterd_validate_and_create_brickpath (glusterd_brickinfo_t *brickinfo,                  goto out;          /* create .glusterfs directory */ -        snprintf (glusterfs_dir_path, sizeof (glusterfs_dir_path), "%s/%s", -                  brickinfo->path, ".glusterfs"); +        len = snprintf (glusterfs_dir_path, sizeof (glusterfs_dir_path), +                        "%s/%s", brickinfo->path, ".glusterfs"); +        if ((len < 0) || (len >= sizeof(glusterfs_dir_path))) { +                ret = -1; +                goto out; +        } +          ret = sys_mkdir (glusterfs_dir_path, 0600);          if (ret && (errno != EEXIST)) { -                snprintf (msg, sizeof (msg), "Failed to create .glusterfs " -                          "directory for brick %s:%s. Reason : %s ", -                          brickinfo->hostname, brickinfo->path, -                          strerror (errno)); +                len = snprintf (msg, sizeof (msg), "Failed to create " +                                ".glusterfs directory for brick %s:%s. " +                                "Reason : %s ", brickinfo->hostname, +                                brickinfo->path, strerror (errno));                  goto out;          }          ret = 0;  out: +        if (len < 0) { +                ret = -1; +        }          if (ret && is_created) {                 (void)recursive_rmdir (brickinfo->path);          } @@ -1859,6 +1878,7 @@ glusterd_set_brick_socket_filepath (glusterd_volinfo_t *volinfo,          int                     expected_file_len = 0;          char                    export_path[PATH_MAX] = {0,};          char                    sock_filepath[PATH_MAX] = {0,}; +        int32_t                 slen = 0;          expected_file_len = strlen (GLUSTERD_SOCK_DIR) + strlen ("/") +                              SHA256_DIGEST_LENGTH*2 + strlen (".socket") + 1; @@ -1870,8 +1890,11 @@ glusterd_set_brick_socket_filepath (glusterd_volinfo_t *volinfo,          GLUSTERD_GET_VOLUME_PID_DIR (volume_dir, volinfo, priv);          GLUSTERD_REMOVE_SLASH_FROM_PATH (brickinfo->path, export_path); -        snprintf (sock_filepath, PATH_MAX, "%s/run/%s-%s", -                  volume_dir, brickinfo->hostname, export_path); +        slen = snprintf (sock_filepath, PATH_MAX, "%s/run/%s-%s", +                         volume_dir, brickinfo->hostname, export_path); +        if (slen < 0) { +                sock_filepath[0] = 0; +        }          glusterd_set_socket_filepath (sock_filepath, sockpath, len);  } @@ -1966,6 +1989,7 @@ glusterd_volume_start_glusterfs (glusterd_volinfo_t  *volinfo,          struct rpc_clnt         *rpc = NULL;          rpc_clnt_connection_t   *conn  = NULL;          int                     pid    = -1; +        int32_t                 len = 0;          GF_ASSERT (volinfo);          GF_ASSERT (brickinfo); @@ -2038,15 +2062,19 @@ retry:          if (this->ctx->cmd_args.valgrind) {                  /* Run bricks with valgrind */                  if (volinfo->logdir) { -                        snprintf (valgrind_logfile, PATH_MAX, -                                  "%s/valgrind-%s-%s.log", -                                  volinfo->logdir, -                                  volinfo->volname, exp_path); +                        len = snprintf (valgrind_logfile, PATH_MAX, +                                        "%s/valgrind-%s-%s.log", +                                        volinfo->logdir, +                                        volinfo->volname, exp_path);                  } else { -                        snprintf (valgrind_logfile, PATH_MAX, -                                  "%s/bricks/valgrind-%s-%s.log", -                                  DEFAULT_LOG_FILE_DIRECTORY, -                                  volinfo->volname, exp_path); +                        len = snprintf (valgrind_logfile, PATH_MAX, +                                        "%s/bricks/valgrind-%s-%s.log", +                                        DEFAULT_LOG_FILE_DIRECTORY, +                                        volinfo->volname, exp_path); +                } +                if ((len < 0) || (len >= PATH_MAX)) { +                        ret = -1; +                        goto out;                  }                  runner_add_args (&runner, "valgrind", "--leak-check=full", @@ -2056,22 +2084,32 @@ retry:          }          if (volinfo->is_snap_volume) { -                snprintf (volfile, PATH_MAX,"/%s/%s/%s.%s.%s", -                          GLUSTERD_VOL_SNAP_DIR_PREFIX, -                          volinfo->snapshot->snapname, volinfo->volname, -                          brickinfo->hostname, exp_path); +                len = snprintf (volfile, PATH_MAX, "/%s/%s/%s.%s.%s", +                                GLUSTERD_VOL_SNAP_DIR_PREFIX, +                                volinfo->snapshot->snapname, volinfo->volname, +                                brickinfo->hostname, exp_path);          } else { -                snprintf (volfile, PATH_MAX, "%s.%s.%s", volinfo->volname, -                          brickinfo->hostname, exp_path); +                len = snprintf (volfile, PATH_MAX, "%s.%s.%s", +                                volinfo->volname, brickinfo->hostname, +                                exp_path); +        } +        if ((len < 0) || (len >= PATH_MAX)) { +                ret = -1; +                goto out;          }          if (volinfo->logdir) { -                snprintf (logfile, PATH_MAX, "%s/%s.log", -                          volinfo->logdir, exp_path); +                len = snprintf (logfile, PATH_MAX, "%s/%s.log", +                                volinfo->logdir, exp_path);          } else { -                snprintf (logfile, PATH_MAX, "%s/bricks/%s.log", -                          DEFAULT_LOG_FILE_DIRECTORY, exp_path); +                len = snprintf (logfile, PATH_MAX, "%s/bricks/%s.log", +                                DEFAULT_LOG_FILE_DIRECTORY, exp_path); +        } +        if ((len < 0) || (len >= PATH_MAX)) { +                ret = -1; +                goto out;          } +          if (!brickinfo->logfile)                  brickinfo->logfile = gf_strdup (logfile); @@ -2096,8 +2134,12 @@ retry:          if (volinfo->transport_type != GF_TRANSPORT_BOTH_TCP_RDMA) {                  runner_argprintf (&runner, "%d", port);          } else { -                snprintf (rdma_brick_path, sizeof(rdma_brick_path), "%s.rdma", -                          brickinfo->path); +                len = snprintf (rdma_brick_path, sizeof(rdma_brick_path), +                                "%s.rdma", brickinfo->path); +                if ((len < 0) || (len >= sizeof(rdma_brick_path))) { +                        ret = -1; +                        goto out; +                }                  rdma_port = pmap_assign_port (THIS, brickinfo->rdma_port,                                                rdma_brick_path);                  if (!rdma_port) { @@ -2752,6 +2794,8 @@ int glusterd_compute_cksum (glusterd_volinfo_t *volinfo,          char              filepath[PATH_MAX]   = {0,};          glusterd_conf_t  *conf                 = NULL;          xlator_t         *this                 = NULL; +        int32_t           len1                 = 0; +        int32_t           len2                 = 0;          this = THIS;          GF_ASSERT (this); @@ -2761,15 +2805,19 @@ int glusterd_compute_cksum (glusterd_volinfo_t *volinfo,          GLUSTERD_GET_VOLUME_DIR (path, volinfo, conf);          if (is_quota_conf) { -                snprintf (cksum_path, sizeof (cksum_path), "%s/%s", path, -                          GLUSTERD_VOL_QUOTA_CKSUM_FILE); -                snprintf (filepath, sizeof (filepath), "%s/%s", path, -                          GLUSTERD_VOLUME_QUOTA_CONFIG); +                len1 = snprintf (cksum_path, sizeof (cksum_path), "%s/%s", +                                 path, GLUSTERD_VOL_QUOTA_CKSUM_FILE); +                len2 = snprintf (filepath, sizeof (filepath), "%s/%s", path, +                                 GLUSTERD_VOLUME_QUOTA_CONFIG);          } else { -                snprintf (cksum_path, sizeof (cksum_path), "%s/%s", path, -                          GLUSTERD_CKSUM_FILE); -                snprintf (filepath, sizeof (filepath), "%s/%s", path, -                          GLUSTERD_VOLUME_INFO_FILE); +                len1 = snprintf (cksum_path, sizeof (cksum_path), "%s/%s", +                                 path, GLUSTERD_CKSUM_FILE); +                len2 = snprintf (filepath, sizeof (filepath), "%s/%s", path, +                                 GLUSTERD_VOLUME_INFO_FILE); +        } +        if ((len1 < 0) || (len2 < 0) || +            (len1 >= sizeof(cksum_path)) || (len2 >= sizeof(filepath))) { +                goto out;          }          ret = glusterd_volume_compute_cksum (volinfo, cksum_path, filepath, @@ -5568,6 +5616,7 @@ attach_brick (xlator_t *this,          int             ret = -1;          int             tries;          rpc_clnt_t      *rpc; +        int32_t         len;          gf_log (this->name, GF_LOG_INFO,                  "add brick %s to existing process for %s", @@ -5579,14 +5628,20 @@ attach_brick (xlator_t *this,          GLUSTERD_GET_BRICK_PIDFILE (pidfile2, volinfo, brickinfo, conf);          if (volinfo->is_snap_volume) { -                snprintf (full_id, sizeof(full_id), "/%s/%s/%s.%s.%s", -                          GLUSTERD_VOL_SNAP_DIR_PREFIX, -                          volinfo->snapshot->snapname, -                          volinfo->volname, brickinfo->hostname, unslashed); +                len  = snprintf (full_id, sizeof(full_id), "/%s/%s/%s.%s.%s", +                                 GLUSTERD_VOL_SNAP_DIR_PREFIX, +                                 volinfo->snapshot->snapname, +                                 volinfo->volname, brickinfo->hostname, +                                 unslashed);          } else { -                snprintf (full_id, sizeof(full_id), "%s.%s.%s", -                          volinfo->volname, brickinfo->hostname, unslashed); +                len = snprintf (full_id, sizeof(full_id), "%s.%s.%s", +                                volinfo->volname, brickinfo->hostname, +                                unslashed);          } +        if ((len < 0) || (len >= sizeof(full_id))) { +                goto out; +        } +          (void) build_volfile_path (full_id, path, sizeof(path), NULL); @@ -5646,6 +5701,7 @@ attach_brick (xlator_t *this,                  synclock_lock (&conf->big_lock);          } +out:          gf_log (this->name, GF_LOG_WARNING,                  "attach failed for %s", brickinfo->path);          return ret; @@ -6876,7 +6932,7 @@ glusterd_add_brick_mount_details (glusterd_brickinfo_t *brickinfo,          int             ret                  = -1;          char            key[1024]            = {0};          char            buff [PATH_MAX]      = {0}; -        char            base_key[1024]       = {0}; +        char            base_key[32]         = {0};          struct mntent   save_entry           = {0};          char           *mnt_pt               = NULL;          struct mntent  *entry                = NULL; @@ -6978,7 +7034,7 @@ glusterd_add_brick_detail_to_dict (glusterd_volinfo_t *volinfo,          uint64_t        inodes_total      = 0;          uint64_t        inodes_free       = 0;          uint64_t        block_size        = 0; -        char            key[1024]         = {0}; +        char            key[1024 + 16]    = {0};          char            base_key[1024]    = {0};          struct statvfs  brickstat         = {0};          xlator_t       *this              = NULL; @@ -7061,7 +7117,7 @@ glusterd_add_brick_to_dict (glusterd_volinfo_t *volinfo,          int             ret                   = -1;          int32_t         pid                   = -1; -        char            key[1024]             = {0}; +        char            key[1024 + 16]        = {0};          char            base_key[1024]        = {0};          char            pidfile[PATH_MAX]     = {0};          xlator_t        *this                 = NULL; @@ -8653,13 +8709,17 @@ glusterd_get_bitd_filepath (char *filepath, glusterd_volinfo_t *volinfo)          int   ret             = 0;          char  path[PATH_MAX]  = {0,};          glusterd_conf_t *priv = NULL; +        int32_t len           = 0;          priv = THIS->private;          GLUSTERD_GET_VOLUME_DIR (path, volinfo, priv); -        snprintf (filepath, PATH_MAX, -                  "%s/%s-bitd.vol", path, volinfo->volname); +        len = snprintf (filepath, PATH_MAX, +                        "%s/%s-bitd.vol", path, volinfo->volname); +        if ((len < 0) || (len >= PATH_MAX)) { +                ret = -1; +        }          return ret;  } @@ -8671,6 +8731,7 @@ glusterd_get_client_filepath (char *filepath, glusterd_volinfo_t *volinfo,          int   ret             = 0;          char  path[PATH_MAX]  = {0,};          glusterd_conf_t *priv = NULL; +        int32_t len           = 0;          priv = THIS->private; @@ -8678,18 +8739,21 @@ glusterd_get_client_filepath (char *filepath, glusterd_volinfo_t *volinfo,          switch (type) {          case GF_TRANSPORT_TCP: -                snprintf (filepath, PATH_MAX, -                          "%s/%s.tcp-fuse.vol", path, volinfo->volname); +                len = snprintf (filepath, PATH_MAX, +                                "%s/%s.tcp-fuse.vol", path, volinfo->volname);                  break;          case GF_TRANSPORT_RDMA: -                snprintf (filepath, PATH_MAX, -                          "%s/%s.rdma-fuse.vol", path, volinfo->volname); +                len = snprintf (filepath, PATH_MAX, +                                "%s/%s.rdma-fuse.vol", path, volinfo->volname);                  break;          default:                  ret = -1;                  break;          } +        if ((len < 0) || (len >= PATH_MAX)) { +                ret = -1; +        }          return ret;  } @@ -8702,6 +8766,7 @@ glusterd_get_trusted_client_filepath (char *filepath,          int   ret             = 0;          char  path[PATH_MAX]  = {0,};          glusterd_conf_t *priv = NULL; +        int32_t len           = 0;          priv = THIS->private; @@ -8709,18 +8774,23 @@ glusterd_get_trusted_client_filepath (char *filepath,          switch (type) {          case GF_TRANSPORT_TCP: -                snprintf (filepath, PATH_MAX, "%s/trusted-%s.tcp-fuse.vol", -                          path, volinfo->volname); +                len = snprintf (filepath, PATH_MAX, +                                "%s/trusted-%s.tcp-fuse.vol", path, +                                volinfo->volname);                  break;          case GF_TRANSPORT_RDMA: -                snprintf (filepath, PATH_MAX, "%s/trusted-%s.rdma-fuse.vol", -                          path, volinfo->volname); +                len = snprintf (filepath, PATH_MAX, +                                "%s/trusted-%s.rdma-fuse.vol", path, +                                volinfo->volname);                  break;          default:                  ret = -1;                  break;          } +        if ((len < 0) || (len >= PATH_MAX)) { +                ret = -1; +        }          return ret;  } @@ -9686,7 +9756,7 @@ static int  _profile_volume_add_friend_rsp (dict_t *this, char *key, data_t *value,                                 void *data)  { -        char    new_key[256] = {0}; +        char    new_key[264] = {0};          glusterd_pr_brick_rsp_conv_t *rsp_ctx = NULL;          data_t  *new_value = NULL;          int     brick_count = 0; @@ -9753,7 +9823,8 @@ glusterd_volume_status_add_peer_rsp (dict_t *this, char *key, data_t *value,          char                            brick_key[1024] = {0,};          char                            new_key[1024] = {0,};          int32_t                         index = 0; -        int32_t                         ret = 0; +        int32_t                         ret = -1; +        int32_t                         len = 0;          /* Skip the following keys, they are already present in the ctx_dict */          /* Also, skip all the task related pairs. They will be added to the @@ -9771,19 +9842,25 @@ glusterd_volume_status_add_peer_rsp (dict_t *this, char *key, data_t *value,          sscanf (key, "brick%d.%s", &index, brick_key);          if (index > rsp_ctx->brick_index_max) { -                snprintf (new_key, sizeof (new_key), "brick%d.%s", -                          index + rsp_ctx->other_count, brick_key); +                len = snprintf (new_key, sizeof (new_key), "brick%d.%s", +                                index + rsp_ctx->other_count, brick_key); +                if ((len < 0) || (len >= sizeof(new_key))) { +                        goto out; +                }          } else {                  strncpy (new_key, key, sizeof (new_key));                  new_key[sizeof (new_key) - 1] = 0;          }          ret = dict_set (rsp_ctx->dict, new_key, new_value); -        if (ret) +out: +        if (ret) { +                data_unref(new_value);                  gf_msg ("glusterd", GF_LOG_ERROR, 0,                          GD_MSG_DICT_SET_FAILED,                          "Unable to set key: %s in dict",                          key); +        }          return 0;  } @@ -12538,6 +12615,7 @@ glusterd_clean_up_quota_store (glusterd_volinfo_t *volinfo)          char      cksum_path[PATH_MAX]     = {0,};          xlator_t  *this                    = NULL;          glusterd_conf_t *conf              = NULL; +        int32_t   len                      = 0;          this = THIS;          GF_ASSERT (this); @@ -12546,10 +12624,16 @@ glusterd_clean_up_quota_store (glusterd_volinfo_t *volinfo)          GLUSTERD_GET_VOLUME_DIR (voldir, volinfo, conf); -        snprintf (quota_confpath, sizeof (quota_confpath), "%s/%s", voldir, -                  GLUSTERD_VOLUME_QUOTA_CONFIG); -        snprintf (cksum_path, sizeof (cksum_path), "%s/%s", voldir, -                  GLUSTERD_VOL_QUOTA_CKSUM_FILE); +        len = snprintf (quota_confpath, sizeof (quota_confpath), "%s/%s", +                        voldir, GLUSTERD_VOLUME_QUOTA_CONFIG); +        if ((len < 0) || (len >= sizeof(quota_confpath))) { +                quota_confpath[0] = 0; +        } +        len = snprintf (cksum_path, sizeof (cksum_path), "%s/%s", voldir, +                        GLUSTERD_VOL_QUOTA_CKSUM_FILE); +        if ((len < 0) || (len >= sizeof(cksum_path))) { +                cksum_path[0] = 0; +        }          sys_unlink (quota_confpath);          sys_unlink (cksum_path); @@ -13375,7 +13459,7 @@ cont:                          "Libxml not present");  #endif -        if (xml_out) +        if (xml_out) {  #if (HAVE_LIB_XML)                  output = gf_strdup ((char *)buf->content);                  if (NULL == output) { @@ -13387,6 +13471,7 @@ cont:                          GD_MSG_MODULE_NOT_INSTALLED,                          "Libxml not present");  #endif +        }          ret = dict_set_dynstr (ctx, "help-str", output);          if (ret >= 0) { diff --git a/xlators/mgmt/glusterd/src/glusterd-volgen.c b/xlators/mgmt/glusterd/src/glusterd-volgen.c index fbb8013931b..76266e1e194 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volgen.c +++ b/xlators/mgmt/glusterd/src/glusterd-volgen.c @@ -1830,6 +1830,7 @@ brick_graph_add_changelog (volgen_graph_t *graph, glusterd_volinfo_t *volinfo,          xlator_t        *xl = NULL;          char            changelog_basepath[PATH_MAX]    = {0,};          int             ret = -1; +        int32_t         len = 0;          if (!graph || !volinfo || !set_dict || !brickinfo)                  goto out; @@ -1842,8 +1843,12 @@ brick_graph_add_changelog (volgen_graph_t *graph, glusterd_volinfo_t *volinfo,          if (ret)                  goto out; -        snprintf (changelog_basepath, sizeof (changelog_basepath), -                  "%s/%s", brickinfo->path, ".glusterfs/changelogs"); +        len = snprintf (changelog_basepath, sizeof (changelog_basepath), +                        "%s/%s", brickinfo->path, ".glusterfs/changelogs"); +        if ((len < 0) || (len >= sizeof(changelog_basepath))) { +                ret = -1; +                goto out; +        }          ret = xlator_set_option (xl, "changelog-dir", changelog_basepath);          if (ret)                  goto out; @@ -2187,6 +2192,7 @@ brick_graph_add_index (volgen_graph_t *graph, glusterd_volinfo_t *volinfo,          char            *pending_xattr = NULL;          char            index_basepath[PATH_MAX]   = {0};          int             ret = -1; +        int32_t         len = 0;          if (!graph || !volinfo || !brickinfo || !set_dict)                  goto out; @@ -2200,8 +2206,11 @@ brick_graph_add_index (volgen_graph_t *graph, glusterd_volinfo_t *volinfo,          if (!xl)                  goto out; -        snprintf (index_basepath, sizeof (index_basepath), "%s/%s", -                  brickinfo->path, ".glusterfs/indices"); +        len = snprintf (index_basepath, sizeof (index_basepath), "%s/%s", +                        brickinfo->path, ".glusterfs/indices"); +        if ((len < 0) || (len >= sizeof(index_basepath))) { +                goto out; +        }          ret = xlator_set_option (xl, "index-base", index_basepath);          if (ret) @@ -2474,6 +2483,7 @@ brick_graph_add_server (volgen_graph_t *graph, glusterd_volinfo_t *volinfo,          char            *ssl_user = NULL;          char            *volname = NULL;          char            *address_family_data = NULL; +        int32_t          len = 0;          if (!graph || !volinfo || !set_dict || !brickinfo)                  goto out; @@ -2523,8 +2533,11 @@ brick_graph_add_server (volgen_graph_t *graph, glusterd_volinfo_t *volinfo,          if (username) {                  memset (key, 0, sizeof (key)); -                snprintf (key, sizeof (key), "auth.login.%s.allow", -                                        brickinfo->path); +                len = snprintf (key, sizeof (key), "auth.login.%s.allow", +                                brickinfo->path); +                if ((len < 0) || (len >= sizeof(key))) { +                        return -1; +                }                  ret = xlator_set_option (xl, key, username);                  if (ret) @@ -2563,8 +2576,11 @@ brick_graph_add_server (volgen_graph_t *graph, glusterd_volinfo_t *volinfo,          if (dict_get_str (volinfo->dict, "auth.ssl-allow", &ssl_user) == 0) {                  memset (key, 0, sizeof (key)); -                snprintf (key, sizeof (key), "auth.login.%s.ssl-allow", -                                       brickinfo->path); +                len = snprintf (key, sizeof (key), "auth.login.%s.ssl-allow", +                                brickinfo->path); +                if ((len < 0) || (len >= sizeof(key))) { +                        return -1; +                }                  ret = xlator_set_option (xl, key, ssl_user);                  if (ret) @@ -5638,6 +5654,7 @@ get_brick_filepath (char *filename, glusterd_volinfo_t *volinfo,          char  path[PATH_MAX]   = {0,};          char  brick[PATH_MAX]  = {0,};          glusterd_conf_t *priv  = NULL; +        int32_t len            = 0;          priv = THIS->private; @@ -5645,13 +5662,16 @@ get_brick_filepath (char *filename, glusterd_volinfo_t *volinfo,          GLUSTERD_GET_VOLUME_DIR (path, volinfo, priv);          if (prefix) -                snprintf (filename, PATH_MAX, "%s/%s.%s.%s.%s.vol", -                          path, volinfo->volname, prefix, -                          brickinfo->hostname, brick); +                len = snprintf (filename, PATH_MAX, "%s/%s.%s.%s.%s.vol", +                                path, volinfo->volname, prefix, +                                brickinfo->hostname, brick);          else -                snprintf (filename, PATH_MAX, "%s/%s.%s.%s.vol", -                          path, volinfo->volname, -                          brickinfo->hostname, brick); +                len = snprintf (filename, PATH_MAX, "%s/%s.%s.%s.vol", +                                path, volinfo->volname, +                                brickinfo->hostname, brick); +        if ((len < 0) || (len >= PATH_MAX)) { +                filename[0] = 0; +        }  } @@ -5877,16 +5897,18 @@ get_parent_vol_tstamp_file (char *filename, glusterd_volinfo_t *volinfo)  {          glusterd_conf_t *priv  = NULL;          xlator_t        *this  = NULL; +        int32_t          len   = 0;          this = THIS;          GF_ASSERT (this);          priv = this->private;          GF_ASSERT (priv); -        snprintf (filename, PATH_MAX, "%s/vols/%s", priv->workdir, -                  volinfo->parent_volname); -        strncat (filename, "/marker.tstamp", -                 PATH_MAX - strlen(filename) - 1); +        len = snprintf (filename, PATH_MAX, "%s/vols/%s/marker.tstamp", +                        priv->workdir, volinfo->parent_volname); +        if ((len < 0) || (len >= PATH_MAX)) { +                filename[0] = 0; +        }  }  void @@ -6438,7 +6460,7 @@ build_bitd_volume_graph (volgen_graph_t *graph,          get_transport_type (volinfo, set_dict, transt, _gf_false);          if (!strncmp (transt, "tcp,rdma", strlen ("tcp,rdma"))) -                strncpy (transt, "tcp", strlen ("tcp")); +                strncpy (transt, "tcp", sizeof(transt));          cds_list_for_each_entry (brickinfo, &volinfo->bricks, brick_list) {                  if (!glusterd_is_local_brick (this, volinfo, brickinfo)) @@ -6600,7 +6622,7 @@ build_scrub_volume_graph (volgen_graph_t *graph, glusterd_volinfo_t *volinfo,          get_transport_type (volinfo, set_dict, transt, _gf_false);          if (!strncmp (transt, "tcp,rdma", strlen ("tcp,rdma"))) -                strncpy (transt, "tcp", strlen ("tcp")); +                strncpy (transt, "tcp", sizeof(transt));          cds_list_for_each_entry (brickinfo, &volinfo->bricks, brick_list) {                  if (!glusterd_is_local_brick (this, volinfo, brickinfo)) diff --git a/xlators/mgmt/glusterd/src/glusterd-volume-ops.c b/xlators/mgmt/glusterd/src/glusterd-volume-ops.c index e46ef57e441..3973a0da78a 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volume-ops.c +++ b/xlators/mgmt/glusterd/src/glusterd-volume-ops.c @@ -1507,6 +1507,7 @@ glusterd_op_stage_start_volume (dict_t *dict, char **op_errstr,          char                                    volid[50] = {0,};          char                                    xattr_volid[50] = {0,};          int                                     caps = 0; +        int32_t                                 len = 0;          this = THIS;          GF_ASSERT (this); @@ -1585,19 +1586,25 @@ glusterd_op_stage_start_volume (dict_t *dict, char **op_errstr,                  if (ret && (flags & GF_CLI_FLAG_OP_FORCE)) {                          continue;                  } else if (ret) { -                        snprintf (msg, sizeof (msg), "Failed to find " -                                          "brick directory %s for volume %s. " -                                          "Reason : %s", brickinfo->path, -                                          volname, strerror (errno)); +                        len = snprintf (msg, sizeof (msg), "Failed to find " +                                       "brick directory %s for volume %s. " +                                       "Reason : %s", brickinfo->path, +                                       volname, strerror (errno)); +                        if (len < 0) { +                                strcpy(msg, "<error>"); +                        }                          goto out;                  }                  ret = sys_lgetxattr (brickinfo->path, GF_XATTR_VOL_ID_KEY,                                       volume_id, 16);                  if (ret < 0 && (!(flags & GF_CLI_FLAG_OP_FORCE))) { -                        snprintf (msg, sizeof (msg), "Failed to get " -                                  "extended attribute %s for brick dir %s. " -                                  "Reason : %s", GF_XATTR_VOL_ID_KEY, -                                  brickinfo->path, strerror (errno)); +                        len = snprintf (msg, sizeof (msg), "Failed to get " +                                        "extended attribute %s for brick dir " +                                        "%s. Reason : %s", GF_XATTR_VOL_ID_KEY, +                                        brickinfo->path, strerror (errno)); +                        if (len < 0) { +                                strcpy(msg, "<error>"); +                        }                          ret = -1;                          goto out;                  } else if (ret < 0) { @@ -1606,22 +1613,30 @@ glusterd_op_stage_start_volume (dict_t *dict, char **op_errstr,                                               volinfo->volume_id, 16,                                               XATTR_CREATE);                          if (ret == -1) { -                                snprintf (msg, sizeof (msg), "Failed to set " -                                        "extended attribute %s on %s. Reason: " -                                        "%s", GF_XATTR_VOL_ID_KEY, -                                        brickinfo->path, strerror (errno)); +                                len = snprintf (msg, sizeof (msg), "Failed to " +                                                "set extended attribute %s on " +                                                "%s. Reason: %s", +                                                GF_XATTR_VOL_ID_KEY, +                                                brickinfo->path, +                                                strerror (errno)); +                                if (len < 0) { +                                        strcpy(msg, "<error>"); +                                }                                  goto out;                          } else {                                  continue;                          }                  }                  if (gf_uuid_compare (volinfo->volume_id, volume_id)) { -                        snprintf (msg, sizeof (msg), "Volume id mismatch for " -                                  "brick %s:%s. Expected volume id %s, " -                                  "volume id %s found", brickinfo->hostname, -                                  brickinfo->path, -                                  uuid_utoa_r (volinfo->volume_id, volid), -                                  uuid_utoa_r (volume_id, xattr_volid)); +                        len = snprintf (msg, sizeof (msg), "Volume id " +                                        "mismatch for brick %s:%s. Expected " +                                        "volume id %s, volume id %s found", +                                        brickinfo->hostname, brickinfo->path, +                                        uuid_utoa_r (volinfo->volume_id, volid), +                                        uuid_utoa_r (volume_id, xattr_volid)); +                        if (len < 0) { +                                strcpy(msg, "<error>"); +                        }                          ret = -1;                          goto out;                  } @@ -3070,6 +3085,7 @@ glusterd_clearlocks_get_local_client_ports (glusterd_volinfo_t *volinfo,          int                     ret                 = -1;          int                     i                   = 0;          int                     port                = 0; +        int32_t                 len                 = 0;          GF_ASSERT (xl_opts);          if (!xl_opts) { @@ -3085,11 +3101,15 @@ glusterd_clearlocks_get_local_client_ports (glusterd_volinfo_t *volinfo,                          continue;                  if (volinfo->transport_type == GF_TRANSPORT_RDMA) { -                        snprintf (brickname, sizeof(brickname), "%s.rdma", -                                  brickinfo->path); +                        len = snprintf (brickname, sizeof(brickname), +                                        "%s.rdma", brickinfo->path);                  } else -                        snprintf (brickname, sizeof(brickname), "%s", -                                  brickinfo->path); +                        len = snprintf (brickname, sizeof(brickname), "%s", +                                        brickinfo->path); +                if ((len < 0) || (len >= sizeof(brickname))) { +                        ret = -1; +                        goto out; +                }                  port = pmap_registry_search (THIS, brickname,                                               GF_PMAP_PORT_BRICKSERVER, diff --git a/xlators/mgmt/glusterd/src/glusterd.c b/xlators/mgmt/glusterd/src/glusterd.c index 316cae4243b..7dc45129312 100644 --- a/xlators/mgmt/glusterd/src/glusterd.c +++ b/xlators/mgmt/glusterd/src/glusterd.c @@ -569,6 +569,7 @@ glusterd_crt_georep_folders (char *georepdir, glusterd_conf_t *conf)          char *greplg_s   = NULL;          struct group *gr = NULL;          int ret          = 0; +        int32_t len      = 0;          GF_ASSERT (georepdir);          GF_ASSERT (conf); @@ -582,7 +583,11 @@ glusterd_crt_georep_folders (char *georepdir, glusterd_conf_t *conf)                  goto out;          } -        snprintf (georepdir, PATH_MAX, "%s/"GEOREP, conf->workdir); +        len = snprintf (georepdir, PATH_MAX, "%s/"GEOREP, conf->workdir); +        if ((len < 0) || (len >= PATH_MAX)) { +                ret = -1; +                goto out; +        }          ret = mkdir_p (georepdir, 0777, _gf_true);          if (-1 == ret) {                  gf_msg ("glusterd", GF_LOG_CRITICAL, errno, @@ -1404,6 +1409,7 @@ init (xlator_t *this)          gf_boolean_t       upgrade                    = _gf_false;          gf_boolean_t       downgrade                  = _gf_false;          char              *localtime_logging          = NULL; +        int32_t            len                        = 0;  #ifndef GF_DARWIN_HOST_OS          { @@ -1503,8 +1509,13 @@ init (xlator_t *this)                  exit (1);          } -        snprintf (snap_mount_dir, sizeof(snap_mount_dir), "%s%s", -                  var_run_dir, GLUSTERD_DEFAULT_SNAPS_BRICK_DIR); +        len = snprintf (snap_mount_dir, sizeof(snap_mount_dir), "%s%s", +                        var_run_dir, GLUSTERD_DEFAULT_SNAPS_BRICK_DIR); +        if ((len < 0) || (len >= sizeof(snap_mount_dir))) { +                gf_msg (this->name, GF_LOG_CRITICAL, 0, +                        GD_MSG_DIR_OP_FAILED, "Snap mount dir too long"); +                exit(1); +        }          ret = mkdir_p (GLUSTER_SHARED_STORAGE_BRICK_DIR, 0777,                         _gf_true); @@ -1571,7 +1582,10 @@ init (xlator_t *this)                  exit (1);          } -        snprintf (storedir, PATH_MAX, "%s/vols", workdir); +        len = snprintf (storedir, sizeof(storedir), "%s/vols", workdir); +        if ((len < 0) || (len >= sizeof(storedir))) { +                exit(1); +        }          ret = sys_mkdir (storedir, 0777); @@ -1584,7 +1598,10 @@ init (xlator_t *this)          }          /*keeping individual volume pid file information in /var/run/gluster* */ -        snprintf (storedir, PATH_MAX, "%s/vols", rundir); +        len = snprintf (storedir, sizeof(storedir), "%s/vols", rundir); +        if ((len < 0) || (len >= sizeof(storedir))) { +                exit(1); +        }          ret = sys_mkdir (storedir, 0777); @@ -1596,7 +1613,10 @@ init (xlator_t *this)                  exit (1);          } -        snprintf (storedir, PATH_MAX, "%s/snaps", workdir); +        len = snprintf (storedir, sizeof(storedir), "%s/snaps", workdir); +        if ((len < 0) || (len >= sizeof(storedir))) { +                exit(1); +        }          ret = sys_mkdir (storedir, 0777); @@ -1608,7 +1628,10 @@ init (xlator_t *this)                  exit (1);          } -        snprintf (storedir, PATH_MAX, "%s/peers", workdir); +        len = snprintf (storedir, sizeof(storedir), "%s/peers", workdir); +        if ((len < 0) || (len >= sizeof(storedir))) { +                exit(1); +        }          ret = sys_mkdir (storedir, 0777); @@ -1620,7 +1643,12 @@ init (xlator_t *this)                  exit (1);          } -        snprintf (storedir, PATH_MAX, "%s/bricks", DEFAULT_LOG_FILE_DIRECTORY); +        len = snprintf (storedir, sizeof(storedir), "%s/bricks", +                        DEFAULT_LOG_FILE_DIRECTORY); +        if ((len < 0) || (len >= sizeof(storedir))) { +                exit(1); +        } +          ret = sys_mkdir (storedir, 0777);          if ((-1 == ret) && (errno != EEXIST)) {                  gf_msg (this->name, GF_LOG_CRITICAL, errno, @@ -1630,7 +1658,10 @@ init (xlator_t *this)                  exit (1);          } -        snprintf (storedir, PATH_MAX, "%s/nfs", workdir); +        len = snprintf (storedir, sizeof(storedir), "%s/nfs", workdir); +        if ((len < 0) || (len >= sizeof(storedir))) { +                exit(1); +        }          ret = sys_mkdir (storedir, 0777);          if ((-1 == ret) && (errno != EEXIST)) {                  gf_msg (this->name, GF_LOG_CRITICAL, errno, @@ -1640,7 +1671,10 @@ init (xlator_t *this)                  exit (1);          } -        snprintf (storedir, PATH_MAX, "%s/bitd", workdir); +        len = snprintf (storedir, sizeof(storedir), "%s/bitd", workdir); +        if ((len < 0) || (len >= sizeof(storedir))) { +                exit(1); +        }          ret = sys_mkdir (storedir, 0777);          if ((-1 == ret) && (errno != EEXIST)) {                  gf_msg (this->name, GF_LOG_CRITICAL, errno, @@ -1650,7 +1684,10 @@ init (xlator_t *this)                  exit (1);          } -        snprintf (storedir, PATH_MAX, "%s/scrub", workdir); +        len = snprintf (storedir, sizeof(storedir), "%s/scrub", workdir); +        if ((len < 0) || (len >= sizeof(storedir))) { +                exit(1); +        }          ret = sys_mkdir (storedir, 0777);          if ((-1 == ret) && (errno != EEXIST)) {                  gf_msg (this->name, GF_LOG_CRITICAL, errno, @@ -1660,7 +1697,10 @@ init (xlator_t *this)                  exit (1);          } -        snprintf (storedir, PATH_MAX, "%s/glustershd", workdir); +        len = snprintf (storedir, sizeof(storedir), "%s/glustershd", workdir); +        if ((len < 0) || (len >= sizeof(storedir))) { +                exit(1); +        }          ret = sys_mkdir (storedir, 0777);          if ((-1 == ret) && (errno != EEXIST)) {                  gf_msg (this->name, GF_LOG_CRITICAL, errno, @@ -1670,7 +1710,10 @@ init (xlator_t *this)                  exit (1);          } -        snprintf (storedir, PATH_MAX, "%s/quotad", workdir); +        len = snprintf (storedir, sizeof(storedir), "%s/quotad", workdir); +        if ((len < 0) || (len >= sizeof(storedir))) { +                exit(1); +        }          ret = sys_mkdir (storedir, 0777);          if ((-1 == ret) && (errno != EEXIST)) {                  gf_msg (this->name, GF_LOG_CRITICAL, errno, @@ -1680,7 +1723,10 @@ init (xlator_t *this)                  exit (1);          } -        snprintf (storedir, PATH_MAX, "%s/groups", workdir); +        len = snprintf (storedir, sizeof(storedir), "%s/groups", workdir); +        if ((len < 0) || (len >= sizeof(storedir))) { +                exit(1); +        }          ret = sys_mkdir (storedir, 0777);          if ((-1 == ret) && (errno != EEXIST)) {                  gf_msg (this->name, GF_LOG_CRITICAL, errno, diff --git a/xlators/mgmt/glusterd/src/glusterd.h b/xlators/mgmt/glusterd/src/glusterd.h index 33413976e6d..fa053e0c170 100644 --- a/xlators/mgmt/glusterd/src/glusterd.h +++ b/xlators/mgmt/glusterd/src/glusterd.h @@ -612,63 +612,119 @@ typedef enum {  typedef ssize_t (*gd_serialize_t) (struct iovec outmsg, void *args); -#define GLUSTERD_GET_VOLUME_DIR(path, volinfo, priv)                       \ -        if (volinfo->is_snap_volume) {                                     \ -                snprintf (path, PATH_MAX, "%s/snaps/%s/%s", priv->workdir, \ -                          volinfo->snapshot->snapname, volinfo->volname);  \ -        } else {                                                           \ -                snprintf (path, PATH_MAX, "%s/vols/%s", priv->workdir,     \ -                          volinfo->volname);                               \ -        } +#define GLUSTERD_GET_VOLUME_DIR(path, volinfo, priv)                          \ +        do {                                                                  \ +                int32_t len;                                                  \ +                if (volinfo->is_snap_volume) {                                \ +                        len = snprintf (path, PATH_MAX, "%s/snaps/%s/%s",     \ +                                        priv->workdir,                        \ +                                        volinfo->snapshot->snapname,          \ +                                        volinfo->volname);                    \ +                } else {                                                      \ +                        len = snprintf (path, PATH_MAX, "%s/vols/%s",         \ +                                        priv->workdir, volinfo->volname);     \ +                }                                                             \ +                if ((len < 0) || (len >= PATH_MAX)) {                         \ +                        path[0] = 0;                                          \ +                }                                                             \ +        } while (0) +  #define GLUSTERD_GET_TIER_DIR(path, volinfo, priv) do {                 \ -                snprintf (path, PATH_MAX, "%s/tier/%s", priv->workdir,  \ -                          volinfo->volname);                            \ +                int32_t len;                                            \ +                len = snprintf (path, PATH_MAX, "%s/tier/%s",           \ +                                priv->workdir, volinfo->volname);       \ +                if ((len < 0) || (len >= PATH_MAX)) {                   \ +                        path[0] = 0;                                    \ +                }                                                       \          } while (0)  #define GLUSTERD_GET_TIER_PID_FILE(path, volinfo, priv) do {            \                  char tier_path[PATH_MAX];                               \ +                int32_t len;                                            \                  GLUSTERD_GET_TIER_DIR(tier_path, volinfo, priv);        \ -                snprintf (path, PATH_MAX, "%s/run/%s-tierd.pid", tier_path,\ -                          volinfo->volname);                            \ +                len = snprintf (path, PATH_MAX, "%s/run/%s-tierd.pid",  \ +                                tier_path, volinfo->volname);           \ +                if ((len < 0) || (len >= PATH_MAX)) {                   \ +                        path[0] = 0;                                    \ +                }                                                       \          } while (0)  #define GLUSTERD_GET_VOLUME_PID_DIR(path, volinfo, priv)                   \  do {                                                                       \ +        int32_t len;                                                       \          if (volinfo->is_snap_volume) {                                     \ -                snprintf (path, PATH_MAX, "%s/snaps/%s/%s",                \ -                          priv->rundir,                                    \ -                          volinfo->snapshot->snapname, volinfo->volname);  \ +                len = snprintf (path, PATH_MAX, "%s/snaps/%s/%s",          \ +                                priv->rundir,                              \ +                                volinfo->snapshot->snapname,               \ +                                volinfo->volname);                         \          } else {                                                           \ -                snprintf (path, PATH_MAX, "%s/vols/%s",                    \ -                          priv->rundir,                                    \ -                          volinfo->volname);                               \ +                len = snprintf (path, PATH_MAX, "%s/vols/%s",              \ +                                priv->rundir,                              \ +                                volinfo->volname);                         \ +        }                                                                  \ +        if ((len < 0) || (len >= PATH_MAX)) {                              \ +                path[0] = 0;                                               \          }                                                                  \  } while (0) -#define GLUSTERD_GET_SNAP_DIR(path, snap, priv)                           \ -                snprintf (path, PATH_MAX, "%s/snaps/%s", priv->workdir,   \ -                          snap->snapname); +#define GLUSTERD_GET_SNAP_DIR(path, snap, priv)                               \ +        do {                                                                  \ +                int32_t len;                                                  \ +                len = snprintf (path, PATH_MAX, "%s/snaps/%s", priv->workdir, \ +                                snap->snapname);                              \ +                if ((len < 0) || (len >= PATH_MAX)) {                         \ +                        path[0] = 0;                                          \ +                }                                                             \ +        } while (0)  #define GLUSTERD_GET_SNAP_GEO_REP_DIR(path, snap, priv)                      \ -                snprintf (path, PATH_MAX, "%s/snaps/%s/%s", priv->workdir,   \ -                          snap->snapname, GEOREP); +        do {                                                                 \ +                int32_t len;                                                 \ +                len = snprintf (path, PATH_MAX, "%s/snaps/%s/%s",            \ +                                priv->workdir, snap->snapname, GEOREP);      \ +                if ((len < 0) || (len >= PATH_MAX)) {                        \ +                        path[0] = 0;                                         \ +                }                                                            \ +        } while (0)  #define GLUSTERD_GET_BRICK_DIR(path, volinfo, priv)                           \ -        if (volinfo->is_snap_volume) {                                        \ -                snprintf (path, PATH_MAX, "%s/snaps/%s/%s/%s", priv->workdir, \ -                          volinfo->snapshot->snapname, volinfo->volname,      \ -                          GLUSTERD_BRICK_INFO_DIR);                           \ -        } else {                                                              \ -                snprintf (path, PATH_MAX, "%s/%s/%s/%s", priv->workdir,       \ -                          GLUSTERD_VOLUME_DIR_PREFIX, volinfo->volname,       \ -                          GLUSTERD_BRICK_INFO_DIR);                           \ -        } +        do {                                                                  \ +                int32_t len;                                                  \ +                if (volinfo->is_snap_volume) {                                \ +                        len = snprintf (path, PATH_MAX, "%s/snaps/%s/%s/%s",  \ +                                        priv->workdir,                        \ +                                        volinfo->snapshot->snapname,          \ +                                        volinfo->volname,                     \ +                                        GLUSTERD_BRICK_INFO_DIR);             \ +                } else {                                                      \ +                        len = snprintf (path, PATH_MAX, "%s/%s/%s/%s",        \ +                                        priv->workdir,                        \ +                                        GLUSTERD_VOLUME_DIR_PREFIX,           \ +                                        volinfo->volname,                     \ +                                        GLUSTERD_BRICK_INFO_DIR);             \ +                }                                                             \ +                if ((len < 0) || (len >= PATH_MAX)) {                         \ +                        path[0] = 0;                                          \ +                }                                                             \ +        } while (0)  #define GLUSTERD_GET_NFS_DIR(path, priv) \ -        snprintf (path, PATH_MAX, "%s/nfs", priv->workdir); +        do { \ +                int32_t len; \ +                len = snprintf (path, PATH_MAX, "%s/nfs", priv->workdir); \ +                if ((len < 0) || (len >= PATH_MAX)) { \ +                        path[0] = 0; \ +                } \ +        } while (0)  #define GLUSTERD_GET_QUOTAD_DIR(path, priv) \ -        snprintf (path, PATH_MAX, "%s/quotad", priv->workdir); +        do { \ +                int32_t len; \ +                len = snprintf (path, PATH_MAX, "%s/quotad", priv->workdir); \ +                if ((len < 0) || (len >= PATH_MAX)) { \ +                        path[0] = 0; \ +                } \ +        } while (0)  #define GLUSTERD_GET_QUOTA_LIMIT_MOUNT_PATH(abspath, volname, path) do {      \          snprintf (abspath, sizeof (abspath)-1,                                \ @@ -697,32 +753,48 @@ do {                                                                       \  #define GLUSTERD_GET_BRICK_PIDFILE(pidfile,volinfo,brickinfo, priv) do {      \                  char exp_path[PATH_MAX] = {0,};                               \                  char volpath[PATH_MAX]  = {0,};                               \ +                int32_t len             = 0;                                  \                  GLUSTERD_GET_VOLUME_PID_DIR (volpath, volinfo, priv);         \                  GLUSTERD_REMOVE_SLASH_FROM_PATH (brickinfo->path, exp_path);  \ -                snprintf (pidfile, PATH_MAX, "%s/%s-%s.pid",                  \ -                          volpath, brickinfo->hostname, exp_path);            \ +                len = snprintf (pidfile, PATH_MAX, "%s/%s-%s.pid",            \ +                                volpath, brickinfo->hostname, exp_path);      \ +                if ((len < 0) || (len >= PATH_MAX)) {                         \ +                        pidfile[0] = 0;                                       \ +                }                                                             \          } while (0) -#define GLUSTERD_GET_NFS_PIDFILE(pidfile, nfspath, priv) {            \ -                snprintf (pidfile, PATH_MAX, "%s/nfs/nfs.pid",        \ -                          priv->rundir);                              \ -        } +#define GLUSTERD_GET_NFS_PIDFILE(pidfile, nfspath, priv) do {         \ +                int32_t len;                                          \ +                len = snprintf (pidfile, PATH_MAX, "%s/nfs/nfs.pid",  \ +                                priv->rundir);                        \ +                if ((len < 0) || (len >= PATH_MAX)) {                 \ +                        pidfile[0] = 0;                               \ +                }                                                     \ +        } while (0) -#define GLUSTERD_GET_QUOTAD_PIDFILE(pidfile, quotadpath, priv) {         \ -                snprintf (pidfile, PATH_MAX, "%s/quotad/quotad.pid",     \ -                           priv->rundir);                                \ -        } +#define GLUSTERD_GET_QUOTAD_PIDFILE(pidfile, quotadpath, priv) do {        \ +                int32_t len;                                               \ +                len = snprintf (pidfile, PATH_MAX, "%s/quotad/quotad.pid", \ +                                priv->rundir);                             \ +                if ((len < 0) || (len >= PATH_MAX)) {                      \ +                        pidfile[0] = 0;                                    \ +                }                                                          \ +        } while (0)  #define GLUSTERD_GET_QUOTA_CRAWL_PIDDIR(piddir, volinfo, type) do {           \                  char _volpath[PATH_MAX]  = {0,};                              \ +                int32_t len;                                                  \                  GLUSTERD_GET_VOLUME_DIR (_volpath, volinfo, priv);            \                  if (type == GF_QUOTA_OPTION_TYPE_ENABLE ||                    \                      type == GF_QUOTA_OPTION_TYPE_ENABLE_OBJECTS)              \ -                        snprintf (piddir, PATH_MAX, "%s/run/quota/enable",    \ -                                  _volpath);                                  \ +                        len = snprintf (piddir, PATH_MAX,                     \ +                                        "%s/run/quota/enable", _volpath);     \                  else                                                          \ -                        snprintf (piddir, PATH_MAX, "%s/run/quota/disable",   \ -                                  _volpath);                                  \ +                        len = snprintf (piddir, PATH_MAX,                     \ +                                        "%s/run/quota/disable", _volpath);    \ +                if ((len < 0) || (len >= PATH_MAX)) {                         \ +                        piddir[0] = 0;                                        \ +                }                                                             \          } while (0)  #define GLUSTERD_STACK_DESTROY(frame) do {\ @@ -740,31 +812,49 @@ do {                                                                       \  #define GLUSTERD_GET_DEFRAG_DIR(path, volinfo, priv) do {               \                  char vol_path[PATH_MAX];                                \                  char operation[NAME_MAX];                               \ +                int32_t len;                                            \                  GLUSTERD_GET_VOLUME_DIR(vol_path, volinfo, priv);       \                  GLUSTERD_GET_DEFRAG_PROCESS(operation, volinfo);        \ -                snprintf (path, PATH_MAX, "%s/%s", vol_path, operation);\ +                len = snprintf (path, PATH_MAX, "%s/%s", vol_path,      \ +                                operation);                             \ +                if ((len < 0) || (len >= PATH_MAX)) {                   \ +                        path[0] = 0;                                    \ +                }                                                       \          } while (0)  #define GLUSTERD_GET_DEFRAG_SOCK_FILE_OLD(path, volinfo, priv) do {     \                  char defrag_path[PATH_MAX];                             \ +                int32_t len;                                            \                  GLUSTERD_GET_DEFRAG_DIR(defrag_path, volinfo, priv);    \ -                snprintf (path, PATH_MAX, "%s/%s.sock", defrag_path,    \ -                           uuid_utoa(MY_UUID));                         \ +                len = snprintf (path, PATH_MAX, "%s/%s.sock",           \ +                                defrag_path, uuid_utoa(MY_UUID));       \ +                if ((len < 0) || (len >= PATH_MAX)) {                   \ +                        path[0] = 0;                                    \ +                }                                                       \          } while (0) -#define GLUSTERD_GET_DEFRAG_SOCK_FILE(path, volinfo) do {                   \ -                char operation[NAME_MAX];                                   \ -                GLUSTERD_GET_DEFRAG_PROCESS(operation, volinfo);            \ -                snprintf (path, UNIX_PATH_MAX, DEFAULT_VAR_RUN_DIRECTORY    \ -                          "/gluster-%s-%s.sock", operation,                 \ -                           uuid_utoa(volinfo->volume_id));                  \ +#define GLUSTERD_GET_DEFRAG_SOCK_FILE(path, volinfo) do {               \ +                char operation[NAME_MAX];                               \ +                int32_t len;                                            \ +                GLUSTERD_GET_DEFRAG_PROCESS(operation, volinfo);        \ +                len = snprintf (path, UNIX_PATH_MAX,                    \ +                                DEFAULT_VAR_RUN_DIRECTORY               \ +                                "/gluster-%s-%s.sock", operation,       \ +                                uuid_utoa(volinfo->volume_id));         \ +                if ((len < 0) || (len >= PATH_MAX)) {                   \ +                        path[0] = 0;                                    \ +                }                                                       \          } while (0)  #define GLUSTERD_GET_DEFRAG_PID_FILE(path, volinfo, priv) do {          \                  char defrag_path[PATH_MAX];                             \ +                int32_t len;                                            \                  GLUSTERD_GET_DEFRAG_DIR(defrag_path, volinfo, priv);    \ -                snprintf (path, PATH_MAX, "%s/%s.pid", defrag_path,     \ -                           uuid_utoa(MY_UUID));                         \ +                len = snprintf (path, PATH_MAX, "%s/%s.pid",            \ +                                defrag_path, uuid_utoa(MY_UUID));       \ +                if ((len < 0) || (len >= PATH_MAX)) {                   \ +                        path[0] = 0;                                    \ +                }                                                       \          } while (0)  #define GLUSTERFS_GET_QUOTA_LIMIT_MOUNT_PIDFILE(pidfile, volname) {       \ @@ -796,15 +886,11 @@ do {                                                                       \          } while (0)  #define GLUSTERD_DUMP_PEERS(head, member, xpeers) do {                       \ -                glusterd_peerinfo_t  *_peerinfo                = NULL;       \ -                int                   index                    = 1;          \ -                char                  key[GF_DUMP_MAX_BUF_LEN] = {0,};       \ +                glusterd_peerinfo_t  *_peerinfo = NULL;                      \ +                int                   index     = 1;                         \ +                char                  *key      = NULL;                      \                                                                               \ -                if (!xpeers)                                                 \ -                        snprintf (key, sizeof (key), "glusterd.peer");       \ -                else                                                         \ -                        snprintf (key, sizeof (key),                         \ -                                  "glusterd.xaction_peer");                  \ +                key = xpeers ? "glusterd.xaction_peer" : "glusterd.peer";    \                                                                               \                  rcu_read_lock ();                                            \                  cds_list_for_each_entry_rcu (_peerinfo, head, member) {      \ diff --git a/xlators/storage/posix/src/posix-helpers.c b/xlators/storage/posix/src/posix-helpers.c index 236f2e61c33..b02adf308ff 100644 --- a/xlators/storage/posix/src/posix-helpers.c +++ b/xlators/storage/posix/src/posix-helpers.c @@ -2687,8 +2687,12 @@ posix_resolve_dirgfid_to_path (const uuid_t dirgfid, const char *brick_path,          (void) snprintf (gpath, PATH_MAX, "%s/.glusterfs/", brick_path);          while (!(__is_root_gfid (pargfid))) { -                snprintf (dir_handle, PATH_MAX, "%s/%02x/%02x/%s", gpath, -                          pargfid[0], pargfid[1], uuid_utoa (pargfid)); +                len = snprintf (dir_handle, PATH_MAX, "%s/%02x/%02x/%s", gpath, +                                pargfid[0], pargfid[1], uuid_utoa (pargfid)); +                if ((len < 0) || (len >= PATH_MAX)) { +                        ret = -1; +                        goto out; +                }                  len = sys_readlink (dir_handle, linkname, PATH_MAX);                  if (len < 0) { @@ -2707,10 +2711,14 @@ posix_resolve_dirgfid_to_path (const uuid_t dirgfid, const char *brick_path,                  dir_name = strtok_r (NULL, "/", &saveptr);                  if (strlen(pre_dir_name) != 0) { /* Remove '/' at the end */ -                        snprintf (result, PATH_MAX, "%s/%s", dir_name, -                                  pre_dir_name); +                        len = snprintf (result, PATH_MAX, "%s/%s", dir_name, +                                        pre_dir_name);                  } else { -                        snprintf (result, PATH_MAX, "%s", dir_name); +                        len = snprintf (result, PATH_MAX, "%s", dir_name); +                } +                if ((len < 0) || (len >= PATH_MAX)) { +                        ret = -1; +                        goto out;                  }                  strncpy (pre_dir_name, result, sizeof(pre_dir_name)); @@ -2720,12 +2728,20 @@ posix_resolve_dirgfid_to_path (const uuid_t dirgfid, const char *brick_path,          }          if (bname) { -                snprintf (result1, PATH_MAX, "/%s/%s", result, bname); +                len = snprintf (result1, PATH_MAX, "/%s/%s", result, bname);          } else { -                snprintf (result1, PATH_MAX, "/%s", result); +                len = snprintf (result1, PATH_MAX, "/%s", result); +        } +        if ((len < 0) || (len >= PATH_MAX)) { +                ret = -1; +                goto out;          }          *path = gf_strdup (result1); +        if (*path == NULL) { +                ret = -1; +                goto out; +        }  out:          return ret;  | 
