From 9bc0a99c38eb93b276d9224f43819483c2aeebcd Mon Sep 17 00:00:00 2001 From: fanyong Date: Mon, 7 Aug 2006 04:03:39 +0000 Subject: [PATCH] Fix memory leak BUG in main where key and rec be malloc, but no free, the same BUG maybe for key_opt and rec_opt. There are logic errors in function hex2dec, and fix them also. --- lustre/tests/iam_ut.c | 82 ++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 58 insertions(+), 24 deletions(-) diff --git a/lustre/tests/iam_ut.c b/lustre/tests/iam_ut.c index a3a1ad1..db68d3e 100644 --- a/lustre/tests/iam_ut.c +++ b/lustre/tests/iam_ut.c @@ -173,11 +173,13 @@ enum op { unsigned char hex2dec(unsigned char hex) { - if ('0' <= hex && hex <= '9') + if ('0' <= hex && hex <= '9') { return hex - '0'; - else if ('a' <= hex && hex <= 'f') - return hex - 'a'; - else { + } else if ('a' <= hex && hex <= 'f') { + return hex - 'a' + 10; + } else if ('A' <= hex && hex <= 'F') { + return hex - 'A' + 10; + } else { fprintf(stderr, "Wrong hex digit '%c'\n", hex); exit(1); } @@ -317,59 +319,80 @@ int main(int argc, char **argv) if (key == NULL || rec == NULL) { fprintf(stderr, "cannot allocate memory\n"); - return 1; + rc = 1; + goto out; } copier = keynul ? &strncpy : &memcpy; copier(key, key_opt ? : "RIVERRUN", keysize + 1); + if (keynul == 0) { + free(key_opt); + key_opt = NULL; + } copier = recnul ? &strncpy : &memcpy; copier(rec, rec_opt ? : "PALEFIRE", recsize + 1); + if (recnul == 0) { + free(rec_opt); + rec_opt = NULL; + } - if (op == OP_INSERT) - return doop(0, key, rec, IAM_IOC_INSERT, "IAM_IOC_INSERT"); - else if (op == OP_DELETE) - return doop(0, key, rec, IAM_IOC_DELETE, "IAM_IOC_DELETE"); - else if (op == OP_LOOKUP) { + if (op == OP_INSERT) { + rc = doop(0, key, rec, IAM_IOC_INSERT, "IAM_IOC_INSERT"); + goto out; + } else if (op == OP_DELETE) { + rc = doop(0, key, rec, IAM_IOC_DELETE, "IAM_IOC_DELETE"); + goto out; + } else if (op == OP_LOOKUP) { rc = doop(0, key, rec, IAM_IOC_LOOKUP, "IAM_IOC_LOOKUP"); if (rc == 0) print_rec(rec, recsize); - return rc; + goto out; } else if (op == OP_IT_START) { rc = doop(0, key, rec, IAM_IOC_IT_START, "IAM_IOC_IT_START"); if (rc == 0) { print_rec(key, keysize); print_rec(rec, recsize); } - return rc; + goto out; } else if (op == OP_IT_STOP) { - return doop(0, key, rec, IAM_IOC_IT_STOP, "IAM_IOC_IT_STOP"); + rc = doop(0, key, rec, IAM_IOC_IT_STOP, "IAM_IOC_IT_STOP"); + goto out; } else if (op == OP_IT_NEXT) { rc = doop(0, key, rec, IAM_IOC_IT_NEXT, "IAM_IOC_IT_NEXT"); if (rc == 0) { print_rec(key, keysize); print_rec(rec, recsize); } - return rc; + goto out; } rc = insert(0, key, rec); - if (rc != 0) - return 1; + if (rc != 0) { + rc = 1; + goto out; + } rc = insert(0, "DAEDALUS", "FINNEGAN"); - if (rc != 0) - return 1; + if (rc != 0) { + rc = 1; + goto out; + } rc = insert(0, "DAEDALUS", "FINNEGAN"); if (errno != EEXIST) { if (rc == 0) fprintf(stderr, "Duplicate key not detected!\n"); - return 1; + if (rc != 0) { + rc = 1; + goto out; + } } rc = lookup(0, "RIVERRUN", rec); - if (rc != 0) - return 1; + if (rc != 0) { + rc = 1; + goto out; + } print_rec(rec, recsize); @@ -379,11 +402,22 @@ int main(int argc, char **argv) snprintf(key, keysize + 1, "y-%x-x", i); snprintf(rec, recsize + 1, "p-%x-q", 1000 - i); rc = insert(0, key, rec); - if (rc != 0) - return 1; + if (rc != 0) { + rc = 1; + goto out; + } if (verbose > 1) printf("key %#x inserted\n", i); } - return 0; + rc = 0; + +out: + if (key) { + free(key); + } + if (rec) { + free(rec); + } + return rc; } -- 1.8.3.1