mirror of
https://github.com/SCST-project/scst.git
synced 2026-10-22 06:02:33 +00:00
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:
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user