diff --git a/ChangeLog b/ChangeLog index f9305a11e..8b67a496a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2013-11-01 Vladimir Serbinenko + + * grub-core/fs/ext2.c (grub_ext2_read_symlink): Use memcpy rather + strncpy. + * grub-core/fs/jfs.c (grub_jfs_lookup_symlink): Likewise. + * grub-core/kern/misc.c (grub_strncpy): Move from here ... + * include/grub/misc.h (grub_strncpy): ... to here. Make inline. + * grub-core/net/net.c (grub_net_addr_to_str): Use COMPILE_TIME_ASSERT + + strcpy rather than strncpy. + 2013-11-01 Vladimir Serbinenko * grub-core/fs/zfs/zfs.c (nvpair_name): Use correct type for size. diff --git a/grub-core/fs/ext2.c b/grub-core/fs/ext2.c index 46fb76f55..6941ef275 100644 --- a/grub-core/fs/ext2.c +++ b/grub-core/fs/ext2.c @@ -670,10 +670,10 @@ grub_ext2_read_symlink (grub_fshelp_node_t node) /* If the filesize of the symlink is bigger than 60 the symlink is stored in a separate block, otherwise it is stored in the inode. */ - if (grub_le_to_cpu32 (diro->inode.size) <= 60) - grub_strncpy (symlink, - diro->inode.symlink, - grub_le_to_cpu32 (diro->inode.size)); + if (grub_le_to_cpu32 (diro->inode.size) <= sizeof (diro->inode.symlink)) + grub_memcpy (symlink, + diro->inode.symlink, + grub_le_to_cpu32 (diro->inode.size)); else { grub_ext2_read_file (diro, 0, 0, 0, diff --git a/grub-core/fs/jfs.c b/grub-core/fs/jfs.c index 26d771647..062501492 100644 --- a/grub-core/fs/jfs.c +++ b/grub-core/fs/jfs.c @@ -723,7 +723,7 @@ grub_jfs_lookup_symlink (struct grub_jfs_data *data, grub_uint32_t ino) if (!symlink) return grub_errno; if (size <= sizeof (data->currinode.symlink.path)) - grub_strncpy (symlink, (char *) (data->currinode.symlink.path), size); + grub_memcpy (symlink, (char *) (data->currinode.symlink.path), size); else if (grub_jfs_read_file (data, 0, 0, 0, size, symlink) < 0) { grub_free (symlink); diff --git a/grub-core/kern/misc.c b/grub-core/kern/misc.c index d8de0bb09..6619c9970 100644 --- a/grub-core/kern/misc.c +++ b/grub-core/kern/misc.c @@ -94,17 +94,6 @@ grub_strcpy (char *dest, const char *src) return dest; } -char * -grub_strncpy (char *dest, const char *src, int c) -{ - char *p = dest; - - while ((*p++ = *src++) != '\0' && --c) - ; - - return dest; -} - int grub_printf (const char *fmt, ...) { diff --git a/grub-core/net/net.c b/grub-core/net/net.c index 6d143fb51..5f60b0722 100644 --- a/grub-core/net/net.c +++ b/grub-core/net/net.c @@ -734,8 +734,8 @@ grub_net_addr_to_str (const grub_net_network_level_address_t *target, char *buf) switch (target->type) { case GRUB_NET_NETWORK_LEVEL_PROTOCOL_DHCP_RECV: - /* TRANSLATORS: it refers to the network address. */ - grub_strncpy (buf, "temporary", GRUB_NET_MAX_STR_ADDR_LEN); + COMPILE_TIME_ASSERT (sizeof ("temporary") < GRUB_NET_MAX_STR_ADDR_LEN); + grub_strcpy (buf, "temporary"); return; case GRUB_NET_NETWORK_LEVEL_PROTOCOL_IPV6: { diff --git a/include/grub/misc.h b/include/grub/misc.h index 507811e68..bed97600f 100644 --- a/include/grub/misc.h +++ b/include/grub/misc.h @@ -66,7 +66,18 @@ void *EXPORT_FUNC(grub_memmove) (void *dest, const void *src, grub_size_t n); char *EXPORT_FUNC(grub_strcpy) (char *dest, const char *src); -char *EXPORT_FUNC(grub_strncpy) (char *dest, const char *src, int c); + +static inline char * +grub_strncpy (char *dest, const char *src, int c) +{ + char *p = dest; + + while ((*p++ = *src++) != '\0' && --c) + ; + + return dest; +} + static inline char * grub_stpcpy (char *dest, const char *src) {