3030 * @see https://github.com/scanoss/ldb/blob/master/src/lock.c
3131 */
3232
33- #include <openssl/md5.h>
3433#include <fcntl.h>
3534#include <libgen.h>
3635#include <stdbool.h>
4140#include <zlib.h>
4241#include "ldb.h"
4342
44- /**
45- * @brief Returns the hexadecimal md5 sum for "path"
46- *
47- * @param path string path
48- * @return pointer to file md5 array
49- */
50- uint8_t * file_md5 (char * path )
51- {
52- uint8_t * c = calloc (16 ,1 );
53- FILE * fp = fopen (path , "rb" );
54- MD5_CTX mdContext ;
55- uint32_t bytes ;
56-
57- if (fp != NULL )
58- {
59- uint8_t * buffer = malloc (BUFFER_SIZE );
60- MD5_Init (& mdContext );
61-
62- while ((bytes = fread (buffer , 1 , BUFFER_SIZE , fp )) != 0 )
63- MD5_Update (& mdContext , buffer , bytes );
64-
65- MD5_Final (c , & mdContext );
66- fclose (fp );
67- free (buffer );
68- }
69- return c ;
70- }
71-
72- /**
73- * @brief Calculates the MD5 hash for data
74- *
75- * @param data input data
76- * @param size data size
77- * @param out[out] pointer to MD5 array
78- */
79- void calc_md5 (char * data , int size , uint8_t * out )
80- {
81- MD5_CTX mdContext ;
82- MD5_Init (& mdContext );
83- MD5_Update (& mdContext , data , size );
84- MD5_Final (out , & mdContext );
85- }
8643
8744/**
8845 * @brief compare two MZ keys
@@ -169,7 +126,7 @@ bool mz_list_handler(struct mz_job *job)
169126
170127 /* Calculate resulting data MD5 */
171128 uint8_t actual_md5 [MD5_LEN ];
172- calc_md5 ( job -> data , job -> data_ln , actual_md5 );
129+ md5_string (( unsigned char * ) job -> data , job -> data_ln , actual_md5 );
173130
174131 /* Compare data checksum to validate */
175132 char actual [MD5_LEN * 2 + 1 ] = "\0" ;
@@ -322,7 +279,7 @@ bool mz_extract_handler(struct mz_job *job)
322279
323280 /* Calculate resulting data MD5 */
324281 uint8_t actual_md5 [MD5_LEN ];
325- calc_md5 ( job -> data , job -> data_ln , actual_md5 );
282+ md5_string (( unsigned char * ) job -> data , job -> data_ln , actual_md5 );
326283
327284 /* Compare data checksum to validate */
328285 char actual [MD5_LEN * 2 + 1 ] = "\0" ;
@@ -644,7 +601,7 @@ void mz_add(char *mined_path, uint8_t *md5, char *src, int src_ln, bool check, u
644601 /* We save the first bytes of zsrc to accomodate the MZ header */
645602 compress (zsrc + MZ_HEAD , & zsrc_ln , (uint8_t * ) src , src_ln + 1 );
646603 uint32_t zln = zsrc_ln ;
647-
604+
648605 /* Only the last 14 bytes of the MD5 go to the mz record (first two bytes are the file name) */
649606 memcpy (zsrc , md5 + 2 , MZ_MD5 );
650607
@@ -653,7 +610,6 @@ void mz_add(char *mined_path, uint8_t *md5, char *src, int src_ln, bool check, u
653610
654611 int mzid = uint16 (md5 );
655612 int mzlen = zsrc_ln + MZ_HEAD ;
656-
657613 /* If it won't fit in the cache, write it directly */
658614 if (mzlen > MZ_CACHE_SIZE )
659615 {
@@ -767,18 +723,68 @@ void mz_corrupted()
767723 exit (EXIT_FAILURE );
768724}
769725
726+
770727/**
771728 * @brief Decompress a MZ job
772729 *
773730 * @param job MZ job
774731 */
732+ #define CHUNK_SIZE 1024
733+
734+ int uncompress_by_chunks (uint8_t * * data , uint8_t * zdata , size_t zdata_len ) {
735+ int ret ;
736+ z_stream strm ;
737+ unsigned char out [CHUNK_SIZE ];
738+ size_t data_size = 0 ; // Current size of decompressed data
739+
740+ // Initialize the z_stream structure
741+ memset (& strm , 0 , sizeof (strm ));
742+ ret = inflateInit (& strm );
743+ if (ret != Z_OK ) {
744+ fprintf (stderr , "inflateInit failed with error %d\n" , ret );
745+ exit (EXIT_FAILURE );
746+ }
747+ * data = malloc (CHUNK_SIZE );
748+ // Process the compressed data
749+ strm .avail_in = zdata_len ; // Size of the compressed data
750+ strm .next_in = zdata ;
751+
752+ do {
753+ strm .avail_out = CHUNK_SIZE ;
754+ strm .next_out = out ;
755+
756+ ret = inflate (& strm , Z_NO_FLUSH );
757+ if (ret == Z_STREAM_ERROR ) {
758+ fprintf (stderr , "inflate failed with error Z_STREAM_ERROR\n" );
759+ inflateEnd (& strm );
760+ mz_corrupted ();
761+ }
762+
763+ unsigned have = CHUNK_SIZE - strm .avail_out ;
764+
765+ // Realloc to increase the size of data
766+ * data = realloc (* data , data_size + have );
767+ if (* data == NULL )
768+ {
769+ fprintf (stderr , "Error reallocating memory to store decompressed data" );
770+ inflateEnd (& strm );
771+ exit (EXIT_FAILURE );
772+ }
773+
774+ // Copy the decompressed data to the end of data
775+ memcpy (* data + data_size , out , have );
776+ data_size += have ;
777+ } while (ret != Z_STREAM_END );
778+
779+ // Free resources
780+ inflateEnd (& strm );
781+ return data_size ;
782+ }
783+
775784void mz_deflate (struct mz_job * job )
776785{
777786 /* Decompress data */
778- job -> data_ln = MZ_MAX_FILE ;
779- if (Z_OK != uncompress ((uint8_t * )job -> data , & job -> data_ln , job -> zdata , job -> zdata_ln ))
780- {
781- mz_corrupted ();
782- }
787+ job -> data_ln = uncompress_by_chunks ((uint8_t * * ) & job -> data , job -> zdata , job -> zdata_ln );
783788 job -> data_ln -- ;
784789}
790+
0 commit comments