From: Jan Engelhardt Date: Tue, 29 Sep 2009 23:11:24 +0000 (+0200) Subject: pknock: fix return values and memleak in has_secret X-Git-Tag: v1.19~2^2~47 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d116000784cc37dddd6b6d2aba04da85532cf85c;p=thirdparty%2Fxtables-addons.git pknock: fix return values and memleak in has_secret First, there is a memory leak - when the crypto functions fail, hexresult was not freed. Second, in that error case, the return value is simply passed up to the caller, ignoring the different meanings of 0 and 1 between crypto and pknock. --- diff --git a/extensions/xt_pknock.c b/extensions/xt_pknock.c index 1f9e3d8..a24303c 100644 --- a/extensions/xt_pknock.c +++ b/extensions/xt_pknock.c @@ -737,7 +737,8 @@ has_secret(const unsigned char *secret, unsigned int secret_len, uint32_t ipsrc, ret = crypto_hash_setkey(crypto.tfm, secret, secret_len); if (ret) { printk("crypto_hash_setkey() failed ret=%d\n", ret); - return ret; + ret = 0; + goto out; } /* @@ -748,20 +749,19 @@ has_secret(const unsigned char *secret, unsigned int secret_len, uint32_t ipsrc, ret = crypto_hash_digest(&crypto.desc, sg, 8, result); if (ret) { printk("crypto_hash_digest() failed ret=%d\n", ret); - return ret; + ret = 0; + goto out; } crypt_to_hex(hexresult, result, crypto.size); if (memcmp(hexresult, payload, hexa_size) != 0) { pr_debug("secret match failed\n"); - goto out; + ret = 0; } - ret = 1; - -out: - if (hexresult != NULL) kfree(hexresult); + out: + kfree(hexresult); return ret; }