mirror of
				https://github.com/Cisco-Talos/clamav.git
				synced 2025-10-31 16:10:54 +00:00 
			
		
		
		
	HFS+ parser: Fix bugs introduced in refactor
Fix pretty silly double-free, and fix issue where 'extracted_file' was not being set to true. Also rename `uncompressed` variable to `uncompressed_block`, because there is another variable with the same name, above.
This commit is contained in:
		
							parent
							
								
									4036484924
								
							
						
					
					
						commit
						92cbfa4bc0
					
				
					 1 changed files with 13 additions and 14 deletions
				
			
		|  | @ -1180,6 +1180,8 @@ static cl_error_t hfsplus_walk_catalog(cli_ctx *ctx, hfsPlusVolumeHeader *volHea | ||||||
| 
 | 
 | ||||||
|                                 written = cli_writen(ofd, uncompressed, header.fileSize); |                                 written = cli_writen(ofd, uncompressed, header.fileSize); | ||||||
| 
 | 
 | ||||||
|  |                                 extracted_file = true; | ||||||
|  | 
 | ||||||
|                                 free(uncompressed); |                                 free(uncompressed); | ||||||
|                                 uncompressed = NULL; |                                 uncompressed = NULL; | ||||||
|                             } |                             } | ||||||
|  | @ -1237,7 +1239,7 @@ static cl_error_t hfsplus_walk_catalog(cli_ctx *ctx, hfsPlusVolumeHeader *volHea | ||||||
|                                         cli_dbgmsg("hfsplus_walk_catalog: Failed to read block table\n"); |                                         cli_dbgmsg("hfsplus_walk_catalog: Failed to read block table\n"); | ||||||
|                                     } else { |                                     } else { | ||||||
|                                         uint8_t block[4096]; |                                         uint8_t block[4096]; | ||||||
|                                         uint8_t uncompressed[4096]; |                                         uint8_t uncompressed_block[4096]; | ||||||
|                                         unsigned curBlock; |                                         unsigned curBlock; | ||||||
| 
 | 
 | ||||||
|                                         for (curBlock = 0; status == CL_SUCCESS && curBlock < numBlocks; ++curBlock) { |                                         for (curBlock = 0; status == CL_SUCCESS && curBlock < numBlocks; ++curBlock) { | ||||||
|  | @ -1279,8 +1281,8 @@ static cl_error_t hfsplus_walk_catalog(cli_ctx *ctx, hfsPlusVolumeHeader *volHea | ||||||
|                                                         stream.opaque    = Z_NULL; |                                                         stream.opaque    = Z_NULL; | ||||||
|                                                         stream.avail_in  = readLen; |                                                         stream.avail_in  = readLen; | ||||||
|                                                         stream.next_in   = block; |                                                         stream.next_in   = block; | ||||||
|                                                         stream.avail_out = sizeof(uncompressed); |                                                         stream.avail_out = sizeof(uncompressed_block); | ||||||
|                                                         stream.next_out  = uncompressed; |                                                         stream.next_out  = uncompressed_block; | ||||||
| 
 | 
 | ||||||
|                                                         if (Z_OK != (z_ret = inflateInit2(&stream, 15))) { |                                                         if (Z_OK != (z_ret = inflateInit2(&stream, 15))) { | ||||||
|                                                             cli_dbgmsg("hfsplus_walk_catalog: inflateInit2 failed (%d)\n", z_ret); |                                                             cli_dbgmsg("hfsplus_walk_catalog: inflateInit2 failed (%d)\n", z_ret); | ||||||
|  | @ -1293,8 +1295,8 @@ static cl_error_t hfsplus_walk_catalog(cli_ctx *ctx, hfsPlusVolumeHeader *volHea | ||||||
|                                                 if (streamCompressed) { |                                                 if (streamCompressed) { | ||||||
|                                                     stream.avail_in  = readLen; |                                                     stream.avail_in  = readLen; | ||||||
|                                                     stream.next_in   = block; |                                                     stream.next_in   = block; | ||||||
|                                                     stream.avail_out = sizeof(uncompressed); |                                                     stream.avail_out = sizeof(uncompressed_block); | ||||||
|                                                     stream.next_out  = uncompressed; |                                                     stream.next_out  = uncompressed_block; | ||||||
| 
 | 
 | ||||||
|                                                     while (stream.avail_in > 0) { |                                                     while (stream.avail_in > 0) { | ||||||
|                                                         z_ret = inflate(&stream, Z_NO_FLUSH); |                                                         z_ret = inflate(&stream, Z_NO_FLUSH); | ||||||
|  | @ -1304,14 +1306,14 @@ static cl_error_t hfsplus_walk_catalog(cli_ctx *ctx, hfsPlusVolumeHeader *volHea | ||||||
|                                                             goto done; |                                                             goto done; | ||||||
|                                                         } |                                                         } | ||||||
| 
 | 
 | ||||||
|                                                         if (cli_writen(ofd, &uncompressed, sizeof(uncompressed) - stream.avail_out) != sizeof(uncompressed) - stream.avail_out) { |                                                         if (cli_writen(ofd, &uncompressed_block, sizeof(uncompressed_block) - stream.avail_out) != sizeof(uncompressed_block) - stream.avail_out) { | ||||||
|                                                             cli_dbgmsg("hfsplus_walk_catalog: Failed to write to temporary file\n"); |                                                             cli_dbgmsg("hfsplus_walk_catalog: Failed to write to temporary file\n"); | ||||||
|                                                             status = CL_EWRITE; |                                                             status = CL_EWRITE; | ||||||
|                                                             goto done; |                                                             goto done; | ||||||
|                                                         } |                                                         } | ||||||
|                                                         written += sizeof(uncompressed) - stream.avail_out; |                                                         written += sizeof(uncompressed_block) - stream.avail_out; | ||||||
|                                                         stream.avail_out = sizeof(uncompressed); |                                                         stream.avail_out = sizeof(uncompressed_block); | ||||||
|                                                         stream.next_out  = uncompressed; |                                                         stream.next_out  = uncompressed_block; | ||||||
| 
 | 
 | ||||||
|                                                         extracted_file = true; |                                                         extracted_file = true; | ||||||
|                                                     } |                                                     } | ||||||
|  | @ -1432,7 +1434,6 @@ static cl_error_t hfsplus_walk_catalog(cli_ctx *ctx, hfsPlusVolumeHeader *volHea | ||||||
| done: | done: | ||||||
|     if (table) { |     if (table) { | ||||||
|         free(table); |         free(table); | ||||||
|         table = NULL; |  | ||||||
|     } |     } | ||||||
|     if (-1 != ifd) { |     if (-1 != ifd) { | ||||||
|         close(ifd); |         close(ifd); | ||||||
|  | @ -1453,7 +1454,6 @@ done: | ||||||
|                 goto done; |                 goto done; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 |  | ||||||
|         free(tmpname); |         free(tmpname); | ||||||
|     } |     } | ||||||
|     if (NULL != nodeBuf) { |     if (NULL != nodeBuf) { | ||||||
|  | @ -1462,9 +1462,8 @@ done: | ||||||
|     if (NULL != name_utf8) { |     if (NULL != name_utf8) { | ||||||
|         free(name_utf8); |         free(name_utf8); | ||||||
|     } |     } | ||||||
|     if (NULL != name_utf8) { |     if (NULL != uncompressed) { | ||||||
|         free(name_utf8); |         free(uncompressed); | ||||||
|         name_utf8 = NULL; |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return status; |     return status; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Micah Snyder
						Micah Snyder