--- 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( &mdctx, md ); + mdctx = EVP_MD_CTX_new(); + if (!mdctx) { + return( 1 ); + } + EVP_DigestInit( mdctx, md ); } if ( verbose ) printf( ">>> RETR %s\n", pathdesc ); if ( snet_writef( sn, "RETR %s\n", pathdesc ) < 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, &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, &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()) >= 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 )) < 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( &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( &mdctx, md_value, &md_len ); + EVP_DigestFinal( mdctx, md_value, &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( &mdctx, md ); + mdctx = EVP_MD_CTX_new(); + if (!mdctx) { + return( 1 ); + } + EVP_DigestInit( mdctx, md ); } if ( verbose ) printf( ">>> RETR %s\n", pathdesc ); if ( snet_writef( sn, "RETR %s\n", pathdesc ) < 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, &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, &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 < ( 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 * )&ah, AS_HEADERLEN, &tv )) <= 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( &mdctx, (char *)&ah, (unsigned int)rc ); + EVP_DigestUpdate( mdctx, (char *)&ah, (unsigned int)rc ); } /* name temp file */ if ( snprintf( temppath, MAXPATHLEN, "%s.radmind.%i", path, getpid()) >= 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 )) < 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( &mdctx, (char *)&ae_ents, (unsigned int)rc ); + EVP_DigestUpdate( mdctx, (char *)&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( &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( &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( &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( "<<< .\n" ); if ( cksum ) { - EVP_DigestFinal( &mdctx, md_value, &md_len ); + EVP_DigestFinal( mdctx, md_value, &md_len ); + EVP_MD_CTX_free( mdctx ); + mdctx = NULL; base64_e(( char*)&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 ); }