Browse code

- fixed usage of unalloc. mem.

Andrei Pelinescu-Onciul authored on 29/05/2007 21:25:53
Showing 1 changed files
... ...
@@ -978,6 +978,22 @@ inline static int run_line(int s, char* l, char* format)
978 978
 
979 979
 
980 980
 
981
+static void free_rpc_array(struct binrpc_val* a, int size)
982
+{
983
+	int r;
984
+	for (r=0; r<size; r++){
985
+		if (a[r].name.s)
986
+			free(a[r].name.s);
987
+		if ((a[r].type==BINRPC_T_STR || a[r].type==BINRPC_T_BYTES) &&
988
+				a[r].u.strval.s){
989
+			free(a[r].u.strval.s);
990
+		}
991
+	}
992
+	free(a);
993
+}
994
+
995
+
996
+
981 997
 /* parse the body into a malloc allocated,  binrpc_val array */
982 998
 static struct binrpc_val* parse_reply_body(int* records, 
983 999
 											struct binrpc_parse_ctx* in_pkt,
... ...
@@ -991,6 +1007,7 @@ static struct binrpc_val* parse_reply_body(int* records,
991 991
 	int ret;
992 992
 	int rec;
993 993
 
994
+	rec=0;
994 995
 	if (*records==0){
995 996
 		*records=100; /* start with a reasonable size */
996 997
 	};
... ...
@@ -999,7 +1016,6 @@ static struct binrpc_val* parse_reply_body(int* records,
999 999
 		goto error_mem;
1000 1000
 	p=body;
1001 1001
 	end=p+size;
1002
-	rec=0;
1003 1002
 	
1004 1003
 	/* read body */
1005 1004
 	while(p<end){
... ...
@@ -1025,6 +1041,24 @@ static struct binrpc_val* parse_reply_body(int* records,
1025 1025
 			*records*=2;
1026 1026
 		}
1027 1027
 		a[rec]=val;
1028
+		if (val.name.s){
1029
+			if ((a[rec].name.s=malloc(val.name.len+1))==0)
1030
+				goto error_mem;
1031
+			memcpy(a[rec].name.s, val.name.s, val.name.len);
1032
+			a[rec].name.s[val.name.len+1]=0; /* 0-term */
1033
+		}
1034
+		if (val.u.strval.s){
1035
+			if (val.type==BINRPC_T_STR){
1036
+				if ((a[rec].u.strval.s=malloc(val.u.strval.len+1))==0)
1037
+					goto error_mem;
1038
+				memcpy(a[rec].u.strval.s, val.u.strval.s, val.u.strval.len);
1039
+				a[rec].u.strval.s[val.u.strval.len]=0; /* 0-term */
1040
+			}else if (val.type==BINRPC_T_BYTES){
1041
+				if ((a[rec].u.strval.s=malloc(val.u.strval.len))==0)
1042
+					goto error_mem;
1043
+				memcpy(a[rec].u.strval.s, val.u.strval.s, val.u.strval.len);
1044
+			}
1045
+		}
1028 1046
 		rec++;
1029 1047
 	}
1030 1048
 	if (rec && (rec<*records)){
... ...
@@ -1036,7 +1070,7 @@ error_mem:
1036 1036
 	fprintf(stderr, "ERROR: parse_reply_body: out of memory\n");
1037 1037
 error:
1038 1038
 	if (a){
1039
-		free(a);
1039
+		free_rpc_array(a, rec);
1040 1040
 	}
1041 1041
 	*records=0;
1042 1042
 	return 0;
... ...
@@ -1482,7 +1516,7 @@ end:
1482 1482
 	if (format)
1483 1483
 		free(format);
1484 1484
 	if (rpc_array)
1485
-		free(rpc_array);
1485
+		free_rpc_array(rpc_array, rpc_no);
1486 1486
 	cleanup();
1487 1487
 	exit(0);
1488 1488
 error:
... ...
@@ -1491,7 +1525,7 @@ error:
1491 1491
 	if (format)
1492 1492
 		free(format);
1493 1493
 	if (rpc_array)
1494
-		free(rpc_array);
1494
+		free_rpc_array(rpc_array, rpc_no);
1495 1495
 	cleanup();
1496 1496
 	exit(-1);
1497 1497
 }