Support for kernel 6.8.x. https://www.virtualbox.org/changeset/102989/vbox https://www.virtualbox.org/changeset/102990/vbox https://www.virtualbox.org/changeset/102992/vbox https://www.virtualbox.org/changeset/102993/vbox https://www.virtualbox.org/changeset/102994/vbox ------------------------------------------------------------------------ r102989 | vboxsync | 2024-01-22 19:12:25 +0200 (Lu, 22 ian 2024) | 2 lines iprt: Add wrapper for strlcpy/strscpy functions, bugref:10584. --- a/include/iprt/string.h +++ b/include/iprt/string.h @@ -245,7 +245,29 @@ # define RT_BCOPY_UNFORTIFIED(a_pDst, a_pSrc, a_cbToCopy) memcpy((a_pDst), (a_pSrc), (a_cbToCopy)) #endif /* !RT_OS_LINUX && !__KERNEL__ */ +/** @def RT_STRSCPY + * Copy string and NULL-terminate output buffer. + * + * This macro should mostly be used in Linux kernel code. This is + * the replacement for deprecated strlcpy. It was deprecated since 3.16.60 + * when strscpy was introduced as an alternative. Finally, strlcpy was + * completely removed from kernel code in 6.8.0. + * + * @param a_pDst Pointer to the destination string buffer. + * @param a_pSrc Pointer to the source NULL-terminated string buffer. + * @param a_cbToCopy Size of destination buffer.. + */ +#if defined(RT_OS_LINUX) && defined(__KERNEL__) +# if (RTLNX_VER_MIN(3,16,60)) +# define RT_STRSCPY(a_pDst, a_pSrc, a_cbToCopy) strscpy((a_pDst), (a_pSrc), (a_cbToCopy)) +# else /* < 3.16.60 */ +# define RT_STRSCPY(a_pDst, a_pSrc, a_cbToCopy) strlcpy((a_pDst), (a_pSrc), (a_cbToCopy)) +# endif +#else /* !RT_OS_LINUX && !__KERNEL__ */ +# define RT_STRSCPY(a_pDst, a_pSrc, a_cbToCopy) strscpy((a_pDst), (a_pSrc), (a_cbToCopy)) +#endif /* !RT_OS_LINUX && !__KERNEL__ */ + #ifdef IN_RING3 /** ------------------------------------------------------------------------ ------------------------------------------------------------------------ r102990 | vboxsync | 2024-01-22 19:13:50 +0200 (Lu, 22 ian 2024) | 2 lines Additions: Linux: Introduce initial support for kernel 6.8, bugref:10584. --- a/src/VBox/Additions/common/VBoxGuest/VBoxGuest-linux.c +++ b/src/VBox/Additions/common/VBoxGuest/VBoxGuest-linux.c @@ -1410,7 +1410,7 @@ RTLogGroupSettings(pLogger, pszValue); } else if (pParam->name[0] != 'd') - strlcpy(&g_szLogGrp[0], pszValue, sizeof(g_szLogGrp)); + RT_STRSCPY(&g_szLogGrp[0], pszValue, sizeof(g_szLogGrp)); return 0; } @@ -1436,7 +1436,7 @@ RTLogFlags(pLogger, pszValue); } else if (pParam->name[0] != 'd') - strlcpy(&g_szLogFlags[0], pszValue, sizeof(g_szLogFlags)); + RT_STRSCPY(&g_szLogFlags[0], pszValue, sizeof(g_szLogFlags)); return 0; } @@ -1461,7 +1461,7 @@ RTLogDestinations(pLogger, pszValue); } else if (pParam->name[0] != 'd') - strlcpy(&g_szLogDst[0], pszValue, sizeof(g_szLogDst)); + RT_STRSCPY(&g_szLogDst[0], pszValue, sizeof(g_szLogDst)); return 0; } --- a/src/VBox/Additions/linux/drm/vbox_drv.h +++ b/src/VBox/Additions/linux/drm/vbox_drv.h @@ -538,9 +538,7 @@ int vbox_irq_init(struct vbox_private *vbox); void vbox_irq_fini(struct vbox_private *vbox); void vbox_report_hotplug(struct vbox_private *vbox); -#if RTLNX_VER_MAX(5,15,0) && !RTLNX_RHEL_MAJ_PREREQ(9,1) && !RTLNX_SUSE_MAJ_PREREQ(15,5) irqreturn_t vbox_irq_handler(int irq, void *arg); -#endif /* vbox_hgsmi.c */ void *hgsmi_buffer_alloc(struct gen_pool *guest_pool, size_t size, --- a/src/VBox/Additions/linux/sharedfolders/vfsmod.c +++ b/src/VBox/Additions/linux/sharedfolders/vfsmod.c @@ -1408,7 +1408,7 @@ switch (opt) { case Opt_iocharset: case Opt_nls: - strlcpy(info->nls_name, param->string, sizeof(info->nls_name)); + RT_STRSCPY(info->nls_name, param->string, sizeof(info->nls_name)); break; case Opt_uid: info->uid = result.uint_32; @@ -1469,7 +1469,7 @@ printk(KERN_WARNING "vboxsf: cache mode (%u) is out of range, using default instead.\n", result.uint_32); break; case Opt_tag: - strlcpy(info->szTag, param->string, sizeof(info->szTag)); + RT_STRSCPY(info->szTag, param->string, sizeof(info->szTag)); break; default: return invalf(fc, "Invalid mount option: '%s'", param->key); @@ -1528,7 +1528,7 @@ } /* fc->source (the shared folder name) is set after vbsf_init_fs_ctx() */ - strlcpy(info->name, fc->source, sizeof(info->name)); + RT_STRSCPY(info->name, fc->source, sizeof(info->name)); # if RTLNX_VER_MAX(5,3,0) return vfs_get_super(fc, vfs_get_independent_super, vbsf_read_super_aux); --- a/src/VBox/Additions/linux/sharedfolders/regops.c +++ b/src/VBox/Additions/linux/sharedfolders/regops.c @@ -3505,7 +3505,7 @@ }; /** file_operations::mmap wrapper for logging purposes. */ -extern int vbsf_reg_mmap(struct file *file, struct vm_area_struct *vma) +static int vbsf_reg_mmap(struct file *file, struct vm_area_struct *vma) { int rc; SFLOGFLOW(("vbsf_reg_mmap: file=%p vma=%p\n", file, vma)); @@ -3786,7 +3786,7 @@ } # if RTLNX_VER_MIN(5,19,0) || RTLNX_RHEL_RANGE(9,3, 9,99) -int vbsf_write_begin(struct file *file, struct address_space *mapping, loff_t pos, +static int vbsf_write_begin(struct file *file, struct address_space *mapping, loff_t pos, unsigned len, struct page **pagep, void **fsdata) { vbsf_write_begin_warn(pos, len, 0); @@ -3793,7 +3793,7 @@ return simple_write_begin(file, mapping, pos, len, pagep, fsdata); } # else -int vbsf_write_begin(struct file *file, struct address_space *mapping, loff_t pos, +static int vbsf_write_begin(struct file *file, struct address_space *mapping, loff_t pos, unsigned len, unsigned flags, struct page **pagep, void **fsdata) { vbsf_write_begin_warn(pos, len, flags); ------------------------------------------------------------------------ ------------------------------------------------------------------------ r102992 | vboxsync | 2024-01-22 19:33:49 +0200 (Lu, 22 ian 2024) | 5 lines iprt: Add wrapper for strlcpy/strscpy functions, build fix, bugref:10584. Ignore return code of strscpy() in RT_STRSCPY macro sinse we have no caller who is using it. Also rename macro parameter, so it makes more sense. --- a/include/iprt/string.h +++ b/include/iprt/string.h @@ -255,16 +255,16 @@ * * @param a_pDst Pointer to the destination string buffer. * @param a_pSrc Pointer to the source NULL-terminated string buffer. - * @param a_cbToCopy Size of destination buffer.. + * @param a_cbDst Size of destination buffer. */ #if defined(RT_OS_LINUX) && defined(__KERNEL__) # if (RTLNX_VER_MIN(3,16,60)) -# define RT_STRSCPY(a_pDst, a_pSrc, a_cbToCopy) strscpy((a_pDst), (a_pSrc), (a_cbToCopy)) +# define RT_STRSCPY(a_pDst, a_pSrc, a_cbDst) (void)strscpy((a_pDst), (a_pSrc), (a_cbDst)) # else /* < 3.16.60 */ -# define RT_STRSCPY(a_pDst, a_pSrc, a_cbToCopy) strlcpy((a_pDst), (a_pSrc), (a_cbToCopy)) +# define RT_STRSCPY(a_pDst, a_pSrc, a_cbDst) strlcpy((a_pDst), (a_pSrc), (a_cbDst)) # endif #else /* !RT_OS_LINUX && !__KERNEL__ */ -# define RT_STRSCPY(a_pDst, a_pSrc, a_cbToCopy) strscpy((a_pDst), (a_pSrc), (a_cbToCopy)) +# define RT_STRSCPY(a_pDst, a_pSrc, a_cbDst) (void)strscpy((a_pDst), (a_pSrc), (a_cbDst)) #endif /* !RT_OS_LINUX && !__KERNEL__ */ ------------------------------------------------------------------------ r102993 | vboxsync | 2024-01-22 19:41:44 +0200 (Lu, 22 ian 2024) | 5 lines Add wrapper for strlcpy/strscpy functions, build fix, bugref:10584. It seem, strscpy was added around 4.3.0. Older kernels probably have it as a backport. So, stick to 4.3.0. --- a/include/iprt/string.h +++ b/include/iprt/string.h @@ -258,7 +258,7 @@ * @param a_cbDst Size of destination buffer. */ #if defined(RT_OS_LINUX) && defined(__KERNEL__) -# if (RTLNX_VER_MIN(3,16,60)) +# if (RTLNX_VER_MIN(4,3,0)) # define RT_STRSCPY(a_pDst, a_pSrc, a_cbDst) (void)strscpy((a_pDst), (a_pSrc), (a_cbDst)) # else /* < 3.16.60 */ # define RT_STRSCPY(a_pDst, a_pSrc, a_cbDst) strlcpy((a_pDst), (a_pSrc), (a_cbDst)) ------------------------------------------------------------------------ r102994 | vboxsync | 2024-01-22 20:06:29 +0200 (Lu, 22 ian 2024) | 6 lines iprt: Add wrapper for strlcpy/strscpy functions, build fix, bugref:10584. Another way around to suppress build error when strscpy return status is not used. Also, turn macro into strlcpy for non-Linux systems, so for them it will be no change. --- a/include/iprt/string.h +++ b/include/iprt/string.h @@ -259,12 +259,16 @@ */ #if defined(RT_OS_LINUX) && defined(__KERNEL__) # if (RTLNX_VER_MIN(4,3,0)) -# define RT_STRSCPY(a_pDst, a_pSrc, a_cbDst) (void)strscpy((a_pDst), (a_pSrc), (a_cbDst)) +# define RT_STRSCPY(a_pDst, a_pSrc, a_cbDst) \ + { \ + ssize_t _ret; \ + _ret = strscpy((a_pDst), (a_pSrc), (a_cbDst)); \ + } # else /* < 3.16.60 */ # define RT_STRSCPY(a_pDst, a_pSrc, a_cbDst) strlcpy((a_pDst), (a_pSrc), (a_cbDst)) # endif #else /* !RT_OS_LINUX && !__KERNEL__ */ -# define RT_STRSCPY(a_pDst, a_pSrc, a_cbDst) (void)strscpy((a_pDst), (a_pSrc), (a_cbDst)) +# define RT_STRSCPY(a_pDst, a_pSrc, a_cbDst) strlcpy((a_pDst), (a_pSrc), (a_cbDst)) #endif /* !RT_OS_LINUX && !__KERNEL__ */ ------------------------------------------------------------------------