Add missing endianness conversions in fzap code
This commit is contained in:
		
							parent
							
								
									fe79a8ad9d
								
							
						
					
					
						commit
						47c3603cc8
					
				
					 1 changed files with 18 additions and 11 deletions
				
			
		|  | @ -831,7 +831,7 @@ zap_leaf_lookup (zap_leaf_phys_t * l, grub_zfs_endian_t endian, | |||
|     return grub_error (GRUB_ERR_BAD_FS, "invalid leaf magic"); | ||||
| 
 | ||||
|   for (chunk = grub_zfs_to_cpu16 (l->l_hash[LEAF_HASH (blksft, h)], endian); | ||||
|        chunk != CHAIN_END; chunk = le->le_next) | ||||
|        chunk != CHAIN_END; chunk = grub_zfs_to_cpu16 (le->le_next, endian)) | ||||
|     { | ||||
| 
 | ||||
|       if (chunk >= ZAP_LEAF_NUMCHUNKS (blksft)) | ||||
|  | @ -856,7 +856,8 @@ zap_leaf_lookup (zap_leaf_phys_t * l, grub_zfs_endian_t endian, | |||
| 	  struct zap_leaf_array *la; | ||||
| 	  grub_uint8_t *ip; | ||||
| 
 | ||||
| 	  if (le->le_int_size != 8 || le->le_value_length != 1) | ||||
| 	  if (le->le_int_size != 8 || grub_zfs_to_cpu16 (le->le_value_length, | ||||
| 							 endian) != 1) | ||||
| 	    return grub_error (GRUB_ERR_BAD_FS, "invalid leaf chunk entry"); | ||||
| 
 | ||||
| 	  /* get the uint64_t property value */ | ||||
|  | @ -875,9 +876,9 @@ zap_leaf_lookup (zap_leaf_phys_t * l, grub_zfs_endian_t endian, | |||
| 
 | ||||
| /* Verify if this is a fat zap header block */ | ||||
| static grub_err_t | ||||
| zap_verify (zap_phys_t *zap) | ||||
| zap_verify (zap_phys_t *zap, grub_zfs_endian_t endian) | ||||
| { | ||||
|   if (zap->zap_magic != (grub_uint64_t) ZAP_MAGIC) | ||||
|   if (grub_zfs_to_cpu64 (zap->zap_magic, endian) != (grub_uint64_t) ZAP_MAGIC) | ||||
|     return grub_error (GRUB_ERR_BAD_FS, "bad ZAP magic"); | ||||
| 
 | ||||
|   if (zap->zap_flags != 0) | ||||
|  | @ -905,7 +906,7 @@ fzap_lookup (dnode_end_t * zap_dnode, zap_phys_t * zap, | |||
|   grub_err_t err; | ||||
|   grub_zfs_endian_t leafendian; | ||||
| 
 | ||||
|   err = zap_verify (zap); | ||||
|   err = zap_verify (zap, zap_dnode->endian); | ||||
|   if (err) | ||||
|     return err; | ||||
| 
 | ||||
|  | @ -916,7 +917,7 @@ fzap_lookup (dnode_end_t * zap_dnode, zap_phys_t * zap, | |||
|     return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,  | ||||
| 		       "external pointer tables not supported"); | ||||
|   idx = ZAP_HASH_IDX (hash, zap->zap_ptrtbl.zt_shift); | ||||
|   blkid = ((grub_uint64_t *) zap)[idx + (1 << (blksft - 3 - 1))]; | ||||
|   blkid = grub_zfs_to_cpu64 (((grub_uint64_t *) zap)[idx + (1 << (blksft - 3 - 1))], zap_dnode->endian); | ||||
| 
 | ||||
|   /* Get the leaf block */ | ||||
|   if ((1U << blksft) < sizeof (zap_leaf_phys_t)) | ||||
|  | @ -945,7 +946,7 @@ fzap_iterate (dnode_end_t * zap_dnode, zap_phys_t * zap, | |||
|   grub_err_t err; | ||||
|   grub_zfs_endian_t endian; | ||||
| 
 | ||||
|   if (zap_verify (zap)) | ||||
|   if (zap_verify (zap, zap_dnode->endian)) | ||||
|     return 0; | ||||
| 
 | ||||
|   /* get block id from index */ | ||||
|  | @ -964,7 +965,8 @@ fzap_iterate (dnode_end_t * zap_dnode, zap_phys_t * zap, | |||
|   for (idx = 0; idx < grub_zfs_to_cpu64 (zap->zap_num_leafs, | ||||
| 					 zap_dnode->endian); idx++) | ||||
|     { | ||||
|       blkid = ((grub_uint64_t *) zap)[idx + (1 << (blksft - 3 - 1))]; | ||||
|       blkid = grub_zfs_to_cpu64 (((grub_uint64_t *) zap)[idx + (1 << (blksft - 3 - 1))], | ||||
| 					 zap_dnode->endian); | ||||
| 
 | ||||
|       err = dmu_read (zap_dnode, blkid, (void **) &l, &endian, data); | ||||
|       if (err) | ||||
|  | @ -999,8 +1001,11 @@ fzap_iterate (dnode_end_t * zap_dnode, zap_phys_t * zap, | |||
| 
 | ||||
| 	    buf = grub_malloc (grub_zfs_to_cpu16 (le->le_name_length, endian)  | ||||
| 			       + 1); | ||||
| 	    if (zap_leaf_array_get (l, endian, blksft, le->le_name_chunk, | ||||
| 				    le->le_name_length, buf)) | ||||
| 	    if (zap_leaf_array_get (l, endian, blksft, | ||||
| 				    grub_zfs_to_cpu16 (le->le_name_chunk, | ||||
| 						       endian), | ||||
| 				    grub_zfs_to_cpu16 (le->le_name_length, | ||||
| 						       endian), buf)) | ||||
| 	      { | ||||
| 		grub_free (buf); | ||||
| 		continue; | ||||
|  | @ -1012,7 +1017,9 @@ fzap_iterate (dnode_end_t * zap_dnode, zap_phys_t * zap, | |||
| 	      continue; | ||||
| 
 | ||||
| 	    /* get the uint64_t property value */ | ||||
| 	    la = &ZAP_LEAF_CHUNK (l, blksft, le->le_value_chunk).l_array; | ||||
| 	    la = &ZAP_LEAF_CHUNK (l, blksft, | ||||
| 				  grub_zfs_to_cpu16 (le->le_value_chunk, | ||||
| 						     endian)).l_array; | ||||
| 	    val = grub_be_to_cpu64 (la->la_array64); | ||||
| 	    if (hook (buf, val)) | ||||
| 	      return 1; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue