seq_file: fix NULL pointer arithmetic warning
PATCH v2 1/1 seq_file: fix NULL pointer arithmetic warning
Implement conditional logic in order to replace NULL pointer arithmetic.
The use of NULL pointer arithmetic was pointed out by clang with the following warning:
fs/kernfs/file.c:128:15: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
return NULL + !*ppos;
~~~~ ^
fs/seq_file.c:559:14: warning: performing pointer arithmetic on a
null pointer has undefined behavior [-Wnull-pointer-arithmetic]
return NULL + (*pos == 0);---
V1 -> V2:
- Use SEQ_START_TOKEN instead of open-coding it
- kernfs_seq_start call single_start instead of open-coding it
--- fs/kernfs/file.c | 7 +------ fs/seq_file.c | 5 +++-- include/linux/seq_file.h | 1 + 3 files changed, 5 insertions(+), 8 deletions(-)
fs/kernfs/file.c +1 -6
@@ -120,13 +120,8 @@ static void *kernfs_seq_start(struct seq_file *sf, loff_t *ppos)if (next ==ERR_PTR (-ENODEV ))kernfs_seq_stop_active (sf, next);return next; - }else { -/* -* The same behavior and code as single_open(). Returns -* !NULL if pos is at the beginning; otherwise, NULL. -*/ -return NULL + !*ppos; } +return single_start (sf, ppos); }static void *kernfs_seq_next (struct seq_file *sf,void *v,loff_t *ppos)
fs/seq_file.c +3 -2
@@ -554,10 +554,11 @@ int seq_dentry(struct seq_file *m, struct dentry *dentry, const char *esc) }EXPORT_SYMBOL (seq_dentry); -static void *single_start (struct seq_file *p,loff_t *pos) +void *single_start (struct seq_file *p,loff_t *pos) { -return NULL + (*pos ==0 ); +return *pos ?NULL :SEQ_START_TOKEN ; } +EXPORT_SYMBOL (single_start);static void *single_next (struct seq_file *p,void *v,loff_t *pos) {
include/linux/seq_file.h +1 -0
@@ -162,6 +162,7 @@ int seq_dentry(struct seq_file *, struct dentry *, const char *);int seq_path_root (struct seq_file *m,const struct path *path,const struct path *root,const char *esc); +void *single_start (struct seq_file *,loff_t *);int single_open (struct file *,int (*)(struct seq_file *,void *),void *);int single_open_size (struct file *,int (*)(struct seq_file *,void *),void *,size_t );int single_release (struct inode *,struct file *);
Signature · 1 line
2.34.1
Quoted 1 line · Maíra Canal
+EXPORT_SYMBOL(single_start);
kernfs is a 'bool', which means it can't be a module, so there's no need to EXPORT this symbol.
Em seg., 31 de jan. de 2022 às 14:59, Matthew Wilcox <[email protected]> escreveu:
Quoted 6 lines · Maíra Canal
Quoted 1 line
+EXPORT_SYMBOL(single_start);
kernfs is a 'bool', which means it can't be a module, so there's no need to EXPORT this symbol.
Thank you for the feedback! Still learning...