$NetBSD: patch-ae,v 1.8 2004/02/20 00:41:16 abs Exp $ --- mserv/mp3info.c.orig Thu Feb 19 17:46:03 2004 +++ mserv/mp3info.c @@ -27,6 +27,7 @@ #define h_thing(val) ((val>>20)&0xfff) #define ID3V2HEADERLEN 10 +#define min(x,y) ((x)<(y)?(x):(y)) /* mp3 bit rate and sampling frequency tables */ @@ -45,12 +46,14 @@ const int sampling_freq_table[2][3] = /* structure of id3 tag in mp3 file */ typedef struct id3tag_disc_str -{ - char title[MP3ID3_TITLELEN]; - char artist[MP3ID3_ARTISTLEN]; - char album[MP3ID3_ALBUMLEN]; - char year[MP3ID3_YEARLEN]; - char comment[MP3ID3_COMMENTLEN]; +{ /* These are all fixed lengths. + * Avoid #define'd lengths that get get redefined for other uses + */ + char title[30]; + char artist[30]; + char album[30]; + char year[4]; + char comment[28]; unsigned char genre; } id3tag_disc; @@ -312,38 +315,44 @@ int mserv_mp3info_readlen(const char *fn if (id3tag) { id3tag_disc tag_disc; + int len; if (fread(&tag_disc, 1, 125, f) != 125) goto error; id3tag->present = 1; - memcpy(id3tag->title, tag_disc.title, MP3ID3_TITLELEN); - id3tag->title[MP3ID3_TITLELEN] = '\0'; + len = min(MP3ID3_TITLELEN, sizeof(tag_disc.title)); + memcpy(id3tag->title, tag_disc.title, len); + id3tag->title[len] = '\0'; e = id3tag->title + strlen(id3tag->title); while (e > id3tag->title && *(e-1) == ' ') *--e = '\0'; - memcpy(id3tag->artist, tag_disc.artist, MP3ID3_ARTISTLEN); - id3tag->artist[MP3ID3_ARTISTLEN] = '\0'; + len = min(MP3ID3_ARTISTLEN, sizeof(tag_disc.artist)); + memcpy(id3tag->artist, tag_disc.artist, len); + id3tag->artist[len] = '\0'; e = id3tag->artist + strlen(id3tag->artist); while (e > id3tag->artist && *(e-1) == ' ') *--e = '\0'; - memcpy(id3tag->album, tag_disc.album, MP3ID3_ALBUMLEN); - id3tag->album[MP3ID3_ALBUMLEN] = '\0'; + len = min(MP3ID3_ALBUMLEN, sizeof(tag_disc.album)); + memcpy(id3tag->album, tag_disc.album, len); + id3tag->album[len] = '\0'; e = id3tag->album + strlen(id3tag->album); while (e > id3tag->album && *(e-1) == ' ') *--e = '\0'; - memcpy(id3tag->year, tag_disc.year, MP3ID3_YEARLEN); - id3tag->year[MP3ID3_YEARLEN] = '\0'; + len = min(MP3ID3_YEARLEN, sizeof(tag_disc.year)); + memcpy(id3tag->year, tag_disc.year, len); + id3tag->year[len] = '\0'; e = id3tag->year + strlen(id3tag->year); while (e > id3tag->year && *(e-1) == ' ') *--e = '\0'; - memcpy(id3tag->comment, tag_disc.comment, MP3ID3_COMMENTLEN); - id3tag->comment[MP3ID3_COMMENTLEN] = '\0'; + len = min(MP3ID3_COMMENTLEN, sizeof(tag_disc.comment)); + memcpy(id3tag->comment, tag_disc.comment, len); + id3tag->comment[len] = '\0'; e = id3tag->comment + strlen(id3tag->comment); while (e > id3tag->comment && *(e-1) == ' ') *--e = '\0';