crypto/dsa/dsa_lib.c:288: error: NULL_DEREFERENCE
  pointer `ret` last assigned on line 264 could be null and is dereferenced by call to `DH_free()` at line 288, column 5.
Showing all 10 steps of the trace


crypto/dsa/dsa_lib.c:253:1: start of procedure DSA_dup_DH()
251.   
252.   #ifndef OPENSSL_NO_DH
253. > DH *DSA_dup_DH(const DSA *r)
254.   {
255.       /*

crypto/dsa/dsa_lib.c:260:5: 
258.        */
259.   
260. >     DH *ret = NULL;
261.   
262.       if (r == NULL)

crypto/dsa/dsa_lib.c:262:9: Taking false branch
260.       DH *ret = NULL;
261.   
262.       if (r == NULL)
               ^
263.           goto err;
264.       ret = DH_new();

crypto/dsa/dsa_lib.c:264:5: 
262.       if (r == NULL)
263.           goto err;
264. >     ret = DH_new();
265.       if (ret == NULL)
266.           goto err;

crypto/dh/dh_lib.c:103:1: start of procedure DH_new()
  101.   }
  102.   
  103. > DH *DH_new(void)
  104.   {
  105.       return DH_new_method(NULL);

crypto/dh/dh_lib.c:105:5: Skipping DH_new_method(): empty list of specs
  103.   DH *DH_new(void)
  104.   {
  105.       return DH_new_method(NULL);
             ^
  106.   }
  107.   

crypto/dh/dh_lib.c:106:1: return from a call to DH_new
  104.   {
  105.       return DH_new_method(NULL);
  106. > }
  107.   
  108.   DH *DH_new_method(ENGINE *engine)

crypto/dsa/dsa_lib.c:265:9: Taking true branch
263.           goto err;
264.       ret = DH_new();
265.       if (ret == NULL)
               ^
266.           goto err;
267.       if (r->p != NULL)

crypto/dsa/dsa_lib.c:287:2: 
285.       return ret;
286.   
287. >  err:
288.       DH_free(ret);
289.       return NULL;

crypto/dsa/dsa_lib.c:288:5: 
286.   
287.    err:
288. >     DH_free(ret);
289.       return NULL;
290.   }
