@@ -2254,12 +2254,17 @@ static ssize_t nvmet_root_discovery_nqn_store(struct config_item *item,
2254
2254
const char * page , size_t count )
2255
2255
{
2256
2256
struct list_head * entry ;
2257
+ char * old_nqn , * new_nqn ;
2257
2258
size_t len ;
2258
2259
2259
2260
len = strcspn (page , "\n" );
2260
2261
if (!len || len > NVMF_NQN_FIELD_LEN - 1 )
2261
2262
return - EINVAL ;
2262
2263
2264
+ new_nqn = kstrndup (page , len , GFP_KERNEL );
2265
+ if (!new_nqn )
2266
+ return - ENOMEM ;
2267
+
2263
2268
down_write (& nvmet_config_sem );
2264
2269
list_for_each (entry , & nvmet_subsystems_group .cg_children ) {
2265
2270
struct config_item * item =
@@ -2268,13 +2273,15 @@ static ssize_t nvmet_root_discovery_nqn_store(struct config_item *item,
2268
2273
if (!strncmp (config_item_name (item ), page , len )) {
2269
2274
pr_err ("duplicate NQN %s\n" , config_item_name (item ));
2270
2275
up_write (& nvmet_config_sem );
2276
+ kfree (new_nqn );
2271
2277
return - EINVAL ;
2272
2278
}
2273
2279
}
2274
- memset ( nvmet_disc_subsys -> subsysnqn , 0 , NVMF_NQN_FIELD_LEN ) ;
2275
- memcpy ( nvmet_disc_subsys -> subsysnqn , page , len ) ;
2280
+ old_nqn = nvmet_disc_subsys -> subsysnqn ;
2281
+ nvmet_disc_subsys -> subsysnqn = new_nqn ;
2276
2282
up_write (& nvmet_config_sem );
2277
2283
2284
+ kfree (old_nqn );
2278
2285
return len ;
2279
2286
}
2280
2287
0 commit comments