git-svn: trunk@3361
Nigel Horne authored on 2007/11/07 03:48:29... | ... |
@@ -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 |
|