]> asedeno.scripts.mit.edu Git - PuTTY.git/commitdiff
bignum_set_bit: Don't abort if asked to clear an inaccessible bit
authorBen Harris <bjh21@bjh21.me.uk>
Sun, 11 Oct 2015 08:27:55 +0000 (09:27 +0100)
committerSimon Tatham <anakin@pobox.com>
Mon, 29 Feb 2016 19:59:31 +0000 (19:59 +0000)
All those bits are clear anyway.

Bug found with the help of afl-fuzz.

(cherry picked from commit 4f340599029715d863b84bdfc0407f582114a23c)

sshbn.c

diff --git a/sshbn.c b/sshbn.c
index facdf3d576b17f7bea92fdf5cb281b716006311d..8393721af138eefb11b560b43a7fe8c05bb06dee 100644 (file)
--- a/sshbn.c
+++ b/sshbn.c
@@ -1202,9 +1202,9 @@ int bignum_bit(Bignum bn, int i)
  */
 void bignum_set_bit(Bignum bn, int bitnum, int value)
 {
-    if (bitnum < 0 || bitnum >= (int)(BIGNUM_INT_BITS * bn[0]))
-       abort();                       /* beyond the end */
-    else {
+    if (bitnum < 0 || bitnum >= (int)(BIGNUM_INT_BITS * bn[0])) {
+        if (value) abort();                   /* beyond the end */
+    else {
        int v = bitnum / BIGNUM_INT_BITS + 1;
        BignumInt mask = (BignumInt)1 << (bitnum % BIGNUM_INT_BITS);
        if (value)