Browse code

avoid unneeded calloc + memcpy.

git-svn: trunk@4911

Török Edvin authored on 2009/03/09 20:22:57
Showing 4 changed files
... ...
@@ -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);