# HG changeset patch # User John Lindgren # Date 1295406442 18000 # Node ID b2c94059fb28375515c0ca9b54a5b2f09c333375 # Parent 3f1ab558c6cf557d226151e941b5113ccd154d73 mtp_up: Use strrchr instead of rindex; fix potential 0x1 pointer dereference (patch from Carlo Bramini, AUDPLUG-323). diff -r 3f1ab558c6cf -r b2c94059fb28 src/mtp_up/filetype.c --- a/src/mtp_up/filetype.c Tue Jan 18 01:19:25 2011 -0500 +++ b/src/mtp_up/filetype.c Tue Jan 18 22:07:22 2011 -0500 @@ -2,84 +2,76 @@ #include "string.h" #include "filetype.h" +typedef struct { + const char *ptype; + const LIBMTP_filetype_t filetype; +} file_entry_t; + +/* This need to be kept constantly updated as new file types arrive. */ +static const file_entry_t file_entries[] = { + { "wav", LIBMTP_FILETYPE_WAV }, + { "mp3", LIBMTP_FILETYPE_MP3 }, + { "wma", LIBMTP_FILETYPE_WMA }, + { "ogg", LIBMTP_FILETYPE_OGG }, + { "mp4", LIBMTP_FILETYPE_MP4 }, + { "wmv", LIBMTP_FILETYPE_WMV }, + { "avi", LIBMTP_FILETYPE_AVI }, + { "mpeg", LIBMTP_FILETYPE_MPEG }, + { "mpg", LIBMTP_FILETYPE_MPEG }, + { "asf", LIBMTP_FILETYPE_ASF }, + { "qt", LIBMTP_FILETYPE_QT }, + { "mov", LIBMTP_FILETYPE_QT }, + { "wma", LIBMTP_FILETYPE_WMA }, + { "jpg", LIBMTP_FILETYPE_JPEG }, + { "jpeg", LIBMTP_FILETYPE_JPEG }, + { "jfif", LIBMTP_FILETYPE_JFIF }, + { "tif", LIBMTP_FILETYPE_TIFF }, + { "tiff", LIBMTP_FILETYPE_TIFF }, + { "bmp", LIBMTP_FILETYPE_BMP }, + { "gif", LIBMTP_FILETYPE_GIF }, + { "pic", LIBMTP_FILETYPE_PICT }, + { "pict", LIBMTP_FILETYPE_PICT }, + { "png", LIBMTP_FILETYPE_PNG }, + { "wmf", LIBMTP_FILETYPE_WINDOWSIMAGEFORMAT }, + { "ics", LIBMTP_FILETYPE_VCALENDAR2 }, + { "exe", LIBMTP_FILETYPE_WINEXEC }, + { "com", LIBMTP_FILETYPE_WINEXEC }, + { "bat", LIBMTP_FILETYPE_WINEXEC }, + { "dll", LIBMTP_FILETYPE_WINEXEC }, + { "sys", LIBMTP_FILETYPE_WINEXEC }, + { "aac", LIBMTP_FILETYPE_AAC }, + { "mp2", LIBMTP_FILETYPE_MP2 }, + { "flac", LIBMTP_FILETYPE_FLAC }, + { "m4a", LIBMTP_FILETYPE_M4A }, + { "doc", LIBMTP_FILETYPE_DOC }, + { "xml", LIBMTP_FILETYPE_XML }, + { "xls", LIBMTP_FILETYPE_XLS }, + { "ppt", LIBMTP_FILETYPE_PPT }, + { "mht", LIBMTP_FILETYPE_MHT }, + { "jp2", LIBMTP_FILETYPE_JP2 }, + { "jpx", LIBMTP_FILETYPE_JPX } +}; + /* Find the file type based on extension */ LIBMTP_filetype_t find_filetype (const char * filename) { - char *ptype; - ptype = rindex(filename,'.')+1; - LIBMTP_filetype_t filetype; - /* This need to be kept constantly updated as new file types arrive. */ - if (!strcasecmp (ptype, "wav")) { - filetype = LIBMTP_FILETYPE_WAV; - } else if (!strcasecmp (ptype, "mp3")) { - filetype = LIBMTP_FILETYPE_MP3; - } else if (!strcasecmp (ptype, "wma")) { - filetype = LIBMTP_FILETYPE_WMA; - } else if (!strcasecmp (ptype, "ogg")) { - filetype = LIBMTP_FILETYPE_OGG; - } else if (!strcasecmp (ptype, "mp4")) { - filetype = LIBMTP_FILETYPE_MP4; - } else if (!strcasecmp (ptype, "wmv")) { - filetype = LIBMTP_FILETYPE_WMV; - } else if (!strcasecmp (ptype, "avi")) { - filetype = LIBMTP_FILETYPE_AVI; - } else if (!strcasecmp (ptype, "mpeg") || !strcasecmp (ptype, "mpg")) { - filetype = LIBMTP_FILETYPE_MPEG; - } else if (!strcasecmp (ptype, "asf")) { - filetype = LIBMTP_FILETYPE_ASF; - } else if (!strcasecmp (ptype, "qt") || !strcasecmp (ptype, "mov")) { - filetype = LIBMTP_FILETYPE_QT; - } else if (!strcasecmp (ptype, "wma")) { - filetype = LIBMTP_FILETYPE_WMA; - } else if (!strcasecmp (ptype, "jpg") || !strcasecmp (ptype, "jpeg")) { - filetype = LIBMTP_FILETYPE_JPEG; - } else if (!strcasecmp (ptype, "jfif")) { - filetype = LIBMTP_FILETYPE_JFIF; - } else if (!strcasecmp (ptype, "tif") || !strcasecmp (ptype, "tiff")) { - filetype = LIBMTP_FILETYPE_TIFF; - } else if (!strcasecmp (ptype, "bmp")) { - filetype = LIBMTP_FILETYPE_BMP; - } else if (!strcasecmp (ptype, "gif")) { - filetype = LIBMTP_FILETYPE_GIF; - } else if (!strcasecmp (ptype, "pic") || !strcasecmp (ptype, "pict")) { - filetype = LIBMTP_FILETYPE_PICT; - } else if (!strcasecmp (ptype, "png")) { - filetype = LIBMTP_FILETYPE_PNG; - } else if (!strcasecmp (ptype, "wmf")) { - filetype = LIBMTP_FILETYPE_WINDOWSIMAGEFORMAT; - } else if (!strcasecmp (ptype, "ics")) { - filetype = LIBMTP_FILETYPE_VCALENDAR2; - } else if (!strcasecmp (ptype, "exe") || !strcasecmp (ptype, "com") || - !strcasecmp (ptype, "bat") || !strcasecmp (ptype, "dll") || - !strcasecmp (ptype, "sys")) { - filetype = LIBMTP_FILETYPE_WINEXEC; - } else if (!strcasecmp (ptype, "aac")) { - filetype = LIBMTP_FILETYPE_AAC; - } else if (!strcasecmp (ptype, "mp2")) { - filetype = LIBMTP_FILETYPE_MP2; - } else if (!strcasecmp (ptype, "flac")) { - filetype = LIBMTP_FILETYPE_FLAC; - } else if (!strcasecmp (ptype, "m4a")) { - filetype = LIBMTP_FILETYPE_M4A; - } else if (!strcasecmp (ptype, "doc")) { - filetype = LIBMTP_FILETYPE_DOC; - } else if (!strcasecmp (ptype, "xml")) { - filetype = LIBMTP_FILETYPE_XML; - } else if (!strcasecmp (ptype, "xls")) { - filetype = LIBMTP_FILETYPE_XLS; - } else if (!strcasecmp (ptype, "ppt")) { - filetype = LIBMTP_FILETYPE_PPT; - } else if (!strcasecmp (ptype, "mht")) { - filetype = LIBMTP_FILETYPE_MHT; - } else if (!strcasecmp (ptype, "jp2")) { - filetype = LIBMTP_FILETYPE_JP2; - } else if (!strcasecmp (ptype, "jpx")) { - filetype = LIBMTP_FILETYPE_JPX; - } else { - /* Tagging as unknown file type */ - filetype = LIBMTP_FILETYPE_UNKNOWN; - } - return filetype; + char *ptype = strrchr(filename,'.'); + unsigned int n; + + if (ptype != NULL) + { + /* Skip '.' char */ + ptype++; + + /* Seach entry in the table */ + for (n=0; n