Commit d293d3af authored by Takashi Iwai's avatar Takashi Iwai Committed by Linus Torvalds

ocfs2: use scnprintf() for avoiding potential buffer overflow

Since snprintf() returns the would-be-output size instead of the actual
output size, the succeeding calls may go beyond the given buffer limit.
Fix it by replacing with scnprintf().
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Acked-by: default avatarJoseph Qi <joseph.qi@linux.alibaba.com>
Cc: Mark Fasheh <mark@fasheh.com>
Cc: Joel Becker <jlbec@evilplan.org>
Cc: Joseph Qi <jiangqi903@gmail.com>
Cc: Changwei Ge <gechangwei@live.cn>
Cc: Gang He <ghe@suse.com>
Cc: Jun Piao <piaojun@huawei.com>
Link: http://lkml.kernel.org/r/20200311093516.25300-1-tiwai@suse.deSigned-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 0434c9f4
...@@ -1307,7 +1307,7 @@ static int o2hb_debug_open(struct inode *inode, struct file *file) ...@@ -1307,7 +1307,7 @@ static int o2hb_debug_open(struct inode *inode, struct file *file)
case O2HB_DB_TYPE_REGION_NUMBER: case O2HB_DB_TYPE_REGION_NUMBER:
reg = (struct o2hb_region *)db->db_data; reg = (struct o2hb_region *)db->db_data;
out += snprintf(buf + out, PAGE_SIZE - out, "%d\n", out += scnprintf(buf + out, PAGE_SIZE - out, "%d\n",
reg->hr_region_num); reg->hr_region_num);
goto done; goto done;
...@@ -1317,12 +1317,12 @@ static int o2hb_debug_open(struct inode *inode, struct file *file) ...@@ -1317,12 +1317,12 @@ static int o2hb_debug_open(struct inode *inode, struct file *file)
/* If 0, it has never been set before */ /* If 0, it has never been set before */
if (lts) if (lts)
lts = jiffies_to_msecs(jiffies - lts); lts = jiffies_to_msecs(jiffies - lts);
out += snprintf(buf + out, PAGE_SIZE - out, "%lu\n", lts); out += scnprintf(buf + out, PAGE_SIZE - out, "%lu\n", lts);
goto done; goto done;
case O2HB_DB_TYPE_REGION_PINNED: case O2HB_DB_TYPE_REGION_PINNED:
reg = (struct o2hb_region *)db->db_data; reg = (struct o2hb_region *)db->db_data;
out += snprintf(buf + out, PAGE_SIZE - out, "%u\n", out += scnprintf(buf + out, PAGE_SIZE - out, "%u\n",
!!reg->hr_item_pinned); !!reg->hr_item_pinned);
goto done; goto done;
...@@ -1331,8 +1331,8 @@ static int o2hb_debug_open(struct inode *inode, struct file *file) ...@@ -1331,8 +1331,8 @@ static int o2hb_debug_open(struct inode *inode, struct file *file)
} }
while ((i = find_next_bit(map, db->db_len, i + 1)) < db->db_len) while ((i = find_next_bit(map, db->db_len, i + 1)) < db->db_len)
out += snprintf(buf + out, PAGE_SIZE - out, "%d ", i); out += scnprintf(buf + out, PAGE_SIZE - out, "%d ", i);
out += snprintf(buf + out, PAGE_SIZE - out, "\n"); out += scnprintf(buf + out, PAGE_SIZE - out, "\n");
done: done:
i_size_write(inode, out); i_size_write(inode, out);
......
...@@ -443,8 +443,8 @@ static int o2net_fill_bitmap(char *buf, int len) ...@@ -443,8 +443,8 @@ static int o2net_fill_bitmap(char *buf, int len)
o2net_fill_node_map(map, sizeof(map)); o2net_fill_node_map(map, sizeof(map));
while ((i = find_next_bit(map, O2NM_MAX_NODES, i + 1)) < O2NM_MAX_NODES) while ((i = find_next_bit(map, O2NM_MAX_NODES, i + 1)) < O2NM_MAX_NODES)
out += snprintf(buf + out, PAGE_SIZE - out, "%d ", i); out += scnprintf(buf + out, PAGE_SIZE - out, "%d ", i);
out += snprintf(buf + out, PAGE_SIZE - out, "\n"); out += scnprintf(buf + out, PAGE_SIZE - out, "\n");
return out; return out;
} }
......
This diff is collapsed.
...@@ -220,31 +220,31 @@ static int ocfs2_osb_dump(struct ocfs2_super *osb, char *buf, int len) ...@@ -220,31 +220,31 @@ static int ocfs2_osb_dump(struct ocfs2_super *osb, char *buf, int len)
int i, out = 0; int i, out = 0;
unsigned long flags; unsigned long flags;
out += snprintf(buf + out, len - out, out += scnprintf(buf + out, len - out,
"%10s => Id: %-s Uuid: %-s Gen: 0x%X Label: %-s\n", "%10s => Id: %-s Uuid: %-s Gen: 0x%X Label: %-s\n",
"Device", osb->dev_str, osb->uuid_str, "Device", osb->dev_str, osb->uuid_str,
osb->fs_generation, osb->vol_label); osb->fs_generation, osb->vol_label);
out += snprintf(buf + out, len - out, out += scnprintf(buf + out, len - out,
"%10s => State: %d Flags: 0x%lX\n", "Volume", "%10s => State: %d Flags: 0x%lX\n", "Volume",
atomic_read(&osb->vol_state), osb->osb_flags); atomic_read(&osb->vol_state), osb->osb_flags);
out += snprintf(buf + out, len - out, out += scnprintf(buf + out, len - out,
"%10s => Block: %lu Cluster: %d\n", "Sizes", "%10s => Block: %lu Cluster: %d\n", "Sizes",
osb->sb->s_blocksize, osb->s_clustersize); osb->sb->s_blocksize, osb->s_clustersize);
out += snprintf(buf + out, len - out, out += scnprintf(buf + out, len - out,
"%10s => Compat: 0x%X Incompat: 0x%X " "%10s => Compat: 0x%X Incompat: 0x%X "
"ROcompat: 0x%X\n", "ROcompat: 0x%X\n",
"Features", osb->s_feature_compat, "Features", osb->s_feature_compat,
osb->s_feature_incompat, osb->s_feature_ro_compat); osb->s_feature_incompat, osb->s_feature_ro_compat);
out += snprintf(buf + out, len - out, out += scnprintf(buf + out, len - out,
"%10s => Opts: 0x%lX AtimeQuanta: %u\n", "Mount", "%10s => Opts: 0x%lX AtimeQuanta: %u\n", "Mount",
osb->s_mount_opt, osb->s_atime_quantum); osb->s_mount_opt, osb->s_atime_quantum);
if (cconn) { if (cconn) {
out += snprintf(buf + out, len - out, out += scnprintf(buf + out, len - out,
"%10s => Stack: %s Name: %*s " "%10s => Stack: %s Name: %*s "
"Version: %d.%d\n", "Cluster", "Version: %d.%d\n", "Cluster",
(*osb->osb_cluster_stack == '\0' ? (*osb->osb_cluster_stack == '\0' ?
...@@ -255,7 +255,7 @@ static int ocfs2_osb_dump(struct ocfs2_super *osb, char *buf, int len) ...@@ -255,7 +255,7 @@ static int ocfs2_osb_dump(struct ocfs2_super *osb, char *buf, int len)
} }
spin_lock_irqsave(&osb->dc_task_lock, flags); spin_lock_irqsave(&osb->dc_task_lock, flags);
out += snprintf(buf + out, len - out, out += scnprintf(buf + out, len - out,
"%10s => Pid: %d Count: %lu WakeSeq: %lu " "%10s => Pid: %d Count: %lu WakeSeq: %lu "
"WorkSeq: %lu\n", "DownCnvt", "WorkSeq: %lu\n", "DownCnvt",
(osb->dc_task ? task_pid_nr(osb->dc_task) : -1), (osb->dc_task ? task_pid_nr(osb->dc_task) : -1),
...@@ -264,32 +264,32 @@ static int ocfs2_osb_dump(struct ocfs2_super *osb, char *buf, int len) ...@@ -264,32 +264,32 @@ static int ocfs2_osb_dump(struct ocfs2_super *osb, char *buf, int len)
spin_unlock_irqrestore(&osb->dc_task_lock, flags); spin_unlock_irqrestore(&osb->dc_task_lock, flags);
spin_lock(&osb->osb_lock); spin_lock(&osb->osb_lock);
out += snprintf(buf + out, len - out, "%10s => Pid: %d Nodes:", out += scnprintf(buf + out, len - out, "%10s => Pid: %d Nodes:",
"Recovery", "Recovery",
(osb->recovery_thread_task ? (osb->recovery_thread_task ?
task_pid_nr(osb->recovery_thread_task) : -1)); task_pid_nr(osb->recovery_thread_task) : -1));
if (rm->rm_used == 0) if (rm->rm_used == 0)
out += snprintf(buf + out, len - out, " None\n"); out += scnprintf(buf + out, len - out, " None\n");
else { else {
for (i = 0; i < rm->rm_used; i++) for (i = 0; i < rm->rm_used; i++)
out += snprintf(buf + out, len - out, " %d", out += scnprintf(buf + out, len - out, " %d",
rm->rm_entries[i]); rm->rm_entries[i]);
out += snprintf(buf + out, len - out, "\n"); out += scnprintf(buf + out, len - out, "\n");
} }
spin_unlock(&osb->osb_lock); spin_unlock(&osb->osb_lock);
out += snprintf(buf + out, len - out, out += scnprintf(buf + out, len - out,
"%10s => Pid: %d Interval: %lu\n", "Commit", "%10s => Pid: %d Interval: %lu\n", "Commit",
(osb->commit_task ? task_pid_nr(osb->commit_task) : -1), (osb->commit_task ? task_pid_nr(osb->commit_task) : -1),
osb->osb_commit_interval); osb->osb_commit_interval);
out += snprintf(buf + out, len - out, out += scnprintf(buf + out, len - out,
"%10s => State: %d TxnId: %lu NumTxns: %d\n", "%10s => State: %d TxnId: %lu NumTxns: %d\n",
"Journal", osb->journal->j_state, "Journal", osb->journal->j_state,
osb->journal->j_trans_id, osb->journal->j_trans_id,
atomic_read(&osb->journal->j_num_trans)); atomic_read(&osb->journal->j_num_trans));
out += snprintf(buf + out, len - out, out += scnprintf(buf + out, len - out,
"%10s => GlobalAllocs: %d LocalAllocs: %d " "%10s => GlobalAllocs: %d LocalAllocs: %d "
"SubAllocs: %d LAWinMoves: %d SAExtends: %d\n", "SubAllocs: %d LAWinMoves: %d SAExtends: %d\n",
"Stats", "Stats",
...@@ -299,7 +299,7 @@ static int ocfs2_osb_dump(struct ocfs2_super *osb, char *buf, int len) ...@@ -299,7 +299,7 @@ static int ocfs2_osb_dump(struct ocfs2_super *osb, char *buf, int len)
atomic_read(&osb->alloc_stats.moves), atomic_read(&osb->alloc_stats.moves),
atomic_read(&osb->alloc_stats.bg_extends)); atomic_read(&osb->alloc_stats.bg_extends));
out += snprintf(buf + out, len - out, out += scnprintf(buf + out, len - out,
"%10s => State: %u Descriptor: %llu Size: %u bits " "%10s => State: %u Descriptor: %llu Size: %u bits "
"Default: %u bits\n", "Default: %u bits\n",
"LocalAlloc", osb->local_alloc_state, "LocalAlloc", osb->local_alloc_state,
...@@ -307,7 +307,7 @@ static int ocfs2_osb_dump(struct ocfs2_super *osb, char *buf, int len) ...@@ -307,7 +307,7 @@ static int ocfs2_osb_dump(struct ocfs2_super *osb, char *buf, int len)
osb->local_alloc_bits, osb->local_alloc_default_bits); osb->local_alloc_bits, osb->local_alloc_default_bits);
spin_lock(&osb->osb_lock); spin_lock(&osb->osb_lock);
out += snprintf(buf + out, len - out, out += scnprintf(buf + out, len - out,
"%10s => InodeSlot: %d StolenInodes: %d, " "%10s => InodeSlot: %d StolenInodes: %d, "
"MetaSlot: %d StolenMeta: %d\n", "Steal", "MetaSlot: %d StolenMeta: %d\n", "Steal",
osb->s_inode_steal_slot, osb->s_inode_steal_slot,
...@@ -316,20 +316,20 @@ static int ocfs2_osb_dump(struct ocfs2_super *osb, char *buf, int len) ...@@ -316,20 +316,20 @@ static int ocfs2_osb_dump(struct ocfs2_super *osb, char *buf, int len)
atomic_read(&osb->s_num_meta_stolen)); atomic_read(&osb->s_num_meta_stolen));
spin_unlock(&osb->osb_lock); spin_unlock(&osb->osb_lock);
out += snprintf(buf + out, len - out, "OrphanScan => "); out += scnprintf(buf + out, len - out, "OrphanScan => ");
out += snprintf(buf + out, len - out, "Local: %u Global: %u ", out += scnprintf(buf + out, len - out, "Local: %u Global: %u ",
os->os_count, os->os_seqno); os->os_count, os->os_seqno);
out += snprintf(buf + out, len - out, " Last Scan: "); out += scnprintf(buf + out, len - out, " Last Scan: ");
if (atomic_read(&os->os_state) == ORPHAN_SCAN_INACTIVE) if (atomic_read(&os->os_state) == ORPHAN_SCAN_INACTIVE)
out += snprintf(buf + out, len - out, "Disabled\n"); out += scnprintf(buf + out, len - out, "Disabled\n");
else else
out += snprintf(buf + out, len - out, "%lu seconds ago\n", out += scnprintf(buf + out, len - out, "%lu seconds ago\n",
(unsigned long)(ktime_get_seconds() - os->os_scantime)); (unsigned long)(ktime_get_seconds() - os->os_scantime));
out += snprintf(buf + out, len - out, "%10s => %3s %10s\n", out += scnprintf(buf + out, len - out, "%10s => %3s %10s\n",
"Slots", "Num", "RecoGen"); "Slots", "Num", "RecoGen");
for (i = 0; i < osb->max_slots; ++i) { for (i = 0; i < osb->max_slots; ++i) {
out += snprintf(buf + out, len - out, out += scnprintf(buf + out, len - out,
"%10s %c %3d %10d\n", "%10s %c %3d %10d\n",
" ", " ",
(i == osb->slot_num ? '*' : ' '), (i == osb->slot_num ? '*' : ' '),
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment