--- cksum.c.orig 2010-12-13 14:42:49.000000000 +1100 +++ cksum.c 2020-01-29 08:49:22.000000000 +1100 @@ -41,20 +41,26 @@ do_fcksum( int fd, char *cksum_b64 ) off_t size = 0; unsigned char buf[ 8192 ]; extern EVP_MD *md; - EVP_MD_CTX mdctx; + EVP_MD_CTX *mdctx; unsigned char md_value[ EVP_MAX_MD_SIZE ]; - EVP_DigestInit( &mdctx, md ); + mdctx = EVP_MD_CTX_new(); + if (!mdctx) { + return( -1 ); + } + EVP_DigestInit( mdctx, md ); while (( rr = read( fd, buf, sizeof( buf ))) > 0 ) { size += rr; - EVP_DigestUpdate( &mdctx, buf, (unsigned int)rr ); + EVP_DigestUpdate( mdctx, buf, (unsigned int)rr ); } if ( rr < 0 ) { + EVP_MD_CTX_free( mdctx ); return( -1 ); } - EVP_DigestFinal( &mdctx, md_value, &md_len ); + EVP_DigestFinal( mdctx, md_value, &md_len ); + EVP_MD_CTX_free( mdctx ); base64_e( md_value, md_len, cksum_b64 ); return( size ); @@ -103,13 +109,17 @@ do_acksum( char *path, char *cksum_b64, struct as_entry as_entries_endian[ 3 ]; unsigned int md_len; extern EVP_MD *md; - EVP_MD_CTX mdctx; + EVP_MD_CTX *mdctx; unsigned char md_value[ EVP_MAX_MD_SIZE ]; - EVP_DigestInit( &mdctx, md ); + mdctx = EVP_MD_CTX_new(); + if (!mdctx) { + return( -1 ); + } + EVP_DigestInit( mdctx, md ); /* checksum applesingle header */ - EVP_DigestUpdate( &mdctx, (char *)&as_header, AS_HEADERLEN ); + EVP_DigestUpdate( mdctx, (char *)&as_header, AS_HEADERLEN ); size += (size_t)AS_HEADERLEN; /* endian handling, sum big-endian header entries */ @@ -120,53 +130,61 @@ do_acksum( char *path, char *cksum_b64, as_entry_netswap( &as_entries_endian[ AS_DFE ] ); /* checksum header entries */ - EVP_DigestUpdate( &mdctx, (char *)&as_entries_endian, + EVP_DigestUpdate( mdctx, (char *)&as_entries_endian, (unsigned int)( 3 * sizeof( struct as_entry ))); size += sizeof( 3 * sizeof( struct as_entry )); /* checksum finder info data */ - EVP_DigestUpdate( &mdctx, afinfo->ai.ai_data, FINFOLEN ); + EVP_DigestUpdate( mdctx, afinfo->ai.ai_data, FINFOLEN ); size += FINFOLEN; /* checksum rsrc fork data */ if ( afinfo->as_ents[ AS_RFE ].ae_length > 0 ) { if ( snprintf( rsrc_path, MAXPATHLEN, "%s%s", path, _PATH_RSRCFORKSPEC ) >= MAXPATHLEN ) { + EVP_MD_CTX_free( mdctx ); errno = ENAMETOOLONG; return( -1 ); } if (( rfd = open( rsrc_path, O_RDONLY )) < 0 ) { + EVP_MD_CTX_free( mdctx ); return( -1 ); } while (( rc = read( rfd, buf, sizeof( buf ))) > 0 ) { - EVP_DigestUpdate( &mdctx, buf, (unsigned int)rc ); + EVP_DigestUpdate( mdctx, buf, (unsigned int)rc ); size += (size_t)rc; } if ( close( rfd ) < 0 ) { + EVP_MD_CTX_free( mdctx ); return( -1 ); } if ( rc < 0 ) { + EVP_MD_CTX_free( mdctx ); return( -1 ); } } if (( dfd = open( path, O_RDONLY, 0 )) < 0 ) { + EVP_MD_CTX_free( mdctx ); return( -1 ); } /* checksum data fork */ while (( rc = read( dfd, buf, sizeof( buf ))) > 0 ) { - EVP_DigestUpdate( &mdctx, buf, (unsigned int)rc ); + EVP_DigestUpdate( mdctx, buf, (unsigned int)rc ); size += (size_t)rc; } if ( rc < 0 ) { + EVP_MD_CTX_free( mdctx ); return( -1 ); } if ( close( dfd ) < 0 ) { + EVP_MD_CTX_free( mdctx ); return( -1 ); } - EVP_DigestFinal( &mdctx, md_value, &md_len ); + EVP_DigestFinal( mdctx, md_value, &md_len ); + EVP_MD_CTX_free( mdctx ); base64_e( ( char*)&md_value, md_len, cksum_b64 ); return( size );