]>
Commit | Line | Data |
---|---|---|
be091c23 KK |
1 | |
2 | # HG changeset patch | |
3 | # User John Lindgren <john.lindgren@tds.net> | |
4 | # Date 1295406442 18000 | |
5 | # Node ID b2c94059fb28375515c0ca9b54a5b2f09c333375 | |
6 | # Parent 3f1ab558c6cf557d226151e941b5113ccd154d73 | |
7 | mtp_up: Use strrchr instead of rindex; fix potential 0x1 pointer dereference (patch from Carlo Bramini, AUDPLUG-323). | |
8 | ||
9 | diff -r 3f1ab558c6cf -r b2c94059fb28 src/mtp_up/filetype.c | |
10 | --- a/src/mtp_up/filetype.c Tue Jan 18 01:19:25 2011 -0500 | |
11 | +++ b/src/mtp_up/filetype.c Tue Jan 18 22:07:22 2011 -0500 | |
12 | @@ -2,84 +2,76 @@ | |
13 | #include "string.h" | |
14 | #include "filetype.h" | |
15 | ||
16 | +typedef struct { | |
17 | + const char *ptype; | |
18 | + const LIBMTP_filetype_t filetype; | |
19 | +} file_entry_t; | |
20 | + | |
21 | +/* This need to be kept constantly updated as new file types arrive. */ | |
22 | +static const file_entry_t file_entries[] = { | |
23 | + { "wav", LIBMTP_FILETYPE_WAV }, | |
24 | + { "mp3", LIBMTP_FILETYPE_MP3 }, | |
25 | + { "wma", LIBMTP_FILETYPE_WMA }, | |
26 | + { "ogg", LIBMTP_FILETYPE_OGG }, | |
27 | + { "mp4", LIBMTP_FILETYPE_MP4 }, | |
28 | + { "wmv", LIBMTP_FILETYPE_WMV }, | |
29 | + { "avi", LIBMTP_FILETYPE_AVI }, | |
30 | + { "mpeg", LIBMTP_FILETYPE_MPEG }, | |
31 | + { "mpg", LIBMTP_FILETYPE_MPEG }, | |
32 | + { "asf", LIBMTP_FILETYPE_ASF }, | |
33 | + { "qt", LIBMTP_FILETYPE_QT }, | |
34 | + { "mov", LIBMTP_FILETYPE_QT }, | |
35 | + { "wma", LIBMTP_FILETYPE_WMA }, | |
36 | + { "jpg", LIBMTP_FILETYPE_JPEG }, | |
37 | + { "jpeg", LIBMTP_FILETYPE_JPEG }, | |
38 | + { "jfif", LIBMTP_FILETYPE_JFIF }, | |
39 | + { "tif", LIBMTP_FILETYPE_TIFF }, | |
40 | + { "tiff", LIBMTP_FILETYPE_TIFF }, | |
41 | + { "bmp", LIBMTP_FILETYPE_BMP }, | |
42 | + { "gif", LIBMTP_FILETYPE_GIF }, | |
43 | + { "pic", LIBMTP_FILETYPE_PICT }, | |
44 | + { "pict", LIBMTP_FILETYPE_PICT }, | |
45 | + { "png", LIBMTP_FILETYPE_PNG }, | |
46 | + { "wmf", LIBMTP_FILETYPE_WINDOWSIMAGEFORMAT }, | |
47 | + { "ics", LIBMTP_FILETYPE_VCALENDAR2 }, | |
48 | + { "exe", LIBMTP_FILETYPE_WINEXEC }, | |
49 | + { "com", LIBMTP_FILETYPE_WINEXEC }, | |
50 | + { "bat", LIBMTP_FILETYPE_WINEXEC }, | |
51 | + { "dll", LIBMTP_FILETYPE_WINEXEC }, | |
52 | + { "sys", LIBMTP_FILETYPE_WINEXEC }, | |
53 | + { "aac", LIBMTP_FILETYPE_AAC }, | |
54 | + { "mp2", LIBMTP_FILETYPE_MP2 }, | |
55 | + { "flac", LIBMTP_FILETYPE_FLAC }, | |
56 | + { "m4a", LIBMTP_FILETYPE_M4A }, | |
57 | + { "doc", LIBMTP_FILETYPE_DOC }, | |
58 | + { "xml", LIBMTP_FILETYPE_XML }, | |
59 | + { "xls", LIBMTP_FILETYPE_XLS }, | |
60 | + { "ppt", LIBMTP_FILETYPE_PPT }, | |
61 | + { "mht", LIBMTP_FILETYPE_MHT }, | |
62 | + { "jp2", LIBMTP_FILETYPE_JP2 }, | |
63 | + { "jpx", LIBMTP_FILETYPE_JPX } | |
64 | +}; | |
65 | + | |
66 | /* Find the file type based on extension */ | |
67 | LIBMTP_filetype_t | |
68 | find_filetype (const char * filename) | |
69 | { | |
70 | - char *ptype; | |
71 | - ptype = rindex(filename,'.')+1; | |
72 | - LIBMTP_filetype_t filetype; | |
73 | - /* This need to be kept constantly updated as new file types arrive. */ | |
74 | - if (!strcasecmp (ptype, "wav")) { | |
75 | - filetype = LIBMTP_FILETYPE_WAV; | |
76 | - } else if (!strcasecmp (ptype, "mp3")) { | |
77 | - filetype = LIBMTP_FILETYPE_MP3; | |
78 | - } else if (!strcasecmp (ptype, "wma")) { | |
79 | - filetype = LIBMTP_FILETYPE_WMA; | |
80 | - } else if (!strcasecmp (ptype, "ogg")) { | |
81 | - filetype = LIBMTP_FILETYPE_OGG; | |
82 | - } else if (!strcasecmp (ptype, "mp4")) { | |
83 | - filetype = LIBMTP_FILETYPE_MP4; | |
84 | - } else if (!strcasecmp (ptype, "wmv")) { | |
85 | - filetype = LIBMTP_FILETYPE_WMV; | |
86 | - } else if (!strcasecmp (ptype, "avi")) { | |
87 | - filetype = LIBMTP_FILETYPE_AVI; | |
88 | - } else if (!strcasecmp (ptype, "mpeg") || !strcasecmp (ptype, "mpg")) { | |
89 | - filetype = LIBMTP_FILETYPE_MPEG; | |
90 | - } else if (!strcasecmp (ptype, "asf")) { | |
91 | - filetype = LIBMTP_FILETYPE_ASF; | |
92 | - } else if (!strcasecmp (ptype, "qt") || !strcasecmp (ptype, "mov")) { | |
93 | - filetype = LIBMTP_FILETYPE_QT; | |
94 | - } else if (!strcasecmp (ptype, "wma")) { | |
95 | - filetype = LIBMTP_FILETYPE_WMA; | |
96 | - } else if (!strcasecmp (ptype, "jpg") || !strcasecmp (ptype, "jpeg")) { | |
97 | - filetype = LIBMTP_FILETYPE_JPEG; | |
98 | - } else if (!strcasecmp (ptype, "jfif")) { | |
99 | - filetype = LIBMTP_FILETYPE_JFIF; | |
100 | - } else if (!strcasecmp (ptype, "tif") || !strcasecmp (ptype, "tiff")) { | |
101 | - filetype = LIBMTP_FILETYPE_TIFF; | |
102 | - } else if (!strcasecmp (ptype, "bmp")) { | |
103 | - filetype = LIBMTP_FILETYPE_BMP; | |
104 | - } else if (!strcasecmp (ptype, "gif")) { | |
105 | - filetype = LIBMTP_FILETYPE_GIF; | |
106 | - } else if (!strcasecmp (ptype, "pic") || !strcasecmp (ptype, "pict")) { | |
107 | - filetype = LIBMTP_FILETYPE_PICT; | |
108 | - } else if (!strcasecmp (ptype, "png")) { | |
109 | - filetype = LIBMTP_FILETYPE_PNG; | |
110 | - } else if (!strcasecmp (ptype, "wmf")) { | |
111 | - filetype = LIBMTP_FILETYPE_WINDOWSIMAGEFORMAT; | |
112 | - } else if (!strcasecmp (ptype, "ics")) { | |
113 | - filetype = LIBMTP_FILETYPE_VCALENDAR2; | |
114 | - } else if (!strcasecmp (ptype, "exe") || !strcasecmp (ptype, "com") || | |
115 | - !strcasecmp (ptype, "bat") || !strcasecmp (ptype, "dll") || | |
116 | - !strcasecmp (ptype, "sys")) { | |
117 | - filetype = LIBMTP_FILETYPE_WINEXEC; | |
118 | - } else if (!strcasecmp (ptype, "aac")) { | |
119 | - filetype = LIBMTP_FILETYPE_AAC; | |
120 | - } else if (!strcasecmp (ptype, "mp2")) { | |
121 | - filetype = LIBMTP_FILETYPE_MP2; | |
122 | - } else if (!strcasecmp (ptype, "flac")) { | |
123 | - filetype = LIBMTP_FILETYPE_FLAC; | |
124 | - } else if (!strcasecmp (ptype, "m4a")) { | |
125 | - filetype = LIBMTP_FILETYPE_M4A; | |
126 | - } else if (!strcasecmp (ptype, "doc")) { | |
127 | - filetype = LIBMTP_FILETYPE_DOC; | |
128 | - } else if (!strcasecmp (ptype, "xml")) { | |
129 | - filetype = LIBMTP_FILETYPE_XML; | |
130 | - } else if (!strcasecmp (ptype, "xls")) { | |
131 | - filetype = LIBMTP_FILETYPE_XLS; | |
132 | - } else if (!strcasecmp (ptype, "ppt")) { | |
133 | - filetype = LIBMTP_FILETYPE_PPT; | |
134 | - } else if (!strcasecmp (ptype, "mht")) { | |
135 | - filetype = LIBMTP_FILETYPE_MHT; | |
136 | - } else if (!strcasecmp (ptype, "jp2")) { | |
137 | - filetype = LIBMTP_FILETYPE_JP2; | |
138 | - } else if (!strcasecmp (ptype, "jpx")) { | |
139 | - filetype = LIBMTP_FILETYPE_JPX; | |
140 | - } else { | |
141 | - /* Tagging as unknown file type */ | |
142 | - filetype = LIBMTP_FILETYPE_UNKNOWN; | |
143 | - } | |
144 | - return filetype; | |
145 | + char *ptype = strrchr(filename,'.'); | |
146 | + unsigned int n; | |
147 | + | |
148 | + if (ptype != NULL) | |
149 | + { | |
150 | + /* Skip '.' char */ | |
151 | + ptype++; | |
152 | + | |
153 | + /* Seach entry in the table */ | |
154 | + for (n=0; n<sizeof(file_entries)/sizeof(file_entries[0]); n++) | |
155 | + { | |
156 | + if (!strcasecmp (ptype, file_entries[n].ptype)) | |
157 | + return file_entries[n].filetype; | |
158 | + } | |
159 | + } | |
160 | + | |
161 | + return LIBMTP_FILETYPE_UNKNOWN; | |
162 | } | |
163 | ||
164 |