I guess the GCC warning is a false positive? See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116494
On Sat, Jan 04, 2025 at 07:26:27AM +0800, kernel test robot wrote: > tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git > master > head: 0bc21e701a6ffacfdde7f04f87d664d82e8a13bf > commit: ae271c1b14de343b888e77f74f640e3dcbdeb4c9 landlock: Add ruleset and > domain management > date: 3 years, 8 months ago > config: csky-randconfig-r026-20230729 > (https://download.01.org/0day-ci/archive/20250104/[email protected]/config) > compiler: csky-linux-gcc (GCC) 12.4.0 > reproduce (this is a W=1 build): > (https://download.01.org/0day-ci/archive/20250104/[email protected]/reproduce) > > If you fix the issue in a separate patch/commit (i.e. not just a new version > of > the same patch/commit), kindly add following tags > | Reported-by: kernel test robot <[email protected]> > | Closes: > https://lore.kernel.org/oe-kbuild-all/[email protected]/ > > All warnings (new ones prefixed by >>): > > security/landlock/ruleset.c: In function 'create_rule': > >> security/landlock/ruleset.c:96:9: warning: 'memcpy' accessing 4294967295 > >> bytes at offsets 20 and 0 overlaps 6442450943 bytes at offset -2147483648 > >> [-Wrestrict] > 96 | memcpy(new_rule->layers, layers, > | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > 97 | flex_array_size(new_rule, layers, > num_layers)); > | > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > -- > Use of uninitialized value $param in regexp compilation at > scripts/kernel-doc line 1532, <IN_FILE> line 146. > Use of uninitialized value $actual in substitution (s///) at > scripts/kernel-doc line 1484, <IN_FILE> line 146. > Use of uninitialized value $actual in substitution (s///) at > scripts/kernel-doc line 1484, <IN_FILE> line 146. > Use of uninitialized value $param in substitution (s///) at > scripts/kernel-doc line 1588, <IN_FILE> line 146. > Use of uninitialized value $param in pattern match (m//) at > scripts/kernel-doc line 1616, <IN_FILE> line 146. > Use of uninitialized value $param in hash element at scripts/kernel-doc > line 1626, <IN_FILE> line 146. > Use of uninitialized value $param in pattern match (m//) at > scripts/kernel-doc line 1626, <IN_FILE> line 146. > Use of uninitialized value $param in hash element at scripts/kernel-doc > line 1627, <IN_FILE> line 146. > Use of uninitialized value $param in pattern match (m//) at > scripts/kernel-doc line 1629, <IN_FILE> line 146. > Use of uninitialized value $param in concatenation (.) or string at > scripts/kernel-doc line 1630, <IN_FILE> line 146. > >> security/landlock/ruleset.c:146: warning: Function parameter or struct > >> member '' not described in 'insert_rule' > Use of uninitialized value $param in hash element at scripts/kernel-doc > line 1645, <IN_FILE> line 146. > Use of uninitialized value $parameterlist[2] in join or string at > scripts/kernel-doc line 1806, <IN_FILE> line 146. > >> security/landlock/ruleset.c:146: warning: Excess function parameter > >> 'layers' description in 'insert_rule' > > > vim +/memcpy +96 security/landlock/ruleset.c > > 68 > 69 static struct landlock_rule *create_rule( > 70 struct landlock_object *const object, > 71 const struct landlock_layer (*const layers)[], > 72 const u32 num_layers, > 73 const struct landlock_layer *const new_layer) > 74 { > 75 struct landlock_rule *new_rule; > 76 u32 new_num_layers; > 77 > 78 build_check_rule(); > 79 if (new_layer) { > 80 /* Should already be checked by > landlock_merge_ruleset(). */ > 81 if (WARN_ON_ONCE(num_layers >= > LANDLOCK_MAX_NUM_LAYERS)) > 82 return ERR_PTR(-E2BIG); > 83 new_num_layers = num_layers + 1; > 84 } else { > 85 new_num_layers = num_layers; > 86 } > 87 new_rule = kzalloc(struct_size(new_rule, layers, > new_num_layers), > 88 GFP_KERNEL_ACCOUNT); > 89 if (!new_rule) > 90 return ERR_PTR(-ENOMEM); > 91 RB_CLEAR_NODE(&new_rule->node); > 92 landlock_get_object(object); > 93 new_rule->object = object; > 94 new_rule->num_layers = new_num_layers; > 95 /* Copies the original layer stack. */ > > 96 memcpy(new_rule->layers, layers, > 97 flex_array_size(new_rule, layers, > num_layers)); > 98 if (new_layer) > 99 /* Adds a copy of @new_layer on the layer > stack. */ > 100 new_rule->layers[new_rule->num_layers - 1] = > *new_layer; > 101 return new_rule; > 102 } > 103 > 104 static void free_rule(struct landlock_rule *const rule) > 105 { > 106 might_sleep(); > 107 if (!rule) > 108 return; > 109 landlock_put_object(rule->object); > 110 kfree(rule); > 111 } > 112 > 113 static void build_check_ruleset(void) > 114 { > 115 const struct landlock_ruleset ruleset = { > 116 .num_rules = ~0, > 117 .num_layers = ~0, > 118 }; > 119 > 120 BUILD_BUG_ON(ruleset.num_rules < > LANDLOCK_MAX_NUM_RULES); > 121 BUILD_BUG_ON(ruleset.num_layers < > LANDLOCK_MAX_NUM_LAYERS); > 122 } > 123 > 124 /** > 125 * insert_rule - Create and insert a rule in a ruleset > 126 * > 127 * @ruleset: The ruleset to be updated. > 128 * @object: The object to build the new rule with. The > underlying kernel > 129 * object must be held by the caller. > 130 * @layers: One or multiple layers to be copied into the new > rule. > 131 * @num_layers: The number of @layers entries. > 132 * > 133 * When user space requests to add a new rule to a ruleset, > @layers only > 134 * contains one entry and this entry is not assigned to any > level. In this > 135 * case, the new rule will extend @ruleset, similarly to a > boolean OR between > 136 * access rights. > 137 * > 138 * When merging a ruleset in a domain, or copying a domain, > @layers will be > 139 * added to @ruleset as new constraints, similarly to a boolean > AND between > 140 * access rights. > 141 */ > 142 static int insert_rule(struct landlock_ruleset *const ruleset, > 143 struct landlock_object *const object, > 144 const struct landlock_layer (*const layers)[], > 145 size_t num_layers) > > 146 { > 147 struct rb_node **walker_node; > 148 struct rb_node *parent_node = NULL; > 149 struct landlock_rule *new_rule; > 150 > 151 might_sleep(); > 152 lockdep_assert_held(&ruleset->lock); > 153 if (WARN_ON_ONCE(!object || !layers)) > 154 return -ENOENT; > 155 walker_node = &(ruleset->root.rb_node); > 156 while (*walker_node) { > 157 struct landlock_rule *const this = > rb_entry(*walker_node, > 158 struct landlock_rule, node); > 159 > 160 if (this->object != object) { > 161 parent_node = *walker_node; > 162 if (this->object < object) > 163 walker_node = > &((*walker_node)->rb_right); > 164 else > 165 walker_node = > &((*walker_node)->rb_left); > 166 continue; > 167 } > 168 > 169 /* Only a single-level layer should match an > existing rule. */ > 170 if (WARN_ON_ONCE(num_layers != 1)) > 171 return -EINVAL; > 172 > 173 /* If there is a matching rule, updates it. */ > 174 if ((*layers)[0].level == 0) { > 175 /* > 176 * Extends access rights when the > request comes from > 177 * landlock_add_rule(2), i.e. @ruleset > is not a domain. > 178 */ > 179 if (WARN_ON_ONCE(this->num_layers != 1)) > 180 return -EINVAL; > 181 if (WARN_ON_ONCE(this->layers[0].level > != 0)) > 182 return -EINVAL; > 183 this->layers[0].access |= > (*layers)[0].access; > 184 return 0; > 185 } > 186 > 187 if (WARN_ON_ONCE(this->layers[0].level == 0)) > 188 return -EINVAL; > 189 > 190 /* > 191 * Intersects access rights when it is a merge > between a > 192 * ruleset and a domain. > 193 */ > 194 new_rule = create_rule(object, &this->layers, > this->num_layers, > 195 &(*layers)[0]); > 196 if (IS_ERR(new_rule)) > 197 return PTR_ERR(new_rule); > 198 rb_replace_node(&this->node, &new_rule->node, > &ruleset->root); > 199 free_rule(this); > 200 return 0; > 201 } > 202 > 203 /* There is no match for @object. */ > 204 build_check_ruleset(); > 205 if (ruleset->num_rules >= LANDLOCK_MAX_NUM_RULES) > 206 return -E2BIG; > 207 new_rule = create_rule(object, layers, num_layers, > NULL); > 208 if (IS_ERR(new_rule)) > 209 return PTR_ERR(new_rule); > 210 rb_link_node(&new_rule->node, parent_node, walker_node); > 211 rb_insert_color(&new_rule->node, &ruleset->root); > 212 ruleset->num_rules++; > 213 return 0; > 214 } > 215 > > -- > 0-DAY CI Kernel Test Service > https://github.com/intel/lkp-tests/wiki
