]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
isosize: avoid reading more data than what is needed
authorSami Kerola <kerolasa@iki.fi>
Sat, 27 May 2017 20:18:57 +0000 (21:18 +0100)
committerKarel Zak <kzak@redhat.com>
Wed, 14 Jun 2017 10:18:27 +0000 (12:18 +0200)
In same go fix error reporting when input file is not long enough.

$ touch empty
$ isosize empty
isosize: empty: might not be an ISO filesystem
isosize: read error on empty: Success

Signed-off-by: Sami Kerola <kerolasa@iki.fi>
disk-utils/isosize.c

index d3d11c9217e3452da0f8b7a35783a7bc6f580012..b5ac56262ad390402db0db8c53ea233a710cffbe 100644 (file)
@@ -30,8 +30,6 @@
 #include "strutils.h"
 #include "closestream.h"
 
-#define ISODCL(from, to) (to - from + 1)
-
 static int is_iso(int fd)
 {
        char label[8];
@@ -88,62 +86,27 @@ static int isonum_733(unsigned char *p, int xflag)
        return (le);
 }
 
-struct iso_primary_descriptor
-{
-       unsigned char type                      [ISODCL (   1,    1)]; /* 711 */
-       unsigned char id                        [ISODCL (   2,    6)];
-       unsigned char version                   [ISODCL (   7,    7)]; /* 711 */
-       unsigned char unused1                   [ISODCL (   8,    8)];
-       unsigned char system_id                 [ISODCL (   9,   40)]; /* auchars */
-       unsigned char volume_id                 [ISODCL (  41,   72)]; /* duchars */
-       unsigned char unused2                   [ISODCL (  73,   80)];
-       unsigned char volume_space_size         [ISODCL (  81,   88)]; /* 733 */
-       unsigned char unused3                   [ISODCL (  89,  120)];
-       unsigned char volume_set_size           [ISODCL ( 121,  124)]; /* 723 */
-       unsigned char volume_sequence_number    [ISODCL ( 125,  128)]; /* 723 */
-       unsigned char logical_block_size        [ISODCL ( 129,  132)]; /* 723 */
-       unsigned char path_table_size           [ISODCL ( 133,  140)]; /* 733 */
-       unsigned char type_l_path_table         [ISODCL ( 141,  144)]; /* 731 */
-       unsigned char opt_type_l_path_table     [ISODCL ( 145,  148)]; /* 731 */
-       unsigned char type_m_path_table         [ISODCL ( 149,  152)]; /* 732 */
-       unsigned char opt_type_m_path_table     [ISODCL ( 153,  156)]; /* 732 */
-       unsigned char root_directory_record     [ISODCL ( 157,  190)]; /* 9.1 */
-       unsigned char volume_set_id             [ISODCL ( 191,  318)]; /* duchars */
-       unsigned char publisher_id              [ISODCL ( 319,  446)]; /* achars */
-       unsigned char preparer_id               [ISODCL ( 447,  574)]; /* achars */
-       unsigned char application_id            [ISODCL ( 575,  702)]; /* achars */
-       unsigned char copyright_file_id         [ISODCL ( 703,  739)]; /* 7.5 dchars */
-       unsigned char abstract_file_id          [ISODCL ( 740,  776)]; /* 7.5 dchars */
-       unsigned char bibliographic_file_id     [ISODCL ( 777,  813)]; /* 7.5 dchars */
-       unsigned char creation_date             [ISODCL ( 814,  830)]; /* 8.4.26.1 */
-       unsigned char modification_date         [ISODCL ( 831,  847)]; /* 8.4.26.1 */
-       unsigned char expiration_date           [ISODCL ( 848,  864)]; /* 8.4.26.1 */
-       unsigned char effective_date            [ISODCL ( 865,  881)]; /* 8.4.26.1 */
-       unsigned char file_structure_version    [ISODCL ( 882,  882)]; /* 711 */
-       unsigned char unused4                   [ISODCL ( 883,  883)];
-       unsigned char application_data          [ISODCL ( 884, 1395)];
-       unsigned char unused5                   [ISODCL (1396, 2048)];
-};
-
 static void isosize(int argc, char *filenamep, int xflag, long divisor)
 {
        int fd, nsecs, ssize;
-       struct iso_primary_descriptor ipd;
+       unsigned char volume_space_size[8];
+       unsigned char logical_block_size[4];
 
        if ((fd = open(filenamep, O_RDONLY)) < 0)
                err(EXIT_FAILURE, _("cannot open %s"), filenamep);
        if (is_iso(fd))
                warnx(_("%s: might not be an ISO filesystem"), filenamep);
 
-       if (lseek(fd, 16 << 11, 0) == (off_t) - 1)
-               err(EXIT_FAILURE, _("seek error on %s"), filenamep);
-
-       if (read(fd, &ipd, sizeof(ipd)) <= 0)
-               err(EXIT_FAILURE, _("read error on %s"), filenamep);
+       if (pread(fd, volume_space_size, sizeof(volume_space_size), 0x8050) <= 0 ||
+           pread(fd, logical_block_size, sizeof(logical_block_size), 0x8080) <= 0) {
+               if (errno)
+                       err(EXIT_FAILURE, _("read error on %s"), filenamep);
+               errx(EXIT_FAILURE, _("read error on %s"), filenamep);
+       }
 
-       nsecs = isonum_733(ipd.volume_space_size, xflag);
+       nsecs = isonum_733(volume_space_size, xflag);
        /* isonum_723 returns nowadays always 2048 */
-       ssize = isonum_723(ipd.logical_block_size, xflag);
+       ssize = isonum_723(logical_block_size, xflag);
 
        if (1 < argc)
                printf("%s: ", filenamep);