scst: Copy bounded strings and protocol fragments explicitly

Copy iSCSI text fragments as bytes: their lengths are bounded by the
remaining strlen, while framing emits separators and terminators
separately. Keep virtual-device name rejection and use the existing
strscpy compatibility helper for accepted bounded names.

Reuse checked redirect and directory-entry lengths, including the NUL,
and copy the fixed CHAP prefix by its literal size. Replace command-line
strncpy/termination pairs with snprintf while retaining existing
truncation and zero-filled padding. Copy terminated fixed-width event
fields and the constant core issuer by their exact extents.

Checkpatch reports STRNCPY:

  Prefer strscpy, strscpy_pad, or __nonstring over strncpy

Checkpatch reports STRCPY:

  Prefer strscpy over strcpy
This commit is contained in:
Gleb Chesnokov
2026-10-21 22:12:25 +03:00
parent 4e4d995df7
commit 0848c42fe2
8 changed files with 25 additions and 29 deletions
+1 -1
View File
@@ -494,7 +494,7 @@ static int chap_initiator_auth_create_challenge(struct connection *conn)
return CHAP_TARGET_ERROR;
p = text;
strcpy(p, "0x");
memcpy(p, "0x", sizeof("0x"));
p += 2;
for (i = 0; i < conn->auth.chap.challenge_size; i++) {
if (chap_rand(&random) < 0) {
+4 -2
View File
@@ -694,6 +694,7 @@ static int handle_target_redirect(struct target *target, char *p)
{
int res = 0;
char *addr, *type, *t, *port;
size_t addr_len;
int port_num = ISCSI_LISTEN_PORT;
int type_num;
union {
@@ -738,7 +739,8 @@ static int handle_target_redirect(struct target *target, char *p)
}
}
if (strlen(addr) >= sizeof(target->redirect.addr)) {
addr_len = strlen(addr);
if (addr_len >= sizeof(target->redirect.addr)) {
log_error("Too long addr %s, max allowed %zd", addr,
sizeof(target->redirect.addr)-1);
res = -ERANGE;
@@ -776,7 +778,7 @@ static int handle_target_redirect(struct target *target, char *p)
(type_num == ISCSI_STATUS_TGT_MOVED_TEMP) ? "temporarily" : "permanently",
addr, port_num);
strcpy(target->redirect.addr, addr);
memcpy(target->redirect.addr, addr, addr_len + 1);
target->redirect.port = port_num;
target->redirect.type = type_num;
+2 -2
View File
@@ -153,7 +153,7 @@ void text_key_add(struct connection *conn, const char *key, const char *value)
switch (stage) {
case 0:
sz = min_t(int, data_sz - seg->len, keylen - off);
strncpy(seg->data + seg->len, key + off, sz);
memcpy(seg->data + seg->len, key + off, sz);
if (sz == data_sz - seg->len) {
off += sz;
if (keylen - off == 0) {
@@ -173,7 +173,7 @@ void text_key_add(struct connection *conn, const char *key, const char *value)
break;
case 2:
sz = min_t(int, data_sz - seg->len, valuelen - off);
strncpy(seg->data + seg->len, value + off, sz);
memcpy(seg->data + seg->len, value + off, sz);
off += sz;
if (valuelen - off == 0) {
off = 0;
+1 -1
View File
@@ -6585,7 +6585,7 @@ static int vdev_create_node(struct scst_dev_type *devt, const char *name, int no
res = -EINVAL;
goto out_free;
}
strcpy(virt_dev->name, name);
strscpy(virt_dev->name, name, sizeof(virt_dev->name));
dev_id_num = vdisk_gen_dev_id_num(virt_dev->name);
+5 -3
View File
@@ -720,6 +720,7 @@ scst_dlm_filldir(struct dir_context *arg, const char *name_arg,
char **entries = &ctx->entries;
#endif
int i;
size_t len;
snprintf(name, sizeof(name), "%.*s", name_len, name_arg);
if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0 || !*entries)
@@ -728,13 +729,14 @@ scst_dlm_filldir(struct dir_context *arg, const char *name_arg,
;
i = p - *entries;
q = *entries;
*entries = krealloc(q, i + strlen(name) + 2, GFP_KERNEL);
len = strlen(name);
*entries = krealloc(q, i + len + 2, GFP_KERNEL);
if (!*entries) {
kfree(q);
goto out;
}
strcpy(*entries + i, name);
i += strlen(name);
memcpy(*entries + i, name, len + 1);
i += len;
(*entries)[i + 1] = '\0';
out:
+6 -10
View File
@@ -142,10 +142,8 @@ int main(int argc, char **argv)
exit(1);
}
}
strncpy(allowed_events[allowed_events_num].issuer_name,
optarg, sizeof(allowed_events[allowed_events_num].issuer_name));
allowed_events[allowed_events_num].issuer_name[
sizeof(allowed_events[allowed_events_num].issuer_name)-1] = '\0';
snprintf(allowed_events[allowed_events_num].issuer_name,
sizeof(allowed_events[allowed_events_num].issuer_name), "%s", optarg);
break;
case 'n':
non_blocking = 1;
@@ -198,9 +196,8 @@ int main(int argc, char **argv)
allowed_events[i].issuer_name);
memset(&e, 0, sizeof(e));
e.event_code = allowed_events[i].event_code;
strncpy(e.issuer_name, allowed_events[i].issuer_name,
sizeof(e.issuer_name));
e.issuer_name[sizeof(e.issuer_name)-1] = '\0';
memcpy(e.issuer_name, allowed_events[i].issuer_name,
sizeof(e.issuer_name));
res = ioctl(event_fd, SCST_EVENT_ALLOW_EVENT, &e);
if (res != 0) {
@@ -311,9 +308,8 @@ again_poll:
allowed_events[0].issuer_name);
memset(&e, 0, sizeof(e));
e.event_code = allowed_events[0].event_code;
strncpy(e.issuer_name, allowed_events[0].issuer_name,
sizeof(e.issuer_name));
e.issuer_name[sizeof(e.issuer_name)-1] = '\0';
memcpy(e.issuer_name, allowed_events[0].issuer_name,
sizeof(e.issuer_name));
res = ioctl(event_fd, SCST_EVENT_DISALLOW_EVENT, &e);
if (res != 0) {
+2 -4
View File
@@ -381,12 +381,10 @@ static int start(int argc, char **argv)
memset(&desc, 0, sizeof(desc));
desc.license_str = (unsigned long)"GPL";
desc.version_str = (unsigned long)DEV_USER_VERSION;
strncpy(desc.name, devs[i].name, sizeof(desc.name)-1);
desc.name[sizeof(desc.name)-1] = '\0';
snprintf(desc.name, sizeof(desc.name), "%s", devs[i].name);
if (sgv_shared) {
desc.sgv_shared = 1;
strncpy(desc.sgv_name, devs[0].name, sizeof(desc.sgv_name)-1);
desc.sgv_name[sizeof(desc.sgv_name)-1] = '\0';
snprintf(desc.sgv_name, sizeof(desc.sgv_name), "%s", devs[0].name);
}
desc.sgv_single_alloc_pages = sgv_single_alloc_pages;
desc.sgv_purge_interval = sgv_purge_interval;
+4 -6
View File
@@ -307,9 +307,8 @@ static int stpg_event_loop(void)
memset(&e1, 0, sizeof(e1));
e1.event_code = SCST_EVENT_STPG_USER_INVOKE;
strncpy(e1.issuer_name, SCST_EVENT_SCST_CORE_ISSUER,
sizeof(e1.issuer_name));
e1.issuer_name[sizeof(e1.issuer_name)-1] = '\0';
memcpy(e1.issuer_name, SCST_EVENT_SCST_CORE_ISSUER,
sizeof(SCST_EVENT_SCST_CORE_ISSUER));
PRINT_INFO("Setting allowed event code %u, issuer_name %s",
e1.event_code, e1.issuer_name);
@@ -323,9 +322,8 @@ static int stpg_event_loop(void)
}
e1.event_code = SCST_EVENT_TM_FN_RECEIVED;
strncpy(e1.issuer_name, SCST_EVENT_SCST_CORE_ISSUER,
sizeof(e1.issuer_name));
e1.issuer_name[sizeof(e1.issuer_name) - 1] = '\0';
memcpy(e1.issuer_name, SCST_EVENT_SCST_CORE_ISSUER,
sizeof(SCST_EVENT_SCST_CORE_ISSUER));
PRINT_INFO("Setting allowed event code %u, issuer_name %s",
e1.event_code, e1.issuer_name);