git-svn: trunk@4911
Török Edvin authored on 2009/03/09 20:22:57... | ... |
@@ -1,3 +1,8 @@ |
1 |
+Fri Mar 6 16:15:19 EET 2009 (edwin) |
|
2 |
+------------------------------------ |
|
3 |
+ * libclamav/mpool.c, libclamav/str.c, libclamav/str.h: avoid |
|
4 |
+ unneeded calloc + memcpy. |
|
5 |
+ |
|
1 | 6 |
Sat Mar 7 19:15:14 CET 2009 (acab) |
2 | 7 |
----------------------------------- |
3 | 8 |
* clamscan: extend clamscan summary (bb#1206) |
... | ... |
@@ -583,18 +583,22 @@ void *mpool_realloc2(struct MP *mp, void *ptr, size_t size) { |
583 | 583 |
return new_ptr; |
584 | 584 |
} |
585 | 585 |
|
586 |
-unsigned char *cli_mpool_hex2str(mpool_t *mp, const unsigned char *str) { |
|
587 |
- unsigned char *tmp = (unsigned char *)cli_hex2str((char *)str); |
|
588 |
- |
|
589 |
- if(tmp) { |
|
590 |
- unsigned char *res; |
|
591 |
- unsigned int tmpsz = strlen((char *)str) / 2 + 1; |
|
592 |
- if((res = mpool_malloc(mp, tmpsz))) |
|
593 |
- memcpy(res, tmp, tmpsz); |
|
594 |
- free(tmp); |
|
595 |
- return res; |
|
596 |
- } |
|
597 |
- return NULL; |
|
586 |
+unsigned char *cli_mpool_hex2str(mpool_t *mp, const unsigned char *hex) { |
|
587 |
+ unsigned char *str; |
|
588 |
+ size_t len = strlen((const char*)hex); |
|
589 |
+ |
|
590 |
+ if (len&1) { |
|
591 |
+ cli_errmsg("cli_hex2str(): Malformed hexstring: %s (length: %d)\n", str, len); |
|
592 |
+ return NULL; |
|
593 |
+ } |
|
594 |
+ |
|
595 |
+ str = mpool_malloc(mp, (len/2) + 1); |
|
596 |
+ if (cli_hex2str_to(hex, str, len) == -1) { |
|
597 |
+ mpool_free(mp, str); |
|
598 |
+ return NULL; |
|
599 |
+ } |
|
600 |
+ str[len/2] = '\0'; |
|
601 |
+ return str; |
|
598 | 602 |
} |
599 | 603 |
|
600 | 604 |
char *cli_mpool_strdup(mpool_t *mp, const char *s) { |
... | ... |
@@ -620,8 +624,9 @@ char *cli_mpool_virname(mpool_t *mp, const char *virname, unsigned int official) |
620 | 620 |
if(!virname) |
621 | 621 |
return NULL; |
622 | 622 |
|
623 |
- if((pt = strstr(virname, " (Clam)"))) |
|
624 |
- *pt='\0'; |
|
623 |
+ if((pt = strchr(virname, ' '))) |
|
624 |
+ if((pt = strstr(pt, " (Clam)"))) |
|
625 |
+ *pt='\0'; |
|
625 | 626 |
|
626 | 627 |
if(!virname[0]) { |
627 | 628 |
cli_errmsg("cli_virname: Empty virus name\n"); |
... | ... |
@@ -137,9 +137,8 @@ uint16_t *cli_hex2ui(const char *hex) |
137 | 137 |
|
138 | 138 |
char *cli_hex2str(const char *hex) |
139 | 139 |
{ |
140 |
- char *str, *ptr; |
|
141 |
- int i, len, val, c; |
|
142 |
- |
|
140 |
+ unsigned char *str; |
|
141 |
+ size_t len; |
|
143 | 142 |
|
144 | 143 |
len = strlen(hex); |
145 | 144 |
|
... | ... |
@@ -152,7 +151,18 @@ char *cli_hex2str(const char *hex) |
152 | 152 |
if(!str) |
153 | 153 |
return NULL; |
154 | 154 |
|
155 |
- ptr = str; |
|
155 |
+ if (cli_hex2str_to(hex, str, len) == -1) { |
|
156 |
+ free(str); |
|
157 |
+ return NULL; |
|
158 |
+ } |
|
159 |
+ return str; |
|
160 |
+} |
|
161 |
+ |
|
162 |
+int cli_hex2str_to(const char *hex, unsigned char *ptr, size_t len) |
|
163 |
+{ |
|
164 |
+ size_t i; |
|
165 |
+ int c; |
|
166 |
+ unsigned char val; |
|
156 | 167 |
|
157 | 168 |
for(i = 0; i < len; i += 2) { |
158 | 169 |
if((c = cli_hex2int(hex[i])) >= 0) { |
... | ... |
@@ -160,18 +170,16 @@ char *cli_hex2str(const char *hex) |
160 | 160 |
if((c = cli_hex2int(hex[i+1])) >= 0) { |
161 | 161 |
val = (val << 4) + c; |
162 | 162 |
} else { |
163 |
- free(str); |
|
164 |
- return NULL; |
|
163 |
+ return -1; |
|
165 | 164 |
} |
166 | 165 |
} else { |
167 |
- free(str); |
|
168 |
- return NULL; |
|
166 |
+ return -1; |
|
169 | 167 |
} |
170 | 168 |
|
171 |
- *ptr++ = (char)val; |
|
169 |
+ *ptr++ = val; |
|
172 | 170 |
} |
173 | 171 |
|
174 |
- return str; |
|
172 |
+ return 0; |
|
175 | 173 |
} |
176 | 174 |
|
177 | 175 |
int cli_hex2num(const char *hex) |
... | ... |
@@ -36,6 +36,7 @@ int cli_chomp(char *string); |
36 | 36 |
char *cli_strtok(const char *line, int field, const char *delim); |
37 | 37 |
int cli_realhex2ui(const char *hex, uint16_t *ptr, unsigned int len); |
38 | 38 |
uint16_t *cli_hex2ui(const char *hex); |
39 |
+int cli_hex2str_to(const char *hex, unsigned char *ptr, size_t len); |
|
39 | 40 |
char *cli_hex2str(const char *hex); |
40 | 41 |
int cli_hex2num(const char *hex); |
41 | 42 |
char *cli_str2hex(const char *string, unsigned int len); |