zfs_lzjb.c 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. /*
  2. * GRUB -- GRand Unified Bootloader
  3. * Copyright (C) 1999,2000,2001,2002,2003,2004,2009 Free Software Foundation, Inc.
  4. * Copyright 2007 Sun Microsystems, Inc.
  5. *
  6. * GRUB is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * GRUB is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
  18. */
  19. #include <grub/err.h>
  20. #include <grub/file.h>
  21. #include <grub/mm.h>
  22. #include <grub/misc.h>
  23. #include <grub/disk.h>
  24. #include <grub/dl.h>
  25. #include <grub/types.h>
  26. #include <grub/zfs/zfs.h>
  27. #include <grub/zfs/zio.h>
  28. #include <grub/zfs/dnode.h>
  29. #include <grub/zfs/uberblock_impl.h>
  30. #include <grub/zfs/vdev_impl.h>
  31. #include <grub/zfs/zio_checksum.h>
  32. #include <grub/zfs/zap_impl.h>
  33. #include <grub/zfs/zap_leaf.h>
  34. #include <grub/zfs/zfs_znode.h>
  35. #include <grub/zfs/dmu.h>
  36. #include <grub/zfs/dmu_objset.h>
  37. #include <grub/zfs/dsl_dir.h>
  38. #include <grub/zfs/dsl_dataset.h>
  39. #define MATCH_BITS 6
  40. #define MATCH_MIN 3
  41. #define OFFSET_MASK ((1 << (16 - MATCH_BITS)) - 1)
  42. /*
  43. * Decompression Entry - lzjb
  44. */
  45. #ifndef NBBY
  46. #define NBBY 8
  47. #endif
  48. grub_err_t
  49. lzjb_decompress (void *s_start, void *d_start, grub_size_t s_len,
  50. grub_size_t d_len);
  51. grub_err_t
  52. lzjb_decompress (void *s_start, void *d_start, grub_size_t s_len,
  53. grub_size_t d_len)
  54. {
  55. grub_uint8_t *src = s_start;
  56. grub_uint8_t *dst = d_start;
  57. grub_uint8_t *d_end = (grub_uint8_t *) d_start + d_len;
  58. grub_uint8_t *s_end = (grub_uint8_t *) s_start + s_len;
  59. grub_uint8_t *cpy, copymap = 0;
  60. int copymask = 1 << (NBBY - 1);
  61. while (dst < d_end && src < s_end)
  62. {
  63. if ((copymask <<= 1) == (1 << NBBY))
  64. {
  65. copymask = 1;
  66. copymap = *src++;
  67. }
  68. if (src >= s_end)
  69. return grub_error (GRUB_ERR_BAD_FS, "lzjb decompression failed");
  70. if (copymap & copymask)
  71. {
  72. int mlen = (src[0] >> (NBBY - MATCH_BITS)) + MATCH_MIN;
  73. int offset = ((src[0] << NBBY) | src[1]) & OFFSET_MASK;
  74. src += 2;
  75. cpy = dst - offset;
  76. if (src > s_end || cpy < (grub_uint8_t *) d_start)
  77. return grub_error (GRUB_ERR_BAD_FS, "lzjb decompression failed");
  78. while (--mlen >= 0 && dst < d_end)
  79. *dst++ = *cpy++;
  80. }
  81. else
  82. *dst++ = *src++;
  83. }
  84. if (dst < d_end)
  85. return grub_error (GRUB_ERR_BAD_FS, "lzjb decompression failed");
  86. return GRUB_ERR_NONE;
  87. }