From 514b0270dd0ac6e8ffce7a47d2bc570d815599f3 Mon Sep 17 00:00:00 2001 From: hannken Date: Fri, 11 Feb 2022 10:55:15 +0000 Subject: [PATCH] A component name is a counted string (cn_nameptr, cn_namelen), not a zero terminated string cn_nameptr. Change the following operations to work with counted strings: v7fs_file_lookup_by_name() v7fs_file_allocate() v7fs_file_deallocate() v7fs_directory_add_entry() v7fs_directory_remove_entry() v7fs_file_rename() v7fs_file_link() v7fs_dirent_filename() Adapt all vnode operations with component names as argument. --- sbin/fsck_v7fs/main.c | 8 ++-- sbin/fsck_v7fs/pathname.c | 8 ++-- sys/fs/v7fs/v7fs_dirent.c | 13 +++--- sys/fs/v7fs/v7fs_dirent.h | 4 +- sys/fs/v7fs/v7fs_file.c | 65 +++++++++++++--------------- sys/fs/v7fs/v7fs_file.h | 17 ++++---- sys/fs/v7fs/v7fs_file_util.c | 42 ++++++++++-------- sys/fs/v7fs/v7fs_vnops.c | 59 ++++++++++++++----------- usr.sbin/makefs/v7fs/v7fs_populate.c | 10 ++--- 9 files changed, 120 insertions(+), 106 deletions(-) diff --git a/sbin/fsck_v7fs/main.c b/sbin/fsck_v7fs/main.c index a7bbdd44d572..127595a58702 100644 --- a/sbin/fsck_v7fs/main.c +++ b/sbin/fsck_v7fs/main.c @@ -1,4 +1,4 @@ -/* $NetBSD: main.c,v 1.1 2011/06/27 11:52:58 uch Exp $ */ +/* $NetBSD: main.c,v 1.2 2022/02/11 10:55:15 hannken Exp $ */ /*- * Copyright (c) 2011 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include #ifndef lint -__RCSID("$NetBSD: main.c,v 1.1 2011/06/27 11:52:58 uch Exp $"); +__RCSID("$NetBSD: main.c,v 1.2 2022/02/11 10:55:15 hannken Exp $"); #endif /* not lint */ #include @@ -241,8 +241,8 @@ make_lost_and_found(struct v7fs_self *fs, struct v7fs_inode *p) attr.ctime = attr.mtime = attr.atime = (v7fs_time_t)time(NULL); /* If lost+found already exists, returns EEXIST */ - if (!(error = v7fs_file_allocate - (fs, &root_inode, "lost+found", &attr, &ino))) + if (!(error = v7fs_file_allocate(fs, &root_inode, + "lost+found", strlen("lost+found"), &attr, &ino))) v7fs_superblock_writeback(fs); if (error == EEXIST) diff --git a/sbin/fsck_v7fs/pathname.c b/sbin/fsck_v7fs/pathname.c index 25596d501774..4d219c1d241c 100644 --- a/sbin/fsck_v7fs/pathname.c +++ b/sbin/fsck_v7fs/pathname.c @@ -1,4 +1,4 @@ -/* $NetBSD: pathname.c,v 1.1 2011/06/27 11:52:58 uch Exp $ */ +/* $NetBSD: pathname.c,v 1.2 2022/02/11 10:55:15 hannken Exp $ */ /*- * Copyright (c) 2011 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include #ifndef lint -__RCSID("$NetBSD: pathname.c,v 1.1 2011/06/27 11:52:58 uch Exp $"); +__RCSID("$NetBSD: pathname.c,v 1.2 2022/02/11 10:55:15 hannken Exp $"); #endif /* not lint */ #include @@ -64,7 +64,7 @@ connect_lost_and_found(struct v7fs_self *fs, v7fs_ino_t ino) return FSCK_EXIT_CHECK_FAILED; snprintf(name, sizeof(name), "%d", ino); - v7fs_directory_add_entry(fs, &lost_and_found, ino, name); + v7fs_directory_add_entry(fs, &lost_and_found, ino, name, strlen(name)); t = (v7fs_time_t)time(NULL); lost_and_found.mtime = lost_and_found.atime = t; v7fs_inode_writeback(fs, &lost_and_found); @@ -107,7 +107,7 @@ lookup_child_subr(struct v7fs_self *fs, void *ctx, v7fs_daddr_t blk, size_t sz) pwarn("entry #%d not found.", dir->inode_number); if (reply("REMOVE?")) v7fs_directory_remove_entry(fs, arg->parent, - dir->name); + dir->name, strlen(dir->name)); } else { /* Count child dir. */ if (v7fs_inode_isdir(&inode)) diff --git a/sys/fs/v7fs/v7fs_dirent.c b/sys/fs/v7fs/v7fs_dirent.c index 99431e7b6a68..3b215a03b384 100644 --- a/sys/fs/v7fs/v7fs_dirent.c +++ b/sys/fs/v7fs/v7fs_dirent.c @@ -1,4 +1,4 @@ -/* $NetBSD: v7fs_dirent.c,v 1.2 2011/07/18 21:51:49 apb Exp $ */ +/* $NetBSD: v7fs_dirent.c,v 1.3 2022/02/11 10:55:15 hannken Exp $ */ /*- * Copyright (c) 2011 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ #endif #include -__KERNEL_RCSID(0, "$NetBSD: v7fs_dirent.c,v 1.2 2011/07/18 21:51:49 apb Exp $"); +__KERNEL_RCSID(0, "$NetBSD: v7fs_dirent.c,v 1.3 2022/02/11 10:55:15 hannken Exp $"); #if defined _KERNEL_OPT #include "opt_v7fs.h" #endif @@ -81,9 +81,12 @@ v7fs_dirent_endian_convert(struct v7fs_self *fs, struct v7fs_dirent *dir, int n) void v7fs_dirent_filename(char *dst/* size must be V7FS_NAME_MAX + 1 */, - const char *src) + const char *src, size_t srclen) { - strncpy(dst, src, V7FS_NAME_MAX); - dst[V7FS_NAME_MAX] = '\0'; + if (srclen > V7FS_NAME_MAX) + srclen = V7FS_NAME_MAX; + + memset(dst, 0, V7FS_NAME_MAX + 1); + strncpy(dst, src, srclen); } diff --git a/sys/fs/v7fs/v7fs_dirent.h b/sys/fs/v7fs/v7fs_dirent.h index 46ca28d4e92d..0268becf731d 100644 --- a/sys/fs/v7fs/v7fs_dirent.h +++ b/sys/fs/v7fs/v7fs_dirent.h @@ -1,4 +1,4 @@ -/* $NetBSD: v7fs_dirent.h,v 1.1 2011/06/27 11:52:24 uch Exp $ */ +/* $NetBSD: v7fs_dirent.h,v 1.2 2022/02/11 10:55:15 hannken Exp $ */ /*- * Copyright (c) 2011 The NetBSD Foundation, Inc. @@ -33,6 +33,6 @@ #define _V7FS_DIRENT_H_ __BEGIN_DECLS bool v7fs_dirent_endian_convert(struct v7fs_self *, struct v7fs_dirent *, int); -void v7fs_dirent_filename(char *, const char *); +void v7fs_dirent_filename(char *, const char *, size_t); __END_DECLS #endif /*!_V7FS_DIRENT_H_ */ diff --git a/sys/fs/v7fs/v7fs_file.c b/sys/fs/v7fs/v7fs_file.c index 18024966b5b7..d9a33575a264 100644 --- a/sys/fs/v7fs/v7fs_file.c +++ b/sys/fs/v7fs/v7fs_file.c @@ -1,4 +1,4 @@ -/* $NetBSD: v7fs_file.c,v 1.6 2014/12/29 15:28:58 hannken Exp $ */ +/* $NetBSD: v7fs_file.c,v 1.7 2022/02/11 10:55:15 hannken Exp $ */ /*- * Copyright (c) 2011 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ #endif #include -__KERNEL_RCSID(0, "$NetBSD: v7fs_file.c,v 1.6 2014/12/29 15:28:58 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: v7fs_file.c,v 1.7 2022/02/11 10:55:15 hannken Exp $"); #if defined _KERNEL_OPT #include "opt_v7fs.h" #endif @@ -67,22 +67,14 @@ static int remove_subr(struct v7fs_self *, void *, v7fs_daddr_t, size_t); int v7fs_file_lookup_by_name(struct v7fs_self *fs, struct v7fs_inode *parent_dir, - const char *name, v7fs_ino_t *ino) + const char *name, size_t namelen, v7fs_ino_t *ino) { char filename[V7FS_NAME_MAX + 1]; - char *q; int error; - size_t len; - if ((q = strchr(name, '/'))) { - /* Zap following path. */ - len = MIN(V7FS_NAME_MAX, q - name); - memcpy(filename, name, len); - filename[len] = '\0'; /* '/' -> '\0' */ - } else { - v7fs_dirent_filename(filename, name); - } - DPRINTF("%s(%s) dir=%d\n", filename, name, parent_dir->inode_number); + v7fs_dirent_filename(filename, name, namelen); + DPRINTF("%s(%.*s) dir=%d\n", filename, (int)namelen, name, + parent_dir->inode_number); struct v7fs_lookup_arg lookup_arg = { .name = filename, .inode_number = 0 }; @@ -135,20 +127,17 @@ lookup_subr(struct v7fs_self *fs, void *ctx, v7fs_daddr_t blk, size_t sz) int v7fs_file_allocate(struct v7fs_self *fs, struct v7fs_inode *parent_dir, - const char *srcname, struct v7fs_fileattr *attr, v7fs_ino_t *ino) + const char *srcname, size_t srclen, struct v7fs_fileattr *attr, + v7fs_ino_t *ino) { struct v7fs_inode inode; - char filename[V7FS_NAME_MAX + 1]; struct v7fs_dirent *dir; int error; - /* Truncate filename. */ - v7fs_dirent_filename(filename, srcname); - DPRINTF("%s(%s)\n", filename, srcname); - /* Check filename. */ - if (v7fs_file_lookup_by_name(fs, parent_dir, filename, ino) == 0) { - DPRINTF("%s exists\n", filename); + if (v7fs_file_lookup_by_name(fs, parent_dir, srcname, srclen, + ino) == 0) { + DPRINTF("%.*s exists\n", (int)srclen, srcname); return EEXIST; } @@ -219,7 +208,8 @@ v7fs_file_allocate(struct v7fs_self *fs, struct v7fs_inode *parent_dir, v7fs_inode_writeback(fs, &inode); /* Link this inode to parent directory. */ - if ((error = v7fs_directory_add_entry(fs, parent_dir, *ino, filename))) + if ((error = v7fs_directory_add_entry(fs, parent_dir, *ino, srcname, + srclen))) { DPRINTF("can't add dirent.\n"); return error; @@ -230,24 +220,25 @@ v7fs_file_allocate(struct v7fs_self *fs, struct v7fs_inode *parent_dir, int v7fs_file_deallocate(struct v7fs_self *fs, struct v7fs_inode *parent_dir, - const char *name) + const char *name, size_t namelen) { v7fs_ino_t ino; struct v7fs_inode inode; int error; - DPRINTF("%s\n", name); - if ((error = v7fs_file_lookup_by_name(fs, parent_dir, name, &ino))) { + DPRINTF("%.*s\n", (int)namelen, name); + if ((error = v7fs_file_lookup_by_name(fs, parent_dir, name, namelen, + &ino))) { DPRINTF("no such a file: %s\n", name); return error; } - DPRINTF("%s->#%d\n", name, ino); + DPRINTF("%.*s->#%d\n", (int)namelen, name, ino); if ((error = v7fs_inode_load(fs, &inode, ino))) return error; if (v7fs_inode_isdir(&inode)) { char filename[V7FS_NAME_MAX + 1]; - v7fs_dirent_filename(filename, name); + v7fs_dirent_filename(filename, name, namelen); /* Check parent */ if (strncmp(filename, "..", V7FS_NAME_MAX) == 0) { DPRINTF("can not remove '..'\n"); @@ -266,11 +257,12 @@ v7fs_file_deallocate(struct v7fs_self *fs, struct v7fs_inode *parent_dir, } else { /* Decrement reference count. */ --inode.nlink; /* regular file. */ - DPRINTF("%s nlink=%d\n", name, inode.nlink); + DPRINTF("%.*s nlink=%d\n", (int)namelen, name, inode.nlink); } - if ((error = v7fs_directory_remove_entry(fs, parent_dir, name))) + if ((error = v7fs_directory_remove_entry(fs, parent_dir, name, + namelen))) return error; DPRINTF("remove dirent\n"); @@ -281,7 +273,7 @@ v7fs_file_deallocate(struct v7fs_self *fs, struct v7fs_inode *parent_dir, int v7fs_directory_add_entry(struct v7fs_self *fs, struct v7fs_inode *parent_dir, - v7fs_ino_t ino, const char *srcname) + v7fs_ino_t ino, const char *srcname, size_t srclen) { struct v7fs_inode inode; struct v7fs_dirent *dir; @@ -291,8 +283,8 @@ v7fs_directory_add_entry(struct v7fs_self *fs, struct v7fs_inode *parent_dir, char filename[V7FS_NAME_MAX + 1]; /* Truncate filename. */ - v7fs_dirent_filename(filename, srcname); - DPRINTF("%s(%s) %d\n", filename, srcname, ino); + v7fs_dirent_filename(filename, srcname, srclen); + DPRINTF("%s(%.*s) %d\n", filename, (int)srclen, srcname, ino); /* Target inode */ if ((error = v7fs_inode_load(fs, &inode, ino))) @@ -335,9 +327,10 @@ v7fs_directory_add_entry(struct v7fs_self *fs, struct v7fs_inode *parent_dir, int v7fs_directory_remove_entry(struct v7fs_self *fs, struct v7fs_inode *parent_dir, - const char *name) + const char *name, size_t namelen) { struct v7fs_inode inode; + char filename[V7FS_NAME_MAX + 1]; int error; struct v7fs_dirent lastdirent; v7fs_daddr_t lastblk; @@ -345,6 +338,8 @@ v7fs_directory_remove_entry(struct v7fs_self *fs, struct v7fs_inode *parent_dir, v7fs_off_t pos; void *buf; + v7fs_dirent_filename(filename, name, namelen); + /* Setup replaced entry. */ sz = parent_dir->filesize; lastblk = v7fs_datablock_last(fs, parent_dir, @@ -360,7 +355,7 @@ v7fs_directory_remove_entry(struct v7fs_self *fs, struct v7fs_inode *parent_dir, V7FS_VAL16(fs, lastdirent.inode_number), lastdirent.name, pos); struct v7fs_lookup_arg lookup_arg = - { .name = name, .replace = &lastdirent/*disk endian */ }; + { .name = filename, .replace = &lastdirent/*disk endian */ }; /* Search entry that removed. replace it to last dirent. */ if ((error = v7fs_datablock_foreach(fs, parent_dir, remove_subr, &lookup_arg)) != V7FS_ITERATOR_BREAK) diff --git a/sys/fs/v7fs/v7fs_file.h b/sys/fs/v7fs/v7fs_file.h index 26c39fb5c9af..7852b4f8a03f 100644 --- a/sys/fs/v7fs/v7fs_file.h +++ b/sys/fs/v7fs/v7fs_file.h @@ -1,4 +1,4 @@ -/* $NetBSD: v7fs_file.h,v 1.2 2011/07/16 12:35:40 uch Exp $ */ +/* $NetBSD: v7fs_file.h,v 1.3 2022/02/11 10:55:15 hannken Exp $ */ /*- * Copyright (c) 2011 The NetBSD Foundation, Inc. @@ -42,22 +42,23 @@ struct v7fs_lookup_arg { __BEGIN_DECLS /* core */ int v7fs_file_lookup_by_name(struct v7fs_self *, struct v7fs_inode *, - const char*, v7fs_ino_t *); + const char*, size_t, v7fs_ino_t *); int v7fs_file_allocate(struct v7fs_self *, struct v7fs_inode *, const char *, - struct v7fs_fileattr *, v7fs_ino_t *); -int v7fs_file_deallocate(struct v7fs_self *, struct v7fs_inode *, const char *); + size_t, struct v7fs_fileattr *, v7fs_ino_t *); +int v7fs_file_deallocate(struct v7fs_self *, struct v7fs_inode *, const char *, + size_t); int v7fs_directory_add_entry(struct v7fs_self *,struct v7fs_inode *, v7fs_ino_t, - const char *); + const char *, size_t); int v7fs_directory_remove_entry(struct v7fs_self *,struct v7fs_inode *, - const char *); + const char *, size_t); /* util */ int v7fs_file_rename(struct v7fs_self *, struct v7fs_inode *, const char *, - struct v7fs_inode *, const char *); + size_t, struct v7fs_inode *, const char *, size_t); int v7fs_directory_replace_entry(struct v7fs_self *, struct v7fs_inode *, const char *, v7fs_ino_t); int v7fs_file_link(struct v7fs_self *, struct v7fs_inode *, struct v7fs_inode *, - const char *); + const char *, size_t); bool v7fs_file_lookup_by_number(struct v7fs_self *, struct v7fs_inode *, v7fs_ino_t, char *); int v7fs_file_symlink(struct v7fs_self *, struct v7fs_inode *, const char *); diff --git a/sys/fs/v7fs/v7fs_file_util.c b/sys/fs/v7fs/v7fs_file_util.c index a6cfb32e80f4..510eb6edf0fe 100644 --- a/sys/fs/v7fs/v7fs_file_util.c +++ b/sys/fs/v7fs/v7fs_file_util.c @@ -1,4 +1,4 @@ -/* $NetBSD: v7fs_file_util.c,v 1.4 2011/07/30 03:52:04 uch Exp $ */ +/* $NetBSD: v7fs_file_util.c,v 1.5 2022/02/11 10:55:15 hannken Exp $ */ /*- * Copyright (c) 2011 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ #endif #include -__KERNEL_RCSID(0, "$NetBSD: v7fs_file_util.c,v 1.4 2011/07/30 03:52:04 uch Exp $"); +__KERNEL_RCSID(0, "$NetBSD: v7fs_file_util.c,v 1.5 2022/02/11 10:55:15 hannken Exp $"); #ifdef _KERNEL #include #include @@ -67,13 +67,14 @@ static int lookup_parent_from_dir_subr(struct v7fs_self *, void *, int v7fs_file_link(struct v7fs_self *fs, struct v7fs_inode *parent_dir, - struct v7fs_inode *p, const char *name) + struct v7fs_inode *p, const char *name, size_t namelen) { int error = 0; - DPRINTF("%d %d %s\n", parent_dir->inode_number, p->inode_number, name); + DPRINTF("%d %d %.*s\n", parent_dir->inode_number, p->inode_number, + (int)namelen, name); if ((error = v7fs_directory_add_entry(fs, parent_dir, p->inode_number, - name))) { + name, namelen))) { DPRINTF("can't add entry"); return error; } @@ -118,7 +119,8 @@ v7fs_file_symlink(struct v7fs_self *fs, struct v7fs_inode *p, int v7fs_file_rename(struct v7fs_self *fs, struct v7fs_inode *parent_from, - const char *from, struct v7fs_inode *parent_to, const char *to) + const char *from, size_t fromlen, struct v7fs_inode *parent_to, + const char *to, size_t tolen) { v7fs_ino_t from_ino, to_ino; struct v7fs_inode inode; @@ -126,20 +128,21 @@ v7fs_file_rename(struct v7fs_self *fs, struct v7fs_inode *parent_from, bool dir_move; /* Check source file */ - if ((error = v7fs_file_lookup_by_name(fs, parent_from, from, + if ((error = v7fs_file_lookup_by_name(fs, parent_from, from, fromlen, &from_ino))) { - DPRINTF("%s don't exists\n", from); + DPRINTF("%.*s don't exists\n", (int)fromlen, from); return error; } v7fs_inode_load(fs, &inode, from_ino); dir_move = v7fs_inode_isdir(&inode); /* Check target file */ - error = v7fs_file_lookup_by_name(fs, parent_to, to, &to_ino); + error = v7fs_file_lookup_by_name(fs, parent_to, to, tolen, &to_ino); if (error == 0) { /* found */ - DPRINTF("%s already exists\n", to); - if ((error = v7fs_file_deallocate(fs, parent_to, to))) { - DPRINTF("%s can't remove %d\n", to, error); + DPRINTF("%.*s already exists\n", (int)tolen, to); + if ((error = v7fs_file_deallocate(fs, parent_to, to, tolen))) { + DPRINTF("%.*s can't remove %d\n", (int)tolen, + to, error); return error; } } else if (error != ENOENT) { @@ -149,17 +152,19 @@ v7fs_file_rename(struct v7fs_self *fs, struct v7fs_inode *parent_from, /* Check directory hierarchy. t_vnops rename_dir(5) */ if (dir_move && (error = can_dirmove(fs, from_ino, parent_to->inode_number))) { - DPRINTF("dst '%s' is child dir of '%s'. error=%d\n", to, from, - error); + DPRINTF("dst '%.*s' is child dir of '%.*s'. error=%d\n", + (int)tolen, to, (int)fromlen, from, error); return error; } - if ((error = v7fs_directory_add_entry(fs, parent_to, from_ino, to))) { + if ((error = v7fs_directory_add_entry(fs, parent_to, from_ino, to, + tolen))) { DPRINTF("can't add entry"); return error; } - if ((error = v7fs_directory_remove_entry(fs, parent_from, from))) { + if ((error = v7fs_directory_remove_entry(fs, parent_from, from, + fromlen))) { DPRINTF("can't remove entry"); return error; } @@ -260,7 +265,8 @@ lookup_by_number_subr(struct v7fs_self *fs, void *ctx, v7fs_daddr_t blk, for (i = 0; i < n; i++, dir++) { if (dir->inode_number == p->inode_number) { if (p->buf) - v7fs_dirent_filename(p->buf, dir->name); + v7fs_dirent_filename(p->buf, dir->name, + strlen(dir->name)); ret = V7FS_ITERATOR_BREAK; break; } @@ -330,7 +336,7 @@ lookup_parent_from_dir_subr(struct v7fs_self *fs, void *ctx, v7fs_daddr_t blk, } for (i = 0; i < n; i++, dir++) { - v7fs_dirent_filename(name, dir->name); + v7fs_dirent_filename(name, dir->name, strlen(dir->name)); if (strncmp(dir->name, "..", V7FS_NAME_MAX) != 0) continue; diff --git a/sys/fs/v7fs/v7fs_vnops.c b/sys/fs/v7fs/v7fs_vnops.c index 48a214ef58be..d763bb821541 100644 --- a/sys/fs/v7fs/v7fs_vnops.c +++ b/sys/fs/v7fs/v7fs_vnops.c @@ -1,4 +1,4 @@ -/* $NetBSD: v7fs_vnops.c,v 1.33 2022/02/01 17:12:24 jakllsch Exp $ */ +/* $NetBSD: v7fs_vnops.c,v 1.34 2022/02/11 10:55:15 hannken Exp $ */ /*- * Copyright (c) 2004, 2011 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: v7fs_vnops.c,v 1.33 2022/02/01 17:12:24 jakllsch Exp $"); +__KERNEL_RCSID(0, "$NetBSD: v7fs_vnops.c,v 1.34 2022/02/11 10:55:15 hannken Exp $"); #if defined _KERNEL_OPT #include "opt_v7fs.h" #endif @@ -110,7 +110,7 @@ v7fs_lookup(void *v) #ifdef V7FS_VNOPS_DEBUG const char *opname[] = { "LOOKUP", "CREATE", "DELETE", "RENAME" }; #endif - DPRINTF("'%s' op=%s flags=%d parent=%d %o %dbyte\n", name, + DPRINTF("'%.*s' op=%s flags=%d parent=%d %o %dbyte\n", namelen, name, opname[nameiop], cnp->cn_flags, parent->inode_number, parent->mode, parent->filesize); @@ -145,15 +145,18 @@ v7fs_lookup(void *v) } /* ".." and regular file. */ - if ((error = v7fs_file_lookup_by_name(fs, parent, name, &ino))) { + if ((error = v7fs_file_lookup_by_name(fs, parent, name, namelen, + &ino))) { /* Not found. Tell this entry be able to allocate. */ if (((nameiop == CREATE) || (nameiop == RENAME)) && islastcn) { /* Check directory permission to allocate. */ if ((error = VOP_ACCESS(dvp, VWRITE, cnp->cn_cred))) { - DPRINTF("access denied. (%s)\n", name); + DPRINTF("access denied. (%.*s)\n", + namelen, name); return error; } - DPRINTF("EJUSTRETURN op=%d (%s)\n", nameiop, name); + DPRINTF("EJUSTRETURN op=%d (%.*s)\n", nameiop, namelen, + name); return EJUSTRETURN; } DPRINTF("lastcn=%d\n", flags & ISLASTCN); @@ -162,7 +165,7 @@ v7fs_lookup(void *v) if ((nameiop == DELETE) && islastcn) { if ((error = VOP_ACCESS(dvp, VWRITE, cnp->cn_cred))) { - DPRINTF("access denied. (%s)\n", name); + DPRINTF("access denied. (%.*s)\n", namelen, name); return error; } } @@ -186,7 +189,7 @@ v7fs_lookup(void *v) if (vpp != dvp) VOP_UNLOCK(vpp); *a->a_vpp = vpp; - DPRINTF("done.(%s)\n", name); + DPRINTF("done.(%.*s)\n", namelen, name); return 0; } @@ -210,8 +213,8 @@ v7fs_create(void *v) v7fs_ino_t ino; int error = 0; - DPRINTF("%s parent#%d\n", a->a_cnp->cn_nameptr, - parent_node->inode.inode_number); + DPRINTF("%.*s parent#%d\n", (int)a->a_cnp->cn_namelen, + a->a_cnp->cn_nameptr, parent_node->inode.inode_number); KDASSERT((va->va_type == VREG) || (va->va_type == VSOCK)); memset(&attr, 0, sizeof(attr)); @@ -222,7 +225,7 @@ v7fs_create(void *v) /* Allocate disk entry. and register its entry to parent directory. */ if ((error = v7fs_file_allocate(fs, &parent_node->inode, - a->a_cnp->cn_nameptr, &attr, &ino))) { + a->a_cnp->cn_nameptr, a->a_cnp->cn_namelen, &attr, &ino))) { DPRINTF("v7fs_file_allocate failed.\n"); return error; } @@ -272,8 +275,8 @@ v7fs_mknod(void *v) v7fs_ino_t ino; int error = 0; - DPRINTF("%s %06o %lx %d\n", cnp->cn_nameptr, va->va_mode, - (long)va->va_rdev, va->va_type); + DPRINTF("%.*s %06o %lx %d\n", (int)cnp->cn_namelen, cnp->cn_nameptr, + va->va_mode, (long)va->va_rdev, va->va_type); memset(&attr, 0, sizeof(attr)); attr.uid = kauth_cred_geteuid(cr); attr.gid = kauth_cred_getegid(cr); @@ -281,7 +284,7 @@ v7fs_mknod(void *v) attr.device = va->va_rdev; if ((error = v7fs_file_allocate(fs, &parent_node->inode, - cnp->cn_nameptr, &attr, &ino))) + cnp->cn_nameptr, cnp->cn_namelen, &attr, &ino))) return error; /* Sync dirent size change. */ uvm_vnp_setsize(dvp, v7fs_inode_filesize(&parent_node->inode)); @@ -698,7 +701,8 @@ v7fs_remove(void *v) struct v7fs_self *fs = v7fsmount->core; int error = 0; - DPRINTF("delete %s\n", a->a_cnp->cn_nameptr); + DPRINTF("delete %.*s\n", (int)a->a_cnp->cn_namelen, + a->a_cnp->cn_nameptr); if (vp->v_type == VDIR) { error = EPERM; @@ -706,7 +710,7 @@ v7fs_remove(void *v) } if ((error = v7fs_file_deallocate(fs, &parent_node->inode, - a->a_cnp->cn_nameptr))) { + a->a_cnp->cn_nameptr, a->a_cnp->cn_namelen))) { DPRINTF("v7fs_file_delete failed.\n"); goto out; } @@ -750,7 +754,7 @@ v7fs_link(void *v) VOP_ABORTOP(dvp, cnp); goto unlock; } - error = v7fs_file_link(fs, parent, p, cnp->cn_nameptr); + error = v7fs_file_link(fs, parent, p, cnp->cn_nameptr, cnp->cn_namelen); /* Sync dirent size change. */ uvm_vnp_setsize(dvp, v7fs_inode_filesize(&parent_node->inode)); @@ -780,9 +784,12 @@ v7fs_rename(void *v) struct v7fs_self *fs = v7node->v7fsmount->core; const char *from_name = a->a_fcnp->cn_nameptr; const char *to_name = a->a_tcnp->cn_nameptr; + size_t from_len = a->a_fcnp->cn_namelen; + size_t to_len = a->a_tcnp->cn_namelen; int error; - DPRINTF("%s->%s %p %p\n", from_name, to_name, fvp, tvp); + DPRINTF("%.*s->%.*s %p %p\n", (int)from_len, from_name, (int)to_len, + to_name, fvp, tvp); if ((fvp->v_mount != tdvp->v_mount) || (tvp && (fvp->v_mount != tvp->v_mount))) { @@ -791,8 +798,8 @@ v7fs_rename(void *v) goto out; } // XXXsource file lock? - error = v7fs_file_rename(fs, &parent_from->inode, from_name, - &parent_to->inode, to_name); + error = v7fs_file_rename(fs, &parent_from->inode, from_name, from_len, + &parent_to->inode, to_name, to_len); /* 'to file' inode may be changed. (hard-linked and it is cached.) t_vnops rename_reg_nodir */ if (error == 0 && tvp) { @@ -846,7 +853,7 @@ v7fs_mkdir(void *v) attr.mode = va->va_mode | vtype_to_v7fs_mode(va->va_type); if ((error = v7fs_file_allocate(fs, &parent_node->inode, - cnp->cn_nameptr, &attr, &ino))) + cnp->cn_nameptr, cnp->cn_namelen, &attr, &ino))) return error; /* Sync dirent size change. */ uvm_vnp_setsize(dvp, v7fs_inode_filesize(&parent_node->inode)); @@ -882,12 +889,13 @@ v7fs_rmdir(void *v) struct v7fs_self *fs = v7fsmount->core; int error = 0; - DPRINTF("delete %s\n", a->a_cnp->cn_nameptr); + DPRINTF("delete %.*s\n", (int)a->a_cnp->cn_namelen, + a->a_cnp->cn_nameptr); KDASSERT(vp->v_type == VDIR); if ((error = v7fs_file_deallocate(fs, &parent_node->inode, - a->a_cnp->cn_nameptr))) { + a->a_cnp->cn_nameptr, a->a_cnp->cn_namelen))) { DPRINTF("v7fs_directory_deallocate failed.\n"); goto out; } @@ -937,7 +945,7 @@ readdir_subr(struct v7fs_self *fs, void *ctx, v7fs_daddr_t blk, size_t sz) if ((error = v7fs_inode_load(fs, &inode, dir->inode_number))) break; - v7fs_dirent_filename(filename, dir->name); + v7fs_dirent_filename(filename, dir->name, strlen(dir->name)); DPRINTF("inode=%d name=%s %s\n", dir->inode_number, filename, v7fs_inode_isdir(&inode) ? "DIR" : "FILE"); @@ -1267,6 +1275,7 @@ v7fs_symlink(void *v) const char *from = a->a_target; const char *to = cnp->cn_nameptr; size_t len = strlen(from) + 1; + size_t tolen = cnp->cn_namelen; int error = 0; if (len > V7FS_BSIZE) { /* limited to 512byte pathname */ @@ -1280,7 +1289,7 @@ v7fs_symlink(void *v) attr.mode = va->va_mode | vtype_to_v7fs_mode(va->va_type); if ((error = v7fs_file_allocate - (fs, &parent_node->inode, to, &attr, &ino))) { + (fs, &parent_node->inode, to, tolen, &attr, &ino))) { return error; } /* Sync dirent size change. */ diff --git a/usr.sbin/makefs/v7fs/v7fs_populate.c b/usr.sbin/makefs/v7fs/v7fs_populate.c index 5b6215858248..3875a492a203 100644 --- a/usr.sbin/makefs/v7fs/v7fs_populate.c +++ b/usr.sbin/makefs/v7fs/v7fs_populate.c @@ -1,4 +1,4 @@ -/* $NetBSD: v7fs_populate.c,v 1.3 2011/08/10 11:31:49 uch Exp $ */ +/* $NetBSD: v7fs_populate.c,v 1.4 2022/02/11 10:55:15 hannken Exp $ */ /*- * Copyright (c) 2011 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ #include #if defined(__RCSID) && !defined(__lint) -__RCSID("$NetBSD: v7fs_populate.c,v 1.3 2011/08/10 11:31:49 uch Exp $"); +__RCSID("$NetBSD: v7fs_populate.c,v 1.4 2022/02/11 10:55:15 hannken Exp $"); #endif /* !__lint */ #include @@ -89,8 +89,8 @@ allocate(struct v7fs_self *fs, struct v7fs_inode *parent_inode, fsnode *node, attr_setup(node, &attr); attr.device = dev; - if ((error = v7fs_file_allocate(fs, parent_inode, node->name, &attr, - &ino))) { + if ((error = v7fs_file_allocate(fs, parent_inode, node->name, + strlen(node->name), &attr, &ino))) { errno = error; warn("%s", node->name); return error; @@ -146,7 +146,7 @@ file_copy(struct v7fs_self *fs, struct v7fs_inode *parent_inode, fsnode *node, goto err_exit; } if ((error = v7fs_file_link(fs, parent_inode, &inode, - node->name))) { + node->name, strlen(node->name)))) { errmsg = "hard link"; goto err_exit; }