<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">--- retr.c.orig	2010-12-13 14:42:49.000000000 +1100
+++ retr.c	2020-01-29 08:52:28.000000000 +1100
@@ -74,7 +74,7 @@ retr( SNET *sn, char *pathdesc, char *pa
     char		buf[ 8192 ]; 
     ssize_t		rr;
     extern EVP_MD	*md;
-    EVP_MD_CTX		mdctx;
+    EVP_MD_CTX		*mdctx = NULL;
     unsigned char	md_value[ EVP_MAX_MD_SIZE ];
     char		cksum_b64[ SZ_BASE64_E( EVP_MAX_MD_SIZE ) ];
 
@@ -84,13 +84,18 @@ retr( SNET *sn, char *pathdesc, char *pa
 	    fprintf( stderr, "%s\n", pathdesc );
 	    return( 1 );
 	}
-	EVP_DigestInit( &amp;mdctx, md );
+	mdctx = EVP_MD_CTX_new();
+	if (!mdctx) {
+        return( 1 );
+    }
+	EVP_DigestInit( mdctx, md );
     }
 
     if ( verbose ) printf( "&gt;&gt;&gt; RETR %s\n", pathdesc );
     if ( snet_writef( sn, "RETR %s\n", pathdesc ) &lt; 0 ) {
 	fprintf( stderr, "retrieve %s failed: 1-%s\n", pathdesc,
 	    strerror( errno ));
+	EVP_MD_CTX_free( mdctx );
 	return( -1 );
     }
 
@@ -98,11 +103,13 @@ retr( SNET *sn, char *pathdesc, char *pa
     if (( line = snet_getline_multi( sn, logger, &amp;tv )) == NULL ) {
 	fprintf( stderr, "retrieve %s failed: 2-%s\n", pathdesc,
 	    strerror( errno ));
+	EVP_MD_CTX_free( mdctx );
 	return( -1 );
     }
 
     if ( *line != '2' ) {
 	fprintf( stderr, "%s\n", line );
+	EVP_MD_CTX_free( mdctx );
 	return( 1 );
     }
 
@@ -111,6 +118,7 @@ retr( SNET *sn, char *pathdesc, char *pa
     if (( line = snet_getline( sn, &amp;tv )) == NULL ) {
 	fprintf( stderr, "retrieve %s failed: 3-%s\n", pathdesc,
 	    strerror( errno ));
+	EVP_MD_CTX_free( mdctx );
 	return( -1 );
     }
     size = strtoofft( line, NULL, 10 );
@@ -119,6 +127,7 @@ retr( SNET *sn, char *pathdesc, char *pa
 	fprintf( stderr, "line %d: size in transcript does not match size "
 	    "from server\n", linenum );
 	fprintf( stderr, "%s\n", pathdesc );
+	EVP_MD_CTX_free( mdctx );
 	return( -1 );
     }
 
@@ -127,6 +136,7 @@ retr( SNET *sn, char *pathdesc, char *pa
 	    path, getpid()) &gt;= MAXPATHLEN ) {
 	fprintf( stderr, "%s.radmind.%i: too long", path,
 		(int)getpid());
+	EVP_MD_CTX_free( mdctx );
 	return( -1 );
     }
     /* Open file */
@@ -135,14 +145,17 @@ retr( SNET *sn, char *pathdesc, char *pa
 	    errno = 0;
 	    if ( mkprefix( temppath ) != 0 ) {
 		perror( temppath );
+		EVP_MD_CTX_free( mdctx );
 		return( -1 );
 	    }
 	    if (( fd = open( temppath, O_WRONLY | O_CREAT, tempmode )) &lt; 0 ) {
 		perror( temppath );
+		EVP_MD_CTX_free( mdctx );
 		return( -1 );
 	    }
 	} else {
 	    perror( temppath );
+	    EVP_MD_CTX_free( mdctx );
 	    return( -1 );
 	}
     }
@@ -165,7 +178,7 @@ retr( SNET *sn, char *pathdesc, char *pa
 	    goto error2;
 	}
 	if ( cksum ) {
-	    EVP_DigestUpdate( &amp;mdctx, buf, (unsigned int)rr );
+	    EVP_DigestUpdate( mdctx, buf, (unsigned int)rr );
 	}
 	if ( dodots ) { putc( '.', stdout ); fflush( stdout ); }
 	size -= rr;
@@ -197,7 +210,9 @@ retr( SNET *sn, char *pathdesc, char *pa
 
     /* cksum file */
     if ( cksum ) {
-	EVP_DigestFinal( &amp;mdctx, md_value, &amp;md_len );
+	EVP_DigestFinal( mdctx, md_value, &amp;md_len );
+	EVP_MD_CTX_free( mdctx );
+	mdctx = NULL;
 	base64_e( md_value, md_len, cksum_b64 );
 	if ( strcmp( trancksum, cksum_b64 ) != 0 ) {
 	    fprintf( stderr, "line %d: checksum in transcript does not match "
@@ -213,6 +228,7 @@ retr( SNET *sn, char *pathdesc, char *pa
 error2:
     close( fd );
 error1:
+    EVP_MD_CTX_free( mdctx );
     unlink( temppath );
     return( returnval );
 }
@@ -246,7 +262,7 @@ retr_applefile( SNET *sn, char *pathdesc
     struct as_entry		ae_ents[ 3 ]; 
     struct timeval		tv;
     extern EVP_MD       	*md;
-    EVP_MD_CTX   	       	mdctx;
+    EVP_MD_CTX   	       	*mdctx = NULL;
     unsigned char       	md_value[ EVP_MAX_MD_SIZE ];
     char		       	cksum_b64[ SZ_BASE64_E( EVP_MAX_MD_SIZE ) ];
 
@@ -256,13 +272,18 @@ retr_applefile( SNET *sn, char *pathdesc
 	    fprintf( stderr, "%s\n", pathdesc );
             return( 1 );
         }
-        EVP_DigestInit( &amp;mdctx, md );
+        mdctx = EVP_MD_CTX_new();
+        if (!mdctx) {
+            return( 1 );
+        }
+        EVP_DigestInit( mdctx, md );
     }
 
     if ( verbose ) printf( "&gt;&gt;&gt; RETR %s\n", pathdesc );
     if ( snet_writef( sn, "RETR %s\n", pathdesc ) &lt; 0 ) {
 	fprintf( stderr, "retrieve applefile %s failed: 1-%s\n", pathdesc,
 	    strerror( errno ));
+	EVP_MD_CTX_free( mdctx );
 	return( -1 );
     }
 
@@ -270,11 +291,13 @@ retr_applefile( SNET *sn, char *pathdesc
     if (( line = snet_getline_multi( sn, logger, &amp;tv )) == NULL ) {
 	fprintf( stderr, "retrieve applefile %s failed: 2-%s\n", pathdesc,
 	    strerror( errno ));
+	EVP_MD_CTX_free( mdctx );
 	return( -1 );
     }
 
     if ( *line != '2' ) {
         fprintf( stderr, "%s\n", line );
+        EVP_MD_CTX_free( mdctx );
         return( 1 );
     }
 
@@ -283,6 +306,7 @@ retr_applefile( SNET *sn, char *pathdesc
     if (( line = snet_getline( sn, &amp;tv )) == NULL ) {
 	fprintf( stderr, "retrieve applefile %s failed: 3-%s\n", pathdesc,
 	    strerror( errno ));
+	EVP_MD_CTX_free( mdctx );
 	return( -1 );
     }
     size = strtoofft( line, NULL, 10 );
@@ -291,6 +315,7 @@ retr_applefile( SNET *sn, char *pathdesc
 	fprintf( stderr, "line %d: size in transcript does not match size"
 	    "from server\n", linenum );
 	fprintf( stderr, "%s\n", pathdesc );
+	EVP_MD_CTX_free( mdctx );
 	return( -1 );
     }  
     if ( size &lt; ( AS_HEADERLEN + ( 3 * sizeof( struct as_entry )) +
@@ -298,6 +323,7 @@ retr_applefile( SNET *sn, char *pathdesc
 	fprintf( stderr,
 	    "retrieve applefile %s failed: AppleSingle-encoded file too "
 	    "short\n", path );
+	EVP_MD_CTX_free( mdctx );
 	return( -1 );
     }
 
@@ -306,6 +332,7 @@ retr_applefile( SNET *sn, char *pathdesc
     if (( rc = snet_read( sn, ( char * )&amp;ah, AS_HEADERLEN, &amp;tv )) &lt;= 0 ) {
 	fprintf( stderr, "retrieve applefile %s failed: 4-%s\n", pathdesc,
 	    strerror( errno ));
+	EVP_MD_CTX_free( mdctx );
 	return( -1 );
     }
     if (( rc != AS_HEADERLEN ) ||
@@ -313,16 +340,18 @@ retr_applefile( SNET *sn, char *pathdesc
 	fprintf( stderr,
 	    "retrieve applefile %s failed: corrupt AppleSingle-encoded file\n",
 	    path );
+	EVP_MD_CTX_free( mdctx );
 	return( -1 );
     }
     if ( cksum ) {
-	EVP_DigestUpdate( &amp;mdctx, (char *)&amp;ah, (unsigned int)rc );
+	EVP_DigestUpdate( mdctx, (char *)&amp;ah, (unsigned int)rc );
     }
 
     /* name temp file */
     if ( snprintf( temppath, MAXPATHLEN, "%s.radmind.%i", path,
 	    getpid()) &gt;= MAXPATHLEN ) {
 	fprintf( stderr, "%s.radmind.%i: too long", path, ( int )getpid());
+	EVP_MD_CTX_free( mdctx );
 	return( -1 );
     }
 
@@ -333,15 +362,18 @@ retr_applefile( SNET *sn, char *pathdesc
 	    errno = 0;
 	    if ( mkprefix( temppath ) != 0 ) {
 		perror( temppath );
+		EVP_MD_CTX_free( mdctx );
 		return( -1 );
 	    }
 	    if (( dfd = open( temppath, O_CREAT | O_EXCL | O_WRONLY,
 		    tempmode )) &lt; 0 ) {
 		perror( temppath );
+		EVP_MD_CTX_free( mdctx );
 		return( -1 );
 	    }
 	} else {
 	    perror( temppath );
+	    EVP_MD_CTX_free( mdctx );
 	    return( -1 );
 	}
     }
@@ -373,7 +405,7 @@ retr_applefile( SNET *sn, char *pathdesc
     /* Should we check for valid ae_ents here? YES! */
 
     if ( cksum ) {
-	EVP_DigestUpdate( &amp;mdctx, (char *)&amp;ae_ents, (unsigned int)rc );
+	EVP_DigestUpdate( mdctx, (char *)&amp;ae_ents, (unsigned int)rc );
     }
     if ( dodots ) { putc( '.', stdout ); fflush( stdout ); }
 
@@ -398,7 +430,7 @@ retr_applefile( SNET *sn, char *pathdesc
 	goto error2;
     }
     if ( cksum ) {
-	EVP_DigestUpdate( &amp;mdctx, finfo, (unsigned int)rc );
+	EVP_DigestUpdate( mdctx, finfo, (unsigned int)rc );
     }
     if ( dodots ) { putc( '.', stdout ); fflush( stdout ); }
     size -= rc;
@@ -448,7 +480,7 @@ retr_applefile( SNET *sn, char *pathdesc
 		goto error3;
 	    }
 	    if ( cksum ) {
-		EVP_DigestUpdate( &amp;mdctx, buf, (unsigned int)rc );
+		EVP_DigestUpdate( mdctx, buf, (unsigned int)rc );
 	    }
 	    if ( dodots ) { putc( '.', stdout ); fflush( stdout ); }
 	    if ( showprogress ) {
@@ -482,7 +514,7 @@ retr_applefile( SNET *sn, char *pathdesc
 	}
 
 	if ( cksum ) {
-	    EVP_DigestUpdate( &amp;mdctx, buf, (unsigned int)rc );
+	    EVP_DigestUpdate( mdctx, buf, (unsigned int)rc );
 	}
 	if ( dodots ) { putc( '.', stdout ); fflush( stdout); }
 	if ( showprogress ) {
@@ -523,7 +555,9 @@ retr_applefile( SNET *sn, char *pathdesc
     if ( verbose ) printf( "&lt;&lt;&lt; .\n" );
 
     if ( cksum ) {
-	EVP_DigestFinal( &amp;mdctx, md_value, &amp;md_len );
+	EVP_DigestFinal( mdctx, md_value, &amp;md_len );
+	EVP_MD_CTX_free( mdctx );
+	mdctx = NULL;
 	base64_e(( char*)&amp;md_value, md_len, cksum_b64 );
         if ( strcmp( trancksum, cksum_b64 ) != 0 ) {
 	    fprintf( stderr, "line %d: checksum in transcript does not match "
@@ -541,6 +575,7 @@ error3:
 error2:
     close( dfd );
 error1:
+    EVP_MD_CTX_free( mdctx );
     unlink( temppath );
     return( returnval );
 }
</pre></body></html>