David Hartman wrote:
...
We have a copy of 0.9.8a in our source tree, and I made the changes to
our copy of 0.9.8a.  I attached the diffs.
...
Index: crypto/aes/aes_cfb.c
===================================================================
RCS file: 
/local/cvs/master/pspOpenSSL/Current/source/openssl/crypto/aes/aes_cfb.c,v
retrieving revision 1.1.1.1
diff -u -b -r1.1.1.1 aes_cfb.c
--- crypto/aes/aes_cfb.c        30 Aug 2005 19:33:35 -0000      1.1.1.1
+++ crypto/aes/aes_cfb.c        29 Dec 2005 23:54:52 -0000
@@ -165,7 +165,7 @@
     int n,rem,num;
     unsigned char ovec[AES_BLOCK_SIZE*2];
- if (nbits<=0 || nbits>128) return;
+    if (nbits<=0 || nbits>=128) return;

why ?

...
Index: crypto/asn1/a_strex.c
===================================================================
RCS file: 
/local/cvs/master/pspOpenSSL/Current/source/openssl/crypto/asn1/a_strex.c,v
retrieving revision 1.2
diff -u -b -r1.2 a_strex.c
--- crypto/asn1/a_strex.c       29 Dec 2005 23:28:57 -0000      1.2
+++ crypto/asn1/a_strex.c       29 Dec 2005 23:54:53 -0000
@@ -165,7 +165,7 @@
 {
        int i, outlen, len;
        unsigned char orflags, *p, *q;
-       unsigned long c;
+       unsigned long c = 0;
        p = buf;
        q = buf + buflen;
        outlen = 0;

the value 'c' should be set in the switch statement and if
'type & BUF_TYPE_WIDTH_MASK' is neither 0, 1, 2 or 4 it's an
error (and in this case 'c' would be uninitialized). I've added
a "default: return -1" and let do_print_ex() check the return
value of do_buf().

Index: crypto/asn1/t_pkey.c
===================================================================
RCS file: 
/local/cvs/master/pspOpenSSL/Current/source/openssl/crypto/asn1/t_pkey.c,v
retrieving revision 1.2
diff -u -b -r1.2 t_pkey.c
--- crypto/asn1/t_pkey.c        29 Dec 2005 23:28:57 -0000      1.2
+++ crypto/asn1/t_pkey.c        29 Dec 2005 23:54:53 -0000
@@ -143,7 +143,7 @@
                goto err;
                }
- if (x->d != NULL)
+       if ((x->d != NULL) && (x->n != NULL))
                {
                if(!BIO_indent(bp,off,128))
                   goto err;
@@ -151,19 +151,23 @@
                        <= 0) goto err;
                }
- if (x->d == NULL)
+       if ((x->d == NULL) && (x->n != NULL))
                BIO_snprintf(str,sizeof str,"Modulus (%d 
bit):",BN_num_bits(x->n));
        else
                BUF_strlcpy(str,"modulus:",sizeof str);
        if (!print(bp,str,x->n,m,off)) goto err;
        s=(x->d == NULL)?"Exponent:":"publicExponent:";
-       if (!print(bp,s,x->e,m,off)) goto err;
-       if (!print(bp,"privateExponent:",x->d,m,off)) goto err;
-       if (!print(bp,"prime1:",x->p,m,off)) goto err;
-       if (!print(bp,"prime2:",x->q,m,off)) goto err;
-       if (!print(bp,"exponent1:",x->dmp1,m,off)) goto err;
-       if (!print(bp,"exponent2:",x->dmq1,m,off)) goto err;
-       if (!print(bp,"coefficient:",x->iqmp,m,off)) goto err;
+       if ((x->e != NULL) && !print(bp,s,x->e,m,off)) goto err;
+       if ((x->d != NULL) && !print(bp,"privateExponent:",x->d,m,off))
+               goto err;
+       if ((x->p != NULL) && !print(bp,"prime1:",x->p,m,off)) goto err;
+       if ((x->q != NULL) && !print(bp,"prime2:",x->q,m,off)) goto err;
+ if ((x->dmp1 != NULL) && !print(bp,"exponent1:",x->dmp1,m,off)) + goto err; + if ((x->dmq1 != NULL) && !print(bp,"exponent2:",x->dmq1,m,off)) + goto err; + if ((x->iqmp != NULL) && !print(bp,"coefficient:",x->iqmp,m,off)) + goto err;
        ret=1;
 err:
        if (m != NULL) OPENSSL_free(m);

ok

@@ -223,7 +227,7 @@
                goto err;
                }
- if (x->priv_key != NULL)
+       if ((x->priv_key != NULL) && (x->p != NULL))

this shouldn't be necessary as there's already a check for
'x->p != NULL' in DSA_print()

                {
                if(!BIO_indent(bp,off,128))
                   goto err;
@@ -760,7 +764,9 @@
                BN_num_bits(x->p)) <= 0)
                goto err;
        if (!print(bp,"p:",x->p,m,4)) goto err;
+       if (x->q)
        if (!print(bp,"q:",x->q,m,4)) goto err;
+       if (x->g)
        if (!print(bp,"g:",x->g,m,4)) goto err;
        ret=1;

ok

 err:
Index: crypto/asn1/tasn_dec.c
===================================================================
RCS file: 
/local/cvs/master/pspOpenSSL/Current/source/openssl/crypto/asn1/tasn_dec.c,v
retrieving revision 1.1.1.1
diff -u -b -r1.1.1.1 tasn_dec.c
--- crypto/asn1/tasn_dec.c      30 Aug 2005 19:33:35 -0000      1.1.1.1
+++ crypto/asn1/tasn_dec.c      29 Dec 2005 23:54:54 -0000
@@ -283,6 +283,12 @@
                        {
                        wp = *(unsigned char **)in;
                        imphack = *wp;
+                       if (!p)
+                               {
+                               ASN1err(ASN1_F_ASN1_ITEM_EX_D2I,
+                                       ERR_R_NESTED_ASN1_ERROR);
+                               goto err;
+                               }
                        *wp = (unsigned char)((*p & V_ASN1_CONSTRUCTED)
                                                                | it->utype);
                        }

to be honest I don't understand this code right now, will look at it
again later

@@ -924,6 +930,7 @@
                if (!*pval)
                        {
                        typ = ASN1_TYPE_new();
+                       if (!typ) goto err;
                        *pval = (ASN1_VALUE *)typ;
                        }
                else

ok

@@ -1047,7 +1054,7 @@
        err:
        if (!ret)
                {
-               ASN1_TYPE_free(typ);
+               if (typ) ASN1_TYPE_free(typ);
                if (opval)
                        *opval = NULL;
                }

ASN1_TYPE_free(NULL) should cause no problems

Index: crypto/asn1/tasn_new.c
===================================================================
RCS file: 
/local/cvs/master/pspOpenSSL/Current/source/openssl/crypto/asn1/tasn_new.c,v
retrieving revision 1.2
diff -u -b -r1.2 tasn_new.c
--- crypto/asn1/tasn_new.c      29 Dec 2005 23:28:57 -0000      1.2
+++ crypto/asn1/tasn_new.c      29 Dec 2005 23:54:54 -0000
@@ -231,6 +231,8 @@
        {
        const ASN1_EXTERN_FUNCS *ef;
+ if (!it) return;
+
        switch(it->itype)
                {
Index: crypto/bio/b_print.c
===================================================================
RCS file: 
/local/cvs/master/pspOpenSSL/Current/source/openssl/crypto/bio/b_print.c,v
retrieving revision 1.1.1.1
diff -u -b -r1.1.1.1 b_print.c
--- crypto/bio/b_print.c        30 Aug 2005 19:33:35 -0000      1.1.1.1
+++ crypto/bio/b_print.c        29 Dec 2005 23:54:55 -0000
@@ -741,6 +741,7 @@
                *buffer = OPENSSL_malloc(*maxlen);
                if (*currlen > 0) {
                    assert(*sbuffer != NULL);

I guess this should be "assert(*buffer != NULL)"

+ if (*sbuffer && *buffer) memcpy(*buffer, *sbuffer, *currlen);
                }
                *sbuffer = NULL;
@@ -756,7 +757,7 @@
     if (*currlen < *maxlen) {
        if (*sbuffer)
            (*sbuffer)[(*currlen)++] = (char)c;
-       else
+       else if (*buffer)
            (*buffer)[(*currlen)++] = (char)c;
     }

I will look at this again later

Index: crypto/bio/bss_file.c
Index: crypto/bn/bn_gf2m.c

ok

Index: crypto/conf/conf_def.c
===================================================================
RCS file: 
/local/cvs/master/pspOpenSSL/Current/source/openssl/crypto/conf/conf_def.c,v
retrieving revision 1.2
diff -u -b -r1.2 conf_def.c
--- crypto/conf/conf_def.c      29 Dec 2005 23:29:14 -0000      1.2
+++ crypto/conf/conf_def.c      29 Dec 2005 23:54:58 -0000
@@ -629,7 +629,12 @@
                                
CONFerr(CONF_F_STR_COPY,CONF_R_VARIABLE_HAS_NO_VALUE);
                                goto err;
                                }
-                       
BUF_MEM_grow_clean(buf,(strlen(p)+buf->length-(e-from)));
+                       if (!BUF_MEM_grow_clean(buf,
+                               (strlen(p)+buf->length-(e-from))))
+                               {
+                               CONFerr(CONF_F_STR_COPY, ERR_R_BUF_LIB);
+                               goto err;
+                               }
                        while (*p)
                                buf->data[to++]= *(p++);
Index: crypto/ec/ec_asn1.c

ok

Index: crypto/ec/ec_lib.c
===================================================================
RCS file: 
/local/cvs/master/pspOpenSSL/Current/source/openssl/crypto/ec/ec_lib.c,v
retrieving revision 1.1.1.1
diff -u -b -r1.1.1.1 ec_lib.c
--- crypto/ec/ec_lib.c  30 Aug 2005 19:33:35 -0000      1.1.1.1
+++ crypto/ec/ec_lib.c  29 Dec 2005 23:55:02 -0000
@@ -124,7 +124,7 @@
        {
        if (!group) return;
- if (group->meth->group_finish != 0)
+       if ((group->meth != NULL) && (group->meth->group_finish != 0))
                group->meth->group_finish(group);

group->meth should never be NULL

Index: crypto/ec/ec_mult.c
===================================================================
RCS file: 
/local/cvs/master/pspOpenSSL/Current/source/openssl/crypto/ec/ec_mult.c,v
retrieving revision 1.1.1.1
diff -u -b -r1.1.1.1 ec_mult.c
--- crypto/ec/ec_mult.c 30 Aug 2005 19:33:35 -0000      1.1.1.1
+++ crypto/ec/ec_mult.c 29 Dec 2005 23:55:02 -0000
@@ -436,7 +436,19 @@
                {
                size_t bits;
- bits = i < num ? BN_num_bits(scalars[i]) : BN_num_bits(scalar); + if (i < num) + {
+                       if (scalars[i] != NULL)
+                               bits = BN_num_bits(scalars[i]);
+                       else goto err;
+                       }

unless the user supplies a NULL pointer for a BIGNUM this
shouldn't be necessary

+               else
+                       {
+                       if (scalar != NULL)
+                               bits = BN_num_bits(scalar);
+                       else goto err;
+                       }

this shouldn't be necessary as we have 'i >= num' if and only if
'num_scalar > 0' but this could only happen if 'scalar != NULL'.

Index: crypto/ecdsa/ecs_lib.c
Index: crypto/err/err.c

ok

Index: crypto/evp/bio_md.c
===================================================================
RCS file: 
/local/cvs/master/pspOpenSSL/Current/source/openssl/crypto/evp/bio_md.c,v
retrieving revision 1.1.1.1
diff -u -b -r1.1.1.1 bio_md.c
--- crypto/evp/bio_md.c 30 Aug 2005 19:33:35 -0000      1.1.1.1
+++ crypto/evp/bio_md.c 29 Dec 2005 23:55:03 -0000
@@ -158,7 +158,7 @@
                        }
                }
        BIO_clear_retry_flags(b);
-       BIO_copy_next_retry(b);
+       if (b->next_bio != NULL) BIO_copy_next_retry(b);
        return(ret);
        }

in line 126 (using revision 1.13) there's already a check for
'b->next_bio != NULL'

Index: crypto/evp/p5_crpt.c
===================================================================
RCS file: 
/local/cvs/master/pspOpenSSL/Current/source/openssl/crypto/evp/p5_crpt.c,v
retrieving revision 1.2
diff -u -b -r1.2 p5_crpt.c
--- crypto/evp/p5_crpt.c        29 Dec 2005 23:29:46 -0000      1.2
+++ crypto/evp/p5_crpt.c        29 Dec 2005 23:55:05 -0000
@@ -113,8 +113,13 @@
        unsigned char *salt;
        const unsigned char *pbuf;
+ if (!param) {
+               EVPerr(EVP_F_PKCS5_PBE_KEYIVGEN,EVP_R_DECODE_ERROR);
+               return 0;
+       }
+
        /* Extract useful info from parameter */
-       if (param == NULL || param->type != V_ASN1_SEQUENCE ||
+       if (param->type != V_ASN1_SEQUENCE ||
            param->value.sequence == NULL) {
                EVPerr(EVP_F_PKCS5_PBE_KEYIVGEN,EVP_R_DECODE_ERROR);
                return 0;

why ?

Index: crypto/objects/obj_lib.c
Index: crypto/rsa/rsa_depr.c
Index: crypto/store/str_meth.
Index: crypto/x509/x509_r2x.c
Index: crypto/x509v3/pcy_tree.c
Index: engines/e_cswift.c
Index: engines/e_sureware.c
Index: ssl/d1_enc.c
Index: ssl/d1_pkt.c
Index: ssl/s3_srvr.c

ok

Please have a look at a recent snapahot from the head.

Cheers,
Nils

______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
Development Mailing List                       openssl-dev@openssl.org
Automated List Manager                           [EMAIL PROTECTED]

Reply via email to