diff --git a/src/test/pmempool_create/TEST14 b/src/test/pmempool_create/TEST14 new file mode 100755 index 0000000000000000000000000000000000000000..c8468532cf38ed422c2f4964a242dfe95184041a --- /dev/null +++ b/src/test/pmempool_create/TEST14 @@ -0,0 +1,73 @@ +#!/usr/bin/env bash +# +# Copyright 2019, Intel Corporation +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# +# pmempool_create/TEST14 -- test pmemobj pool creation with default and custom layout +# using increased verbosity level +# + +. ../unittest/unittest.sh + +require_test_type medium + +require_fs_type any + +setup + +LOG=out${UNITTEST_NUM}.log +ERR_LOG=err${UNITTEST_NUM}.log + +# test default layout +expect_normal_exit "$PMEMPOOL$EXESUFFIX create obj -v $DIR/pool.obj >> $LOG" + +# test custom layout +expect_normal_exit "$PMEMPOOL$EXESUFFIX create obj -v --layout=moose $DIR/pool2.obj >> $LOG" + +# test max layout + +# MAX_LAYOUT is equal to PMEMOBJ_MAX_LAYOUT (i.e. 1024) macro's value +# reduced by 1 for terminating null byte +MAX_LAYOUT=1023 + +LAYOUT=$(head -c $MAX_LAYOUT < /dev/zero | tr '\0' '\170') + +expect_normal_exit "$PMEMPOOL$EXESUFFIX create obj -v --layout=$LAYOUT $DIR/pool3.obj >> $LOG" + +# test too long layout + +INVALID_LAYOUT=$(head -c $((MAX_LAYOUT+1)) < /dev/zero | tr '\0' '\170') + +expect_abnormal_exit "$PMEMPOOL$EXESUFFIX create obj -v --layout=$INVALID_LAYOUT $DIR/pool4.obj 2> $ERR_LOG" + +check + +pass diff --git a/src/test/pmempool_create/TEST14.PS1 b/src/test/pmempool_create/TEST14.PS1 new file mode 100644 index 0000000000000000000000000000000000000000..9808cfcd88ce1204f9847ffc8c75e6da878b5f57 --- /dev/null +++ b/src/test/pmempool_create/TEST14.PS1 @@ -0,0 +1,72 @@ +# +# Copyright 2019, Intel Corporation +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# +# pmempool_create/TEST14 -- test pmemobj pool creation with default and custom layout +# using increased verbosity level +# + +. ../unittest/unittest.ps1 + +require_test_type medium + +require_fs_type any + +setup + +$LOG = "out${Env:UNITTEST_NUM}.log" +$ERR_LOG = "err${Env:UNITTEST_NUM}.log" + +# test default layout +expect_normal_exit $PMEMPOOL$EXESUFFIX create obj -v $DIR\pool.obj >> $LOG + +# test custom layout +expect_normal_exit $PMEMPOOL$EXESUFFIX create obj -v --layout=moose $DIR\pool2.obj >> $LOG + +# test max layout + +# MAX_LAYOUT is equal to PMEMOBJ_MAX_LAYOUT (i.e. 1024) macro's value +# reduced by 1 for terminating null byte +$MAX_LAYOUT = 1023 + +$LAYOUT = "x" * $MAX_LAYOUT + +expect_normal_exit $PMEMPOOL$EXESUFFIX create obj -v --layout=$LAYOUT $DIR/pool3.obj >> $LOG + +# test too long layout + +$INVALID_LAYOUT= "x" * ($MAX_LAYOUT + 1) + +expect_abnormal_exit cmd /c $PMEMPOOL$EXESUFFIX create obj -v --layout=$INVALID_LAYOUT $DIR/pool4.obj `>`> $LOG 2`>$ERR_LOG + +check + +pass diff --git a/src/test/pmempool_create/err14.log.match b/src/test/pmempool_create/err14.log.match new file mode 100644 index 0000000000000000000000000000000000000000..148ce89b4572f5d0a86a5dae6cf4f8810a8b0cc8 --- /dev/null +++ b/src/test/pmempool_create/err14.log.match @@ -0,0 +1 @@ +$(*)error: Layout name is too long, maximum number of characters (including the terminating null byte) is 1024 diff --git a/src/test/pmempool_create/out14.log.match b/src/test/pmempool_create/out14.log.match new file mode 100644 index 0000000000000000000000000000000000000000..59af0b20997489d2df8fd8ed413bde87552018a4 --- /dev/null +++ b/src/test/pmempool_create/out14.log.match @@ -0,0 +1,18 @@ +No size option passed - picking minimum pool size. +Creating pool: $(nW)pool.obj + type : obj + size : 8.0M [8388608] + mode : 0664 + layout: '' +No size option passed - picking minimum pool size. +Creating pool: $(nW)pool2.obj + type : obj + size : 8.0M [8388608] + mode : 0664 + layout: 'moose' +No size option passed - picking minimum pool size. +Creating pool: $(nW)pool3.obj + type : obj + size : 8.0M [8388608] + mode : 0664 + layout: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' diff --git a/src/tools/pmempool/create.c b/src/tools/pmempool/create.c index 3867c3f8388811fa60d9c584026925d64227a0c3..63c3ea3a170d9eb4ad27ea5b9d0f029de6b0e641 100644 --- a/src/tools/pmempool/create.c +++ b/src/tools/pmempool/create.c @@ -531,6 +531,21 @@ pmempool_create_func(const char *appname, int argc, char *argv[]) return -1; } } + + if (PMEM_POOL_TYPE_OBJ == pc.params.type && pc.layout != NULL) { + size_t max_layout = PMEMOBJ_MAX_LAYOUT; + + if (strlen(pc.layout) >= max_layout) { + outv_err( + "Layout name is too long, maximum number of characters (including the terminating null byte) is %zu\n", + max_layout); + return -1; + } + + size_t len = sizeof(pc.params.obj.layout); + strncpy(pc.params.obj.layout, pc.layout, len); + pc.params.obj.layout[len - 1] = '\0'; + } } else if (pc.inherit_fname) { pc.params.type = pc.inherit_params.type; } else { @@ -569,15 +584,6 @@ pmempool_create_func(const char *appname, int argc, char *argv[]) return -1; } - size_t max_layout = PMEMOBJ_MAX_LAYOUT; - - if (pc.layout && strlen(pc.layout) >= max_layout) { - outv_err("Layout name is too long, maximum number of characters" - " (including the terminating null byte) is %zu\n", - max_layout); - return -1; - } - if (pc.inherit_fname) { if (!pc.str_size && !pc.max_size) pc.params.size = pc.inherit_params.size;