Browse code

Added sanity check to get_unicode_name

git-svn: trunk@3361

Nigel Horne authored on 2007/11/07 03:48:29
Showing 2 changed files
... ...
@@ -1,3 +1,8 @@
1
+Tue Nov  6 17:49:03 GMT 2007 (njh)
2
+----------------------------------
3
+  * libclamav/vba_extract.c:	Added sanity check to get_unicode_name(),
4
+					needed for W97M.Advice
5
+
1 6
 Tue Nov  6 17:17:56 CET 2007 (tk)
2 7
 ---------------------------------
3 8
   * libclamav/matcher-bm.c: minor code cleanup; load balance bm_suffix
... ...
@@ -133,42 +133,48 @@ static const vba_version_t vba_version[NUM_VBA_VERSIONS] = {
133 133
 static char *
134 134
 get_unicode_name(const char *name, int size, int is_mac)
135 135
 {
136
-        int i, j;
137
-        char *newname;
136
+        int i, increment;
137
+        char *newname, *ret;
138 138
 
139
-	if (!name || *name == 0 || size <= 0) {
139
+	if((name == NULL) || (*name == '\0') || (size <= 0))
140 140
                 return NULL;
141
-        }
142 141
 
143
-        newname = (char *) cli_malloc(size*7);
144
-        if (!newname) {
142
+        newname = (char *)cli_malloc(size * 7);
143
+        if(newname == NULL)
145 144
                 return NULL;
146
-        }
147
-        j=0;
148
-        for (i=0 ; i < size; i += (is_mac ? 1 : 2) ) {
149
-                if (isprint(name[i])) {
150
-                        newname[j++] = name[i];
151
-                } else {
152
-                        if (name[i] < 10 && name[i] >= 0) {
153
-                                newname[j++] = '_';
154
-                                newname[j++] = (char)(name[i] + '0');
155
-                        }
156
-			else {
145
+
146
+	if((!is_mac) && (size & 0x1)) {
147
+		cli_dbgmsg("get_unicode_name: odd number of bytes %d\n", size);
148
+		--size;
149
+	}
150
+
151
+	increment = (is_mac) ? 1 : 2;
152
+	ret = newname;
153
+
154
+        for(i = 0; i < size; i += increment) {
155
+                if(isprint(name[i]))
156
+                        *ret++ = name[i];
157
+                else {
158
+			if(name[i] < 10 && name[i] >= 0) {
159
+				*ret++ = '_';
160
+				*ret++ = (char)(name[i] + '0');
161
+			} else {
157 162
 				const uint16_t x = (uint16_t)(((name[i]) << 8) | name[i + 1]);
158 163
 
159
-				newname[j++] = '_';
160
-				newname[j++] = (char)('a'+((x&0xF)));
161
-				newname[j++] = (char)('a'+((x>>4)&0xF));
162
-				newname[j++] = (char)('a'+((x>>8)&0xF));
164
+				*ret++ = '_';
165
+				*ret++ = (char)('a'+((x&0xF)));
166
+				*ret++ = (char)('a'+((x>>4)&0xF));
167
+				*ret++ = (char)('a'+((x>>8)&0xF));
163 168
 #if	0
164
-				newname[j++] = (char)('a'+((x>>16)&0xF));	/* FIXME: x>>16 MUST == 0 */
165
-				newname[j++] = (char)('a'+((x>>24)&0xF));	/* FIXME: x>>24 MUST == 0 */
169
+				*ret++ = (char)('a'+((x>>16)&0xF));	/* FIXME: x>>16 MUST == 0 */
170
+				*ret++ = (char)('a'+((x>>24)&0xF));	/* FIXME: x>>24 MUST == 0 */
166 171
 #endif
167 172
 			}
168
-                        newname[j++] = '_';
169
-                }
170
-        }
171
-        newname[j] = '\0';
173
+			*ret++ = '_';
174
+		}
175
+	}
176
+
177
+        *ret = '\0';
172 178
         return newname;
173 179
 }
174 180