diff options
author | Xiaogang Cui <xiaogang@codeaurora.org> | 2014-07-22 14:34:39 +0800 |
---|---|---|
committer | Adnan Begovic <adnan@cyngn.com> | 2015-10-07 17:39:54 -0700 |
commit | 96197b7080a090ed3992900bd9f4e0f72bfd9c0d (patch) | |
tree | f2eed2d5b20cd9cafbaa868c82d8e9807634ac17 | |
parent | 53020727b8f86203bb8a1f6a65d8a70f17755bf4 (diff) | |
download | android_external_fsck_msdos-96197b7080a090ed3992900bd9f4e0f72bfd9c0d.tar.gz android_external_fsck_msdos-96197b7080a090ed3992900bd9f4e0f72bfd9c0d.tar.bz2 android_external_fsck_msdos-96197b7080a090ed3992900bd9f4e0f72bfd9c0d.zip |
external: fsck_msdos: fix pointer truncation issue of 64bit
fix the pointer truncation issue of 64bit when porting from 32bit
which cause segment fault.
Change-Id: I2bc1fdbc4308de60d4e80ec65bf1b603198ae87f
-rw-r--r-- | dir.c | 8 | ||||
-rw-r--r-- | fatcache.h | 13 | ||||
-rw-r--r-- | fragment.h | 9 |
3 files changed, 18 insertions, 12 deletions
@@ -384,7 +384,7 @@ static int removede(int f, struct bootblock *boot,struct cluster_chain_descriptor *fat, u_char *start, u_char *end, cl_t startcl, cl_t endcl, cl_t curcl, char *path, int type) { - fsck_debug("removede : %u:%u --->> %u:%u \n",startcl,start,endcl,end); + fsck_debug("removede : %u:%p --->> %u:%p \n",startcl,start,endcl,end); switch (type) { case 0: pwarn("Invalid long filename entry for %s\n", path); @@ -425,8 +425,8 @@ checksize(struct bootblock *boot, u_char *p, /* * Check size on ordinary files */ - struct cluster_chain_descriptor *fat,tofind; - struct fatcache *cache; + struct cluster_chain_descriptor *fat = NULL,tofind; + struct fatcache *cache = NULL; u_int64_t physicalSize; const u_int64_t max_physical_size = 0x100000000; @@ -461,7 +461,7 @@ checksize(struct bootblock *boot, u_char *p, } if (physicalSize < (u_int64_t)dir->size) { - pwarn("size of %s is %u, should at most be %u\n", + pwarn("size of %s is %u, should at most be %llu\n", fullpath(dir), dir->size, physicalSize); fsck_debug("physicalSize:%llu ,dir->size = %d ,dir->head:0x%x\n",physicalSize,dir->size,dir->head); if (ask(1, "Truncate")) { @@ -52,15 +52,20 @@ #define fsck_warn FSCK_SLOGW #define fsck_err FSCK_SLOGE #define fsck_debug FSCK_SLOGD + +#ifndef offsetof #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) +#endif + #define container_of(ptr, type, member) \ ((type *)((unsigned long)(ptr) - offsetof(type, member))) int fsck_msdos_cache_compare(struct cluster_chain_descriptor *fat1,struct cluster_chain_descriptor *fat2); RB_HEAD(FSCK_MSDOS_CACHE,cluster_chain_descriptor); -extern RB_FIND(name, x, y); -extern RB_REMOVE(name, x, y); -extern RB_NEXT(name, x, y); -extern RB_INSERT(name, x, y); +struct cluster_chain_descriptor* FSCK_MSDOS_CACHE_RB_FIND(struct FSCK_MSDOS_CACHE* x, struct cluster_chain_descriptor *y); +struct cluster_chain_descriptor* FSCK_MSDOS_CACHE_RB_REMOVE(struct FSCK_MSDOS_CACHE* x, struct cluster_chain_descriptor *y); +struct cluster_chain_descriptor* FSCK_MSDOS_CACHE_RB_NEXT(struct cluster_chain_descriptor *y); +struct cluster_chain_descriptor* FSCK_MSDOS_CACHE_RB_INSERT(struct FSCK_MSDOS_CACHE* x, struct cluster_chain_descriptor *y); +struct cluster_chain_descriptor* FSCK_MSDOS_CACHE_RB_MINMAX(struct FSCK_MSDOS_CACHE* x, int val); extern struct FSCK_MSDOS_CACHE rb_root; extern unsigned int * fat_bitmap; typedef unsigned char u_char; @@ -42,8 +42,9 @@ RB_HEAD(FSCK_MSDOS_FRAGMENT,fragment) ; extern struct FSCK_MSDOS_FRAGMENT rb_free_root,rb_bad_root; void free_fragment_tree(struct FSCK_MSDOS_FRAGMENT* head); struct fragment* New_fragment(void); -extern RB_FIND(name, x, y); -extern RB_REMOVE(name, x, y); -extern RB_NEXT(name, x, y); -extern RB_INSERT(name, x, y); +struct fragment* FSCK_MSDOS_FRAGMENT_RB_FIND(struct FSCK_MSDOS_FRAGMENT* x, struct fragment* y); +struct fragment* FSCK_MSDOS_FRAGMENT_RB_REMOVE(struct FSCK_MSDOS_FRAGMENT* x, struct fragment* y); +struct fragment* FSCK_MSDOS_FRAGMENT_RB_NEXT(struct fragment* y); +struct fragment* FSCK_MSDOS_FRAGMENT_RB_INSERT(struct FSCK_MSDOS_FRAGMENT* x, struct fragment* y); +struct fragment* FSCK_MSDOS_FRAGMENT_RB_MINMAX(struct FSCK_MSDOS_FRAGMENT* x, int val); #endif |