]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - mp3_afh.c
mp3_afh.c: Fix header_bitrate() for invalid headers
[paraslash.git] / mp3_afh.c
index 8f36bb83310aed62b33f0ac92796a2f82b091708..0c8efbdc5a7c59b84d0b64ada3e7b8c648c833d4 100644 (file)
--- a/mp3_afh.c
+++ b/mp3_afh.c
@@ -115,9 +115,10 @@ static const char *header_mode(struct mp3header *h)
                h->mode = 4; /* invalid */
        return mode_text[h->mode];
 }
+
 static int header_bitrate(struct mp3header *h)
 {
-       if (h->layer > 3 || h->bitrate > 14)
+       if (!h->layer || h->layer > 3 || h->bitrate > 14 || !h->bitrate)
                return -E_HEADER_BITRATE;
        return mp3info_bitrate[h->version & 1][3 - h->layer][h->bitrate - 1];
 }
@@ -187,15 +188,13 @@ static int compare_headers(struct mp3header *h1,struct mp3header *h2)
        return 0;
 }
 
-/**
+/*
  * get next MP3 frame header.
  *
- * \param stream to read the header from
- * \param header structure that gets filled in by get_header()
- *
- * \return On success, the header frame length is returned.  A return value of
- * zero means that we did not retrieve a valid frame header, and a negative
- * return value indicates an error.
+ * On success, the header frame length is returned and the given header
+ * structure that is filled in.  A return value of zero means that we did not
+ * retrieve a valid frame header, and a negative return value indicates an
+ * error.
  */
 static int get_header(unsigned char *map, off_t numbytes, off_t *fpos,
        struct mp3header *header)
@@ -230,13 +229,11 @@ out:
        return ret;
 }
 
-/**
+/*
  * find the next mp3 header
  *
- * \return On success, the length of the next frame header. If the end of the
- * file was reached, the function returns zero. On errors, a negative value is
- * returned.
- *
+ * Return the length of the next frame header or zero if the end of the file is
+ * reached.
  */
 static int mp3_seek_next_header(unsigned char *map, off_t numbytes, off_t *fpos)
 {
@@ -244,11 +241,9 @@ static int mp3_seek_next_header(unsigned char *map, off_t numbytes, off_t *fpos)
        struct mp3header h, h2;
        long valid_start = 0;
 
-       while (1) {
-               while ((*fpos)++ < numbytes && map[*fpos] != 0xff)
-                       ;
-               if (*fpos >= numbytes)
-                       return 0;
+       for (; *fpos < numbytes; (*fpos)++) {
+               if (map[*fpos] != 0xff)
+                       continue;
                valid_start = *fpos;
                first_len = get_header(map, numbytes, fpos, &h);
                if (first_len <= 0)
@@ -267,6 +262,7 @@ static int mp3_seek_next_header(unsigned char *map, off_t numbytes, off_t *fpos)
                        return first_len;
                }
        }
+       return 0;
 }
 
 static void mp3_get_id3(unsigned char *map, off_t numbytes, off_t *fpos)