diff --git a/ChangeLog b/ChangeLog index b254825c3..124de29d1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2013-10-14 Vladimir Serbinenko + + Make grub_util_fd_seek match behaviour of other grub_util_fd_* and + fseeko. + 2013-10-14 qwertial * grub-core/gdb_grub.in: Fix overflow and wrong field. diff --git a/grub-core/disk/cryptodisk.c b/grub-core/disk/cryptodisk.c index 3ca24f979..0399fa178 100644 --- a/grub-core/disk/cryptodisk.c +++ b/grub-core/disk/cryptodisk.c @@ -560,10 +560,11 @@ grub_cryptodisk_read (grub_disk_t disk, grub_disk_addr_t sector, #ifdef GRUB_UTIL if (dev->cheat) { - err = grub_util_fd_seek (dev->cheat_fd, dev->cheat, - sector << disk->log_sector_size); - if (err) - return err; + int r; + r = grub_util_fd_seek (dev->cheat_fd, sector << disk->log_sector_size); + if (r) + return grub_error (GRUB_ERR_BAD_DEVICE, N_("cannot seek `%s': %s"), + dev->cheat, grub_util_fd_strerror ()); if (grub_util_fd_read (dev->cheat_fd, buf, size << disk->log_sector_size) != (ssize_t) (size << disk->log_sector_size)) return grub_error (GRUB_ERR_READ_ERROR, N_("cannot read `%s': %s"), @@ -604,10 +605,11 @@ grub_cryptodisk_write (grub_disk_t disk, grub_disk_addr_t sector, #ifdef GRUB_UTIL if (dev->cheat) { - err = grub_util_fd_seek (dev->cheat_fd, dev->cheat, - sector << disk->log_sector_size); - if (err) - return err; + int r; + r = grub_util_fd_seek (dev->cheat_fd, sector << disk->log_sector_size); + if (r) + return grub_error (GRUB_ERR_BAD_DEVICE, N_("cannot seek `%s': %s"), + dev->cheat, grub_util_fd_strerror ()); if (grub_util_fd_write (dev->cheat_fd, buf, size << disk->log_sector_size) != (ssize_t) (size << disk->log_sector_size)) return grub_error (GRUB_ERR_READ_ERROR, N_("cannot read `%s': %s"), diff --git a/grub-core/disk/geli.c b/grub-core/disk/geli.c index 6cf9a1eec..3e029402a 100644 --- a/grub-core/disk/geli.c +++ b/grub-core/disk/geli.c @@ -223,7 +223,7 @@ grub_util_get_geli_uuid (const char *dev) s = grub_util_get_fd_size (fd, dev, &log_secsize); s >>= log_secsize; - grub_util_fd_seek (fd, dev, (s << log_secsize) - 512); + grub_util_fd_seek (fd, (s << log_secsize) - 512); uuid = xmalloc (GRUB_MD_SHA256->mdlen * 2 + 1); if (grub_util_fd_read (fd, (void *) &hdr, 512) < 0) diff --git a/grub-core/kern/emu/hostdisk.c b/grub-core/kern/emu/hostdisk.c index 2b7f37e86..d5bc6099b 100644 --- a/grub-core/kern/emu/hostdisk.c +++ b/grub-core/kern/emu/hostdisk.c @@ -268,10 +268,12 @@ grub_util_fd_open_device (const grub_disk_t disk, grub_disk_addr_t sector, int f return GRUB_UTIL_FD_INVALID; } - if (grub_util_fd_seek (fd, map[disk->id].device, - sector << disk->log_sector_size)) + if (grub_util_fd_seek (fd, sector << disk->log_sector_size)) { grub_util_fd_close (fd); + grub_error (GRUB_ERR_BAD_DEVICE, N_("cannot seek `%s': %s"), + map[disk->id].device, grub_util_fd_strerror ()); + return GRUB_UTIL_FD_INVALID; } diff --git a/grub-core/osdep/aros/hostdisk.c b/grub-core/osdep/aros/hostdisk.c index 1724c7e44..a9fa9d06b 100644 --- a/grub-core/osdep/aros/hostdisk.c +++ b/grub-core/osdep/aros/hostdisk.c @@ -139,15 +139,14 @@ grub_util_get_fd_size_file (grub_util_fd_t fd, return ro; } -grub_err_t -grub_util_fd_seek (grub_util_fd_t fd, const char *name, grub_uint64_t off) +int +grub_util_fd_seek (grub_util_fd_t fd, grub_uint64_t off) { switch (fd->type) { case GRUB_UTIL_FD_FILE: if (lseek (fd->fd, 0, SEEK_SET) == (off_t) -1) - return grub_error (GRUB_ERR_BAD_DEVICE, N_("cannot seek `%s': %s"), - name, strerror (errno)); + return -1; fd->off = off; return 0; case GRUB_UTIL_FD_DISK: @@ -155,7 +154,7 @@ grub_util_fd_seek (grub_util_fd_t fd, const char *name, grub_uint64_t off) return 0; } - return 0; + return -1; } grub_util_fd_t diff --git a/grub-core/osdep/linux/hostdisk.c b/grub-core/osdep/linux/hostdisk.c index 1df3e1521..a2c80f39d 100644 --- a/grub-core/osdep/linux/hostdisk.c +++ b/grub-core/osdep/linux/hostdisk.c @@ -351,10 +351,11 @@ grub_util_fd_open_device (const grub_disk_t disk, grub_disk_addr_t sector, int f } } - if (grub_util_fd_seek (fd, grub_util_biosdisk_get_osdev (disk), - sector << disk->log_sector_size)) + if (grub_util_fd_seek (fd, sector << disk->log_sector_size)) { close (fd); + grub_error (GRUB_ERR_BAD_DEVICE, N_("cannot seek `%s': %s"), + grub_util_biosdisk_get_osdev (disk), strerror (errno)); return -1; } diff --git a/grub-core/osdep/unix/hostdisk.c b/grub-core/osdep/unix/hostdisk.c index 81e02aef2..b222629d2 100644 --- a/grub-core/osdep/unix/hostdisk.c +++ b/grub-core/osdep/unix/hostdisk.c @@ -82,8 +82,8 @@ grub_util_get_fd_size (grub_util_fd_t fd, const char *name, unsigned *log_secsiz #if defined(__linux__) && (!defined(__GLIBC__) || \ ((__GLIBC__ < 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ < 1)))) /* Maybe libc doesn't have large file support. */ -grub_err_t -grub_util_fd_seek (grub_util_fd_t fd, const char *name, grub_uint64_t off) +int +grub_util_fd_seek (grub_util_fd_t fd, grub_uint64_t off) { loff_t offset, result; static int _llseek (uint filedes, ulong hi, ulong lo, @@ -93,19 +93,18 @@ grub_util_fd_seek (grub_util_fd_t fd, const char *name, grub_uint64_t off) offset = (loff_t) off; if (_llseek (fd, offset >> 32, offset & 0xffffffff, &result, SEEK_SET)) - return grub_error (GRUB_ERR_BAD_DEVICE, N_("cannot seek `%s': %s"), - name, strerror (errno)); + return -1; return GRUB_ERR_NONE; } #else -grub_err_t -grub_util_fd_seek (grub_util_fd_t fd, const char *name, grub_uint64_t off) +int +grub_util_fd_seek (grub_util_fd_t fd, grub_uint64_t off) { off_t offset = (off_t) off; if (lseek (fd, offset, SEEK_SET) != offset) - return grub_error (GRUB_ERR_BAD_DEVICE, N_("cannot seek `%s': %s"), - name, strerror (errno)); + return -1; + return 0; } #endif diff --git a/grub-core/osdep/windows/hostdisk.c b/grub-core/osdep/windows/hostdisk.c index 245f91ca9..3e91d7d97 100644 --- a/grub-core/osdep/windows/hostdisk.c +++ b/grub-core/osdep/windows/hostdisk.c @@ -179,15 +179,14 @@ grub_hostdisk_flush_initial_buffer (const char *os_dev __attribute__ ((unused))) { } -grub_err_t -grub_util_fd_seek (grub_util_fd_t fd, const char *name, grub_uint64_t off) +int +grub_util_fd_seek (grub_util_fd_t fd, grub_uint64_t off) { LARGE_INTEGER offset; offset.QuadPart = off; if (!SetFilePointerEx (fd, offset, NULL, FILE_BEGIN)) - return grub_error (GRUB_ERR_BAD_DEVICE, N_("cannot seek `%s': %s"), - name, strerror (errno)); + return -1; return 0; } diff --git a/include/grub/emu/hostdisk.h b/include/grub/emu/hostdisk.h index 6f13c95e3..fd319b0d1 100644 --- a/include/grub/emu/hostdisk.h +++ b/include/grub/emu/hostdisk.h @@ -47,8 +47,8 @@ int grub_util_biosdisk_is_floppy (grub_disk_t disk); const char * grub_util_biosdisk_get_compatibility_hint (grub_disk_t disk); grub_err_t grub_util_biosdisk_flush (struct grub_disk *disk); -grub_err_t -grub_util_fd_seek (grub_util_fd_t fd, const char *name, grub_uint64_t sector); +int +grub_util_fd_seek (grub_util_fd_t fd, grub_uint64_t offset); ssize_t grub_util_fd_read (grub_util_fd_t fd, char *buf, size_t len); ssize_t grub_util_fd_write (grub_util_fd_t fd, const char *buf, size_t len); grub_err_t