pgcrypto: fix memset() calls that might be optimized away
authorBruce Momjian <bruce@momjian.us>
Thu, 17 Apr 2014 16:37:53 +0000 (12:37 -0400)
committerBruce Momjian <bruce@momjian.us>
Thu, 17 Apr 2014 16:37:53 +0000 (12:37 -0400)
Specifically, on-stack memset() might be removed, so:

* Replace memset() with px_memset()
* Add px_memset to copy_crlf()
* Add px_memset to pgp-s2k.c

Patch by Marko Kreen

Report by PVS-Studio

Backpatch through 8.4.

22 files changed:
contrib/pgcrypto/crypt-blowfish.c
contrib/pgcrypto/crypt-md5.c
contrib/pgcrypto/fortuna.c
contrib/pgcrypto/internal-sha2.c
contrib/pgcrypto/internal.c
contrib/pgcrypto/mbuf.c
contrib/pgcrypto/openssl.c
contrib/pgcrypto/pgp-cfb.c
contrib/pgcrypto/pgp-compress.c
contrib/pgcrypto/pgp-decrypt.c
contrib/pgcrypto/pgp-encrypt.c
contrib/pgcrypto/pgp-mpi.c
contrib/pgcrypto/pgp-pgsql.c
contrib/pgcrypto/pgp-pubenc.c
contrib/pgcrypto/pgp-pubkey.c
contrib/pgcrypto/pgp-s2k.c
contrib/pgcrypto/pgp.c
contrib/pgcrypto/px-crypt.c
contrib/pgcrypto/px-hmac.c
contrib/pgcrypto/px.c
contrib/pgcrypto/px.h
contrib/pgcrypto/sha2.c

index 06aa1683cdeb59cb40d9a40a3f14fbb72cbb5788..1bd73abae842c61036a10c326e4392f032a4519c 100644 (file)
@@ -34,8 +34,8 @@
 
 #include "postgres.h"
 
-#include "px.h"
 #include "px-crypt.h"
+#include "px.h"
 
 #ifdef __i386__
 #define BF_ASM             0   /* 1 */
@@ -617,7 +617,7 @@ _crypt_blowfish_rn(const char *key, const char *setting,
    count = (BF_word) 1 << ((setting[4] - '0') * 10 + (setting[5] - '0'));
    if (count < 16 || BF_decode(data.binary.salt, &setting[7], 16))
    {
-       memset(data.binary.salt, 0, sizeof(data.binary.salt));
+       px_memset(data.binary.salt, 0, sizeof(data.binary.salt));
        return NULL;
    }
    BF_swap(data.binary.salt, 4);
@@ -730,7 +730,7 @@ _crypt_blowfish_rn(const char *key, const char *setting,
 /* Overwrite the most obvious sensitive data we have on the stack. Note
  * that this does not guarantee there's no sensitive data left on the
  * stack and/or in registers; I'm not aware of portable code that does. */
-   memset(&data, 0, sizeof(data));
+   px_memset(&data, 0, sizeof(data));
 
    return output;
 }
index d70fc341afa168882bc6d7bb6f359308d0b61ed3..a48166414b41a2f47776038ca3b19a8cdd1203a6 100644 (file)
@@ -89,7 +89,7 @@ px_crypt_md5(const char *pw, const char *salt, char *passwd, unsigned dstlen)
        px_md_update(ctx, final, pl > MD5_SIZE ? MD5_SIZE : pl);
 
    /* Don't leave anything around in vm they could use. */
-   memset(final, 0, sizeof final);
+   px_memset(final, 0, sizeof final);
 
    /* Then something really weird... */
    for (i = strlen(pw); i; i >>= 1)
@@ -154,7 +154,7 @@ px_crypt_md5(const char *pw, const char *salt, char *passwd, unsigned dstlen)
    *p = '\0';
 
    /* Don't leave anything around in vm they could use. */
-   memset(final, 0, sizeof final);
+   px_memset(final, 0, sizeof final);
 
    px_md_free(ctx1);
    px_md_free(ctx);
index 4e97946ab3c33b2e4b9a751f30bc9390e790c02a..91d461c96fba3cd6c43a50b18f5aacabbcb55f8b 100644 (file)
@@ -34,6 +34,7 @@
 #include <sys/time.h>
 #include <time.h>
 
+#include "px.h"
 #include "rijndael.h"
 #include "sha2.h"
 #include "fortuna.h"
@@ -169,7 +170,7 @@ md_result(MD_CTX * ctx, uint8 *dst)
 
    memcpy(&tmp, ctx, sizeof(*ctx));
    SHA256_Final(dst, &tmp);
-   memset(&tmp, 0, sizeof(tmp));
+   px_memset(&tmp, 0, sizeof(tmp));
 }
 
 /*
@@ -243,7 +244,7 @@ enough_time_passed(FState *st)
    if (ok)
        memcpy(last, &tv, sizeof(tv));
 
-   memset(&tv, 0, sizeof(tv));
+   px_memset(&tv, 0, sizeof(tv));
 
    return ok;
 }
@@ -290,8 +291,8 @@ reseed(FState *st)
    /* use new key */
    ciph_init(&st->ciph, st->key, BLOCK);
 
-   memset(&key_md, 0, sizeof(key_md));
-   memset(buf, 0, BLOCK);
+   px_memset(&key_md, 0, sizeof(key_md));
+   px_memset(buf, 0, BLOCK);
 }
 
 /*
@@ -341,8 +342,8 @@ add_entropy(FState *st, const uint8 *data, unsigned len)
    if (pos == 0)
        st->pool0_bytes += len;
 
-   memset(hash, 0, BLOCK);
-   memset(&md, 0, sizeof(md));
+   px_memset(hash, 0, BLOCK);
+   px_memset(&md, 0, sizeof(md));
 }
 
 /*
@@ -378,7 +379,7 @@ startup_tricks(FState *st)
        encrypt_counter(st, buf + CIPH_BLOCK);
        md_update(&st->pool[i], buf, BLOCK);
    }
-   memset(buf, 0, BLOCK);
+   px_memset(buf, 0, BLOCK);
 
    /* Hide the key. */
    rekey(st);
index 1e36a369e010c4c824f8d2cc15d962d9ef30f717..acbb50930b4b47fe819f16c72401bbf9e5aa9260 100644 (file)
@@ -84,7 +84,7 @@ int_sha224_free(PX_MD *h)
 {
    SHA224_CTX *ctx = (SHA224_CTX *) h->p.ptr;
 
-   memset(ctx, 0, sizeof(*ctx));
+   px_memset(ctx, 0, sizeof(*ctx));
    px_free(ctx);
    px_free(h);
 }
@@ -132,7 +132,7 @@ int_sha256_free(PX_MD *h)
 {
    SHA256_CTX *ctx = (SHA256_CTX *) h->p.ptr;
 
-   memset(ctx, 0, sizeof(*ctx));
+   px_memset(ctx, 0, sizeof(*ctx));
    px_free(ctx);
    px_free(h);
 }
@@ -180,7 +180,7 @@ int_sha384_free(PX_MD *h)
 {
    SHA384_CTX *ctx = (SHA384_CTX *) h->p.ptr;
 
-   memset(ctx, 0, sizeof(*ctx));
+   px_memset(ctx, 0, sizeof(*ctx));
    px_free(ctx);
    px_free(h);
 }
@@ -228,7 +228,7 @@ int_sha512_free(PX_MD *h)
 {
    SHA512_CTX *ctx = (SHA512_CTX *) h->p.ptr;
 
-   memset(ctx, 0, sizeof(*ctx));
+   px_memset(ctx, 0, sizeof(*ctx));
    px_free(ctx);
    px_free(h);
 }
index 84bda624a433afcd90622232e1a6b43214e41e4e..c17066894ab799d90b7dbff45a29d20d0ef06d4f 100644 (file)
@@ -143,7 +143,7 @@ int_md5_free(PX_MD *h)
 {
    MD5_CTX    *ctx = (MD5_CTX *) h->p.ptr;
 
-   memset(ctx, 0, sizeof(*ctx));
+   px_memset(ctx, 0, sizeof(*ctx));
    px_free(ctx);
    px_free(h);
 }
@@ -191,7 +191,7 @@ int_sha1_free(PX_MD *h)
 {
    SHA1_CTX   *ctx = (SHA1_CTX *) h->p.ptr;
 
-   memset(ctx, 0, sizeof(*ctx));
+   px_memset(ctx, 0, sizeof(*ctx));
    px_free(ctx);
    px_free(h);
 }
@@ -266,7 +266,7 @@ intctx_free(PX_Cipher *c)
 
    if (cx)
    {
-       memset(cx, 0, sizeof *cx);
+       px_memset(cx, 0, sizeof *cx);
        px_free(cx);
    }
    px_free(c);
@@ -659,7 +659,7 @@ system_reseed(void)
        skip = buf[0] >= SYSTEM_RESEED_CHANCE;
    }
    /* clear 1 byte */
-   memset(buf, 0, sizeof(buf));
+   px_memset(buf, 0, sizeof(buf));
 
    if (skip)
        return;
@@ -669,7 +669,7 @@ system_reseed(void)
        fortuna_add_entropy(buf, n);
 
    seed_time = t;
-   memset(buf, 0, sizeof(buf));
+   px_memset(buf, 0, sizeof(buf));
 }
 
 int
index d3eee2ee4f8b808f6955935da8e58fcd56975b16..7355e76e9697e1e4502cb725130ab8a4ea0adc37 100644 (file)
@@ -69,7 +69,7 @@ mbuf_free(MBuf *mbuf)
 {
    if (mbuf->own_data)
    {
-       memset(mbuf->data, 0, mbuf->buf_end - mbuf->data);
+       px_memset(mbuf->data, 0, mbuf->buf_end - mbuf->data);
        px_free(mbuf->data);
    }
    px_free(mbuf);
@@ -249,11 +249,11 @@ pullf_free(PullFilter *pf)
 
    if (pf->buf)
    {
-       memset(pf->buf, 0, pf->buflen);
+       px_memset(pf->buf, 0, pf->buflen);
        px_free(pf->buf);
    }
 
-   memset(pf, 0, sizeof(*pf));
+   px_memset(pf, 0, sizeof(*pf));
    px_free(pf);
 }
 
@@ -298,7 +298,7 @@ pullf_read_max(PullFilter *pf, int len, uint8 **data_p, uint8 *tmpbuf)
        if (res < 0)
        {
            /* so the caller must clear only on success */
-           memset(tmpbuf, 0, total);
+           px_memset(tmpbuf, 0, total);
            return res;
        }
        if (res == 0)
@@ -415,11 +415,11 @@ pushf_free(PushFilter *mp)
 
    if (mp->buf)
    {
-       memset(mp->buf, 0, mp->block_size);
+       px_memset(mp->buf, 0, mp->block_size);
        px_free(mp->buf);
    }
 
-   memset(mp, 0, sizeof(*mp));
+   px_memset(mp, 0, sizeof(*mp));
    px_free(mp);
 }
 
index bb0b4eefd327e5d23a6b0054d96c70cd17002ac9..f4338050a780604c810e277c088851a14e1dc685 100644 (file)
@@ -142,7 +142,7 @@ EVP_MD_CTX_init(EVP_MD_CTX *ctx)
 static int
 EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx)
 {
-   memset(ctx, 0, sizeof(*ctx));
+   px_memset(ctx, 0, sizeof(*ctx));
    return 1;
 }
 
@@ -381,7 +381,7 @@ gen_ossl_free(PX_Cipher *c)
 {
    ossldata   *od = (ossldata *) c->ptr;
 
-   memset(od, 0, sizeof(*od));
+   px_memset(od, 0, sizeof(*od));
    px_free(od);
    px_free(c);
 }
index bd05ccc94e481397b775e8b252985d10450ddff2..e3418e2d8c342d51a608c47819c5f962bf3f7515 100644 (file)
@@ -85,7 +85,7 @@ void
 pgp_cfb_free(PGP_CFB *ctx)
 {
    px_cipher_free(ctx->ciph);
-   memset(ctx, 0, sizeof(*ctx));
+   px_memset(ctx, 0, sizeof(*ctx));
    px_free(ctx);
 }
 
index 41f585524767905928d443e5b31bbb194880f7c3..2b7d7e861fc219d39fae8bf5cd484382ff7988b9 100644 (file)
@@ -175,7 +175,7 @@ compress_free(void *priv)
    struct ZipStat *st = priv;
 
    deflateEnd(&st->stream);
-   memset(st, 0, sizeof(*st));
+   px_memset(st, 0, sizeof(*st));
    px_free(st);
 }
 
@@ -298,7 +298,7 @@ decompress_free(void *priv)
    struct DecomprData *dec = priv;
 
    inflateEnd(&dec->stream);
-   memset(dec, 0, sizeof(*dec));
+   px_memset(dec, 0, sizeof(*dec));
    px_free(dec);
 }
 
index 9df5c717f2b03ed0dac84c4b007691183e87370a..e598198dc05ccac35c1dccba4cd8250e76f837bd 100644 (file)
@@ -210,7 +210,7 @@ pktreader_free(void *priv)
 {
    struct PktData *pkt = priv;
 
-   memset(pkt, 0, sizeof(*pkt));
+   px_memset(pkt, 0, sizeof(*pkt));
    px_free(pkt);
 }
 
@@ -257,7 +257,7 @@ prefix_init(void **priv_p, void *arg, PullFilter *src)
    if (res != len + 2)
    {
        px_debug("prefix_init: short read");
-       memset(tmpbuf, 0, sizeof(tmpbuf));
+       px_memset(tmpbuf, 0, sizeof(tmpbuf));
        return PXE_PGP_CORRUPT_DATA;
    }
 
@@ -280,7 +280,7 @@ prefix_init(void **priv_p, void *arg, PullFilter *src)
         */
        ctx->corrupt_prefix = 1;
    }
-   memset(tmpbuf, 0, sizeof(tmpbuf));
+   px_memset(tmpbuf, 0, sizeof(tmpbuf));
    return 0;
 }
 
@@ -395,8 +395,8 @@ mdc_finish(PGP_Context *ctx, PullFilter *src,
     */
    px_md_finish(ctx->mdc_ctx, hash);
    res = memcmp(hash, *data_p, 20);
-   memset(hash, 0, 20);
-   memset(tmpbuf, 0, sizeof(tmpbuf));
+   px_memset(hash, 0, 20);
+   px_memset(tmpbuf, 0, sizeof(tmpbuf));
    if (res != 0)
    {
        px_debug("mdc_finish: mdc failed");
@@ -493,7 +493,7 @@ mdcbuf_finish(struct MDCBufData * st)
    px_md_update(st->ctx->mdc_ctx, st->mdc_buf, 2);
    px_md_finish(st->ctx->mdc_ctx, hash);
    res = memcmp(hash, st->mdc_buf + 2, 20);
-   memset(hash, 0, 20);
+   px_memset(hash, 0, 20);
    if (res)
    {
        px_debug("mdcbuf_finish: MDC does not match");
@@ -593,7 +593,7 @@ mdcbuf_free(void *priv)
 
    px_md_free(st->ctx->mdc_ctx);
    st->ctx->mdc_ctx = NULL;
-   memset(st, 0, sizeof(*st));
+   px_memset(st, 0, sizeof(*st));
    px_free(st);
 }
 
@@ -703,7 +703,7 @@ parse_symenc_sesskey(PGP_Context *ctx, PullFilter *src)
        res = decrypt_key(ctx, p, res);
    }
 
-   memset(tmpbuf, 0, sizeof(tmpbuf));
+   px_memset(tmpbuf, 0, sizeof(tmpbuf));
    return res;
 }
 
@@ -753,6 +753,7 @@ copy_crlf(MBuf *dst, uint8 *data, int len, int *got_cr)
        if (res < 0)
            return res;
    }
+   px_memset(tmpbuf, 0, sizeof(tmpbuf));
    return 0;
 }
 
@@ -792,7 +793,7 @@ parse_literal_data(PGP_Context *ctx, MBuf *dst, PullFilter *pkt)
        px_debug("parse_literal_data: unexpected eof");
        return PXE_PGP_CORRUPT_DATA;
    }
-   memset(tmpbuf, 0, 4);
+   px_memset(tmpbuf, 0, 4);
 
    /* check if text */
    if (ctx->text_mode)
index 48f2f01f6297a138a8b36c9391294d68d814a8f4..47f524e0909b6fe4e38d55acffed091ffa9653cf 100644 (file)
@@ -128,7 +128,7 @@ mdc_flush(PushFilter *dst, void *priv)
    px_md_finish(md, pkt + 2);
 
    res = pushf_write(dst, pkt, 2 + MDC_DIGEST_LEN);
-   memset(pkt, 0, 2 + MDC_DIGEST_LEN);
+   px_memset(pkt, 0, 2 + MDC_DIGEST_LEN);
    return res;
 }
 
@@ -217,7 +217,7 @@ encrypt_free(void *priv)
 {
    struct EncStat *st = priv;
 
-   memset(st, 0, sizeof(*st));
+   px_memset(st, 0, sizeof(*st));
    px_free(st);
 }
 
@@ -299,7 +299,7 @@ pkt_stream_free(void *priv)
 {
    struct PktStreamStat *st = priv;
 
-   memset(st, 0, sizeof(*st));
+   px_memset(st, 0, sizeof(*st));
    px_free(st);
 }
 
@@ -490,7 +490,7 @@ write_prefix(PGP_Context *ctx, PushFilter *dst)
    prefix[bs + 1] = prefix[bs - 1];
 
    res = pushf_write(dst, prefix, bs + 2);
-   memset(prefix, 0, bs + 2);
+   px_memset(prefix, 0, bs + 2);
    return res < 0 ? res : 0;
 }
 
@@ -552,7 +552,7 @@ write_symenc_sesskey(PGP_Context *ctx, PushFilter *dst)
    if (res >= 0)
        res = pushf_write(dst, pkt, pktlen);
 
-   memset(pkt, 0, pktlen);
+   px_memset(pkt, 0, pktlen);
    return res;
 }
 
index 3f2ec0f5c76cff2c3f94a8e0a0450cf0652943b5..62b0cea9ee2aad068d8a0d76486b82f9be935bc5 100644 (file)
@@ -72,7 +72,7 @@ pgp_mpi_free(PGP_MPI *mpi)
 {
    if (mpi == NULL)
        return 0;
-   memset(mpi, 0, sizeof(*mpi) + mpi->bytes);
+   px_memset(mpi, 0, sizeof(*mpi) + mpi->bytes);
    px_free(mpi);
    return 0;
 }
index 530a3d38d801a04fa0899faeee33a901285281d5..b3f7ca165e66609cba3e5ba53fd092c39574d8e2 100644 (file)
@@ -89,7 +89,7 @@ add_block_entropy(PX_MD *md, text *data)
 
    px_add_entropy(sha1, 20);
 
-   memset(sha1, 0, 20);
+   px_memset(sha1, 0, 20);
 }
 
 /*
@@ -131,7 +131,7 @@ add_entropy(text *data1, text *data2, text *data3)
        add_block_entropy(md, data3);
 
    px_md_free(md);
-   memset(rnd, 0, sizeof(rnd));
+   px_memset(rnd, 0, sizeof(rnd));
 }
 
 /*
@@ -169,7 +169,7 @@ convert_to_utf8(text *src)
 static void
 clear_and_pfree(text *p)
 {
-   memset(p, 0, VARSIZE(p));
+   px_memset(p, 0, VARSIZE(p));
    pfree(p);
 }
 
index 9b44fbfc692136d39b0302494eb534674a32d6b7..be9476ac18f36ec2107b53212295363643c6791b 100644 (file)
@@ -73,7 +73,7 @@ pad_eme_pkcs1_v15(uint8 *data, int data_len, int res_len, uint8 **res_p)
 
    if (res < 0)
    {
-       memset(buf, 0, res_len);
+       px_memset(buf, 0, res_len);
        px_free(buf);
        return res;
    }
@@ -123,10 +123,10 @@ create_secmsg(PGP_Context *ctx, PGP_MPI **msg_p, int full_bytes)
 
    if (padded)
    {
-       memset(padded, 0, full_bytes);
+       px_memset(padded, 0, full_bytes);
        px_free(padded);
    }
-   memset(secmsg, 0, klen + 3);
+   px_memset(secmsg, 0, klen + 3);
    px_free(secmsg);
 
    if (res >= 0)
index f24eec526c750f68a384376bcc744103e05a1b95..0e2cf09e25856e280bf4e9ac2a611511db032e9a 100644 (file)
@@ -77,7 +77,7 @@ pgp_key_free(PGP_PubKey *pk)
            pgp_mpi_free(pk->sec.dsa.x);
            break;
    }
-   memset(pk, 0, sizeof(*pk));
+   px_memset(pk, 0, sizeof(*pk));
    px_free(pk);
 }
 
@@ -150,7 +150,7 @@ calc_key_id(PGP_PubKey *pk)
    px_md_free(md);
 
    memcpy(pk->key_id, hash + 12, 8);
-   memset(hash, 0, 20);
+   px_memset(hash, 0, 20);
 
    return 0;
 }
@@ -291,8 +291,8 @@ check_key_sha1(PullFilter *src, PGP_PubKey *pk)
        res = PXE_PGP_KEYPKT_CORRUPT;
    }
 err:
-   memset(got_sha1, 0, 20);
-   memset(my_sha1, 0, 20);
+   px_memset(got_sha1, 0, 20);
+   px_memset(my_sha1, 0, 20);
    return res;
 }
 
index 326b1bbf317c12cb996df91c3218bd52a1a88d67..76a5cf891c1e3d06aa52536ed91a13a9730ae215 100644 (file)
@@ -77,6 +77,7 @@ calc_s2k_simple(PGP_S2K *s2k, PX_MD *md, const uint8 *key,
            remain = 0;
        }
    }
+   px_memset(buf, 0, sizeof(buf));
    return 0;
 }
 
@@ -122,6 +123,7 @@ calc_s2k_salted(PGP_S2K *s2k, PX_MD *md, const uint8 *key, unsigned key_len)
            remain = 0;
        }
    }
+   px_memset(buf, 0, sizeof(buf));
    return 0;
 }
 
@@ -195,6 +197,7 @@ calc_s2k_iter_salted(PGP_S2K *s2k, PX_MD *md, const uint8 *key,
            remain = 0;
        }
    }
+   px_memset(buf, 0, sizeof(buf));
    return 0;
 }
 
index ce6f199a9e97b96a1833ccd30f0ca39e2cbd3cf1..23f6552dce09802bee4cdc161048b4f9d08b7854 100644 (file)
@@ -225,7 +225,7 @@ pgp_free(PGP_Context *ctx)
 {
    if (ctx->pub_key)
        pgp_key_free(ctx->pub_key);
-   memset(ctx, 0, sizeof *ctx);
+   px_memset(ctx, 0, sizeof *ctx);
    px_free(ctx);
    return 0;
 }
index 91afb452415b0def141284513247f4255288657f..2243279972783a2d92a867f4a9361cc8a72dd08f 100644 (file)
@@ -158,7 +158,7 @@ px_gen_salt(const char *salt_type, char *buf, int rounds)
        return res;
 
    p = g->gen(rounds, rbuf, g->input_len, buf, PX_MAX_SALT_LEN);
-   memset(rbuf, 0, sizeof(rbuf));
+   px_memset(rbuf, 0, sizeof(rbuf));
 
    if (p == NULL)
        return PXE_BAD_SALT_ROUNDS;
index 3b2016190e7b23b8d57b8d6c96be09422c159a58..61e5b0ea3da5ee04e6fa4dec18896927b1e2f092 100644 (file)
@@ -77,7 +77,7 @@ hmac_init(PX_HMAC *h, const uint8 *key, unsigned klen)
        h->p.opad[i] = keybuf[i] ^ HMAC_OPAD;
    }
 
-   memset(keybuf, 0, bs);
+   px_memset(keybuf, 0, bs);
    px_free(keybuf);
 
    px_md_update(md, h->p.ipad, bs);
@@ -119,7 +119,7 @@ hmac_finish(PX_HMAC *h, uint8 *dst)
    px_md_update(md, buf, hlen);
    px_md_finish(md, dst);
 
-   memset(buf, 0, hlen);
+   px_memset(buf, 0, hlen);
    px_free(buf);
 }
 
@@ -131,8 +131,8 @@ hmac_free(PX_HMAC *h)
    bs = px_md_block_size(h->md);
    px_md_free(h->md);
 
-   memset(h->p.ipad, 0, bs);
-   memset(h->p.opad, 0, bs);
+   px_memset(h->p.ipad, 0, bs);
+   px_memset(h->p.opad, 0, bs);
    px_free(h->p.ipad);
    px_free(h->p.opad);
    px_free(h);
index f2db06a898bd3d38f76f9f2e0260ce6aea2b9055..59ec32c505a64ff2093fcb16025995abc2926742 100644 (file)
@@ -104,6 +104,12 @@ px_strerror(int err)
    return "Bad error code";
 }
 
+/* memset that must not be optimized away */
+void
+px_memset(void *ptr, int c, size_t len)
+{
+   memset(ptr, c, len);
+}
 
 const char *
 px_resolve_alias(const PX_Alias *list, const char *name)
@@ -331,7 +337,7 @@ combo_free(PX_Combo *cx)
 {
    if (cx->cipher)
        px_cipher_free(cx->cipher);
-   memset(cx, 0, sizeof(*cx));
+   px_memset(cx, 0, sizeof(*cx));
    px_free(cx);
 }
 
index c916e9361c902a0f6a56aae3a5a6f38aaed87e64..4137898874b905e94596e946f37d6d9ff514f26a 100644 (file)
@@ -202,6 +202,7 @@ const char *px_strerror(int err);
 const char *px_resolve_alias(const PX_Alias *aliases, const char *name);
 
 void       px_set_debug_handler(void (*handler) (const char *));
+void       px_memset(void *ptr, int c, size_t len);
 
 #ifdef PX_DEBUG
 void       px_debug(const char *fmt,...);
index 9cd58a08ab4d977a526954a45d534f62163a3b4a..1938c43ee53922b216fabb4cc8cc5350b8de3f2d 100644 (file)
@@ -40,6 +40,7 @@
 
 #include <sys/param.h>
 
+#include "px.h"
 #include "sha2.h"
 
 /*
@@ -570,7 +571,7 @@ SHA256_Final(uint8 digest[], SHA256_CTX *context)
    }
 
    /* Clean up state data: */
-   memset(context, 0, sizeof(*context));
+   px_memset(context, 0, sizeof(*context));
 }
 
 
@@ -899,7 +900,7 @@ SHA512_Final(uint8 digest[], SHA512_CTX *context)
    }
 
    /* Zero out state data */
-   memset(context, 0, sizeof(*context));
+   px_memset(context, 0, sizeof(*context));
 }
 
 
@@ -944,7 +945,7 @@ SHA384_Final(uint8 digest[], SHA384_CTX *context)
    }
 
    /* Zero out state data */
-   memset(context, 0, sizeof(*context));
+   px_memset(context, 0, sizeof(*context));
 }
 
 /*** SHA-224: *********************************************************/
@@ -987,5 +988,5 @@ SHA224_Final(uint8 digest[], SHA224_CTX *context)
    }
 
    /* Clean up state data: */
-   memset(context, 0, sizeof(*context));
+   px_memset(context, 0, sizeof(*context));
 }