Function report

Linux Kernel

v5.5.9

Brick Technologies Co., Ltd

Source Code:fs\readdir.c Create Date:2022-07-28 20:06:37
Last Modify:2020-03-12 14:18:49 Copyright©Brick
home page Tree
Annotation kernel can get tool activityDownload SCCTChinese

Name:filldir64

Proto:static int filldir64(struct dir_context *ctx, const char *name, int namlen, loff_t offset, u64 ino, unsigned int d_type)

Type:int

Parameter:

TypeParameterName
struct dir_context *ctx
const char *name
intnamlen
loff_toffset
u64ino
unsigned intd_type
312  __user * dirent
313  buf = container_of - cast a member of a structure out to the containing structure*@ptr: the pointer to the member.*@type: the type of the container struct this is embedded in.*@member: the name of the member within the struct.(ctx, structgetdents_callback64, ctx)
315  reclen = @a is a power of 2 value (offsetof(structlinux_dirent64, d_name) + namlen + 1, sizeof(u64))
319  error = POSIX says that a dirent name cannot contain NULL or a '/'.* It's not 100% clear what we should really do in this case.* The filesystem is clearly corrupted, but returning a hard* error means that you now don't see any of the other names
320  If Value for the false possibility is greater at compile time(error) Then Return error
322  error = -EINVAL
323  If reclen > count Then Return -EINVAL
325  prev_reclen = prev_reclen
326  If prev_reclen && signal_pending(current process) Then Return -EINTR
328  dirent = current_dir
329  prev = dirent - prev_reclen
330  If Not The "unsafe" user accesses aren't really "unsafe", but the naming* is a big fat warning: you have to not only do the access_ok()* checking before using them, but you have to surround them with the* user_access_begin/end() pair. Then Go to efault
334  unsafe_put_user(offset, & d_off, efault_end)
335  unsafe_put_user(ino, & d_ino, efault_end)
336  unsafe_put_user(reclen, & d_reclen, efault_end)
337  unsafe_put_user(d_type, & d_type, efault_end)
338  Note the "unsafe_put_user() semantics: we goto a* label for errors.(d_name, name, namlen, efault_end)
339  user_access_end()
341  prev_reclen = reclen
342  current_dir = dirent + reclen
343  count -= reclen
344  Return 0
346  efault_end :
347  user_access_end()
348  efault :
349  error = -EFAULT
350  Return -EFAULT