From 057d8eb909dc9d7a52babf4edd93017b7263fb19 Mon Sep 17 00:00:00 2001 From: comex Date: Tue, 12 Jul 2011 21:23:27 -0400 Subject: [PATCH] -3 --- catalog/catalog.py | 12 +++- catalog/kcode.S | 4 ++ common/common.h | 23 ++++--- data | 2 +- fs/fs.h | 4 +- fs/union/splice.c | 130 +++++++++++++++++++++++++++++++++++++ fs/union/union_subr.c | 7 +- fs/union/union_vfsops.c | 8 ++- fs/union/union_vnops.c | 111 ++++++++++++++++++------------- install/install.m | 86 ++++++++++++++---------- install/libtar.a | Bin 259104 -> 39880 bytes locutus/locutus.c | 51 +++++++++------ locutus/locutus_server.m | 34 +++++++--- make.py | 46 +++++++++---- starstuff/build-archive.sh | 22 +++++-- 15 files changed, 392 insertions(+), 148 deletions(-) create mode 100644 fs/union/splice.c diff --git a/catalog/catalog.py b/catalog/catalog.py index c7ec809..632776c 100644 --- a/catalog/catalog.py +++ b/catalog/catalog.py @@ -52,7 +52,13 @@ def dbg_result(): sysent = dmini.cur.find('- 00 10 86 00') + 4 code_addr = 0x80000400 -weirdfile = dmini.Connection(kcode, rw=True).relocate(dmini.cur, code_addr).nth_segment(0).data()[:-8] +def my_ls(binary, sym): + if sym == '_chgproccnt': + # I'm lazy, make this strref later + result = dmini.cur.find('+ f0 b5 03 af 2d e9 00 0d .. .. .. .. 05 46 8a 46 4f f0 00 08') + print hex(result) + return result +weirdfile = dmini.Connection(kcode, rw=True).relocate(dmini.cur, code_addr, my_ls).nth_segment(0).data()[:-8] count = 0 stuff = '' while True: @@ -122,7 +128,7 @@ def seek_kernel_ldm(reg): set_fwd('PC', code_addr) -kstuff = finalize(None, must_be_simple=False, should_heapdump=True); +kstuff = finalize(None, must_be_simple=False, should_heapdump=False) kstuff.append('\0'*1024) def set_cache(cachefile): @@ -313,6 +319,6 @@ def do_main_thing(): init_sp = 0x10031000 address = 0x8000 - final = finalize(address, should_heapdump=True) + final = finalize(address, should_heapdump=False) open(outfile, 'w').write(pickle.dumps({'segment': final, 'initializer': initializer, 'init_sp': init_sp, 'rop_address': address, 'libs': lib_paths, 'dylib': False})) diff --git a/catalog/kcode.S b/catalog/kcode.S index 91eb45c..aee1f05 100644 --- a/catalog/kcode.S +++ b/catalog/kcode.S @@ -102,6 +102,10 @@ syscall_0: ldr r0, [r0, #c(0x6c, 0x80)] cmp r0, #0 strne r1, [r0, #8] + # I don't care about mobile staying alive, but I do care about the reference count dropping + #mov r0, #0 + #mov r1, #1 + #bl _chgproccnt #endif ldr r0, sysent ldr r1, [r0, #0xc4] diff --git a/common/common.h b/common/common.h index 309923d..0f25177 100644 --- a/common/common.h +++ b/common/common.h @@ -13,10 +13,17 @@ #ifndef _log #define _log(args...) fprintf(stderr, args) #endif +#ifndef _fail +#define _fail(name) exit(1) +#endif + +#define LINENO lineno1(__FILE__, __LINE__) +#define lineno1(f, l) lineno2(f, l) +#define lineno2(f, l) f ":" #l -#define _assert(expr, arg...) ((expr) ?: (_assert_helper(#expr, arg + 0), (typeof(expr)) 0)) +#define _assert(expr, arg...) ((expr) ?: (_assert_helper(#expr, LINENO, arg + 0), (typeof(expr)) 0)) #define _assert_zero(expr, arg...) do { typeof(expr) _value = (expr); \ - if(_value) _assert_zero_helper(#expr, arg + 0, (unsigned int) _value); \ + if(_value) _assert_zero_helper(#expr, LINENO, arg + 0, (unsigned int) _value); \ } while(0) #ifdef NO_ASSERT_MESSAGES #define _assert_helper(...) abort() @@ -24,15 +31,15 @@ #else __attribute__((noreturn)) -static void _assert_helper(const char name[], const char *arg) { - _log("assertion failed: %s%s%s%s (errno=%s)\n", name, arg ? "[" : "", arg ? arg : "", arg ? "]" : "", strerror(errno)); - exit(1); +static void _assert_helper(const char name[], const char lineno[], const char *arg) { + _log("assertion failed (%s): %s%s%s%s (errno=%s)\n", lineno, name, arg ? "[" : "", arg ? arg : "", arg ? "]" : "", strerror(errno)); + _fail(name); } __attribute__((noreturn)) -static void _assert_zero_helper(const char name[], const char *arg, unsigned int value) { - _log("assertion failed: %s%s%s%s (value=0x%x, errno=%s)\n", name, arg ? "[" : "", arg ? arg : "", arg ? "]" : "", value, strerror(errno)); - exit(1); +static void _assert_zero_helper(const char name[], const char lineno[], const char *arg, unsigned int value) { + _log("assertion failed (%s): %s%s%s%s (value=0x%x, errno=%s)\n", lineno, name, arg ? "[" : "", arg ? arg : "", arg ? "]" : "", value, strerror(errno)); + _fail(name); } #endif diff --git a/data b/data index be67f52..121f784 160000 --- a/data +++ b/data @@ -1 +1 @@ -Subproject commit be67f52507d9607e4353d1d91d379eec1a8ea347 +Subproject commit 121f784fb89cc31ef51b1d1ed69f38ecdfa77c1c diff --git a/fs/fs.h b/fs/fs.h index d8464b8..766fb8f 100644 --- a/fs/fs.h +++ b/fs/fs.h @@ -1,5 +1,6 @@ // whether to spam the syslog/dmesg with printfs #define DEBUG_PRINTF 0 +#define LOCKSPAM 0 #define IS_64BIT_PROCESS(x) 0 #include @@ -26,8 +27,7 @@ asm("$strref_22_76_6e_6f_64_65_5f_63_72_65_61_74_65_3a_20_75_6e_6b_6e_6f_77_6e_2 // '"vnode_create: unknown vtype %d' #define vn_create x_vn_create -#if 0 - +#if LOCKSPAM static void x_lck_mtx_lock(lck_mtx_t *lck) { printf("About to lock %p\n", lck); lck_mtx_lock(lck); diff --git a/fs/union/splice.c b/fs/union/splice.c new file mode 100644 index 0000000..6bdff06 --- /dev/null +++ b/fs/union/splice.c @@ -0,0 +1,130 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "union.h" +#include +#include +#include +#include + +#define CMD_ITERATE(hdr, cmd) for(struct load_command *cmd = (struct load_command *)((hdr) + 1), *end = (struct load_command *)((char *)(hdr + 1) + (hdr)->sizeofcmds); cmd < end; cmd = (struct load_command *)((char *)cmd + cmd->cmdsize)) + +extern struct { + int maxvfsconf; + struct vfstable *vfsconf; +} stuff + +#ifdef IPAD2 +// this stuff was modified prior to the dump, it's not a real difference +asm("$in___DATA__11_00_00_00_03_00_00_00_C_15_00_00_00"); +#else +asm("$in___DATA__11_00_00_00_00_00_00_00_C_11_00_00_00"); +#endif + +extern int union_lookup(struct vnop_lookup_args *ap); +extern lck_mtx_t * union_mtxp; +extern LIST_HEAD(unhead, union_node) *unhead; +extern int *unvplock; +extern int (**union_vnodeop_p)(void *); + +static void *sym(void *ptr, const char *find) { + union { + uintptr_t addr; + struct mach_header *mh; + } u; + u.addr = ((uintptr_t) ptr) & ~0xfff; + // search for the header + while(!(u.mh->magic == MH_MAGIC && u.mh->cputype == CPU_TYPE_ARM && u.mh->cpusubtype == CPU_SUBTYPE_ARM_V7)) { + u.addr -= 0x1000; + } + uint32_t le_begin = 0, le_end = 0; + void *le_ptr = NULL; + struct nlist *syms; + const char *strs; + uint32_t nsyms; + uint32_t slide = 0; + + CMD_ITERATE(u.mh, cmd) { + if(cmd->cmd == LC_SEGMENT) { + struct segment_command *sc = (void *) cmd; + if(!slide) slide = sc->vmaddr; + if(!strncmp(sc->segname, "__LINKEDIT", 16)) { + le_begin = sc->fileoff; + le_end = le_begin + sc->filesize; + le_ptr = (void *) sc->vmaddr; + } + } else if(cmd->cmd == LC_SYMTAB) { + struct symtab_command *sc = (void *) cmd; + if(le_ptr && sc->symoff >= le_begin && sc->symoff < le_end && sc->stroff >= le_begin && sc->stroff < le_end) { + syms = le_ptr + (sc->symoff - le_begin); + strs = le_ptr + (sc->stroff - le_begin); + nsyms = sc->nsyms; + goto ok; + } + } + } + IOLog("couldn't find syms\n"); + return 0; + ok:; + size_t findlen = strlen(find); + for(uint32_t i = 0; i < nsyms; i++) { + const char *name = strs + syms[i].n_un.n_strx; + if(!strncmp(name, find, findlen) && (name[findlen] == 0 || name[findlen] == '.')) { + return (void *) syms[i].n_value + slide; + } + } + return NULL; +} + +bool splice() { + int real_maxvfsconf = 0; + struct vfstable *union_tbl = NULL; + for(struct vfstable *tbl = stuff.vfsconf; tbl; tbl = tbl->vfc_next) { + if(tbl->vfc_typenum >= real_maxvfsconf) real_maxvfsconf = tbl->vfc_typenum; + if(!strncmp(tbl->vfc_name, "unionfs", MFSNAMELEN)) union_tbl = tbl; + } + stuff.maxvfsconf = real_maxvfsconf + 1; + + if(!union_tbl) return false; + + IOLog("Replacing union_lookup...\n"); + + struct nameidata nd; + NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, (user_addr_t) "/Applications", vfs_context_current()); + int error; + if(error = namei(&nd)) { + IOLog("couldn't look up /Applications\n"); + return true; + } + nameidone(&nd); + if(nd.ni_vp->v_mount->mnt_vtable != union_tbl) { + IOLog("/Applications is not unionfs\n"); + goto end; + } + void **lookup = (void **) &nd.ni_vp->v_op[vnop_lookup_desc.vdesc_offset]; + + void *old = *lookup; + union_mtxp = *(void **)sym(*lookup, "_union_mtxp"); + unhead = sym(*lookup, "_unhead_storage") ?: sym(*lookup, "_unhead"); + unvplock = sym(*lookup, "_unvplock_storage") ?: sym(*lookup, "_unvplock"); + union_vnodeop_p = *(void **)sym(*lookup, "_union_vnodeop_p"); + + IOLog("union_mtxp = %p head=%p vplock=%p ul=%p\n", union_mtxp, unhead, unvplock, union_lookup); + *lookup = &union_lookup; + end: + vnode_put(nd.ni_vp); + + return true; +} diff --git a/fs/union/union_subr.c b/fs/union/union_subr.c index 999690e..67f803e 100644 --- a/fs/union/union_subr.c +++ b/fs/union/union_subr.c @@ -95,7 +95,6 @@ #include #endif - static int union_vn_close(struct vnode *vp, int fmode, vfs_context_t ctx); /* must be power of two, otherwise change UNION_HASH() */ @@ -105,13 +104,13 @@ static int union_vn_close(struct vnode *vp, int fmode, vfs_context_t ctx); #define UNION_HASH(u, l) \ (((((uintptr_t) (u)) + ((uintptr_t) l)) >> 8) & (NHASH-1)) -static LIST_HEAD(unhead, union_node) unhead[NHASH]; -static int unvplock[NHASH]; +LIST_HEAD(unhead, union_node) unhead_storage[NHASH], *unhead = unhead_storage; +int unvplock_storage[NHASH], *unvplock = unvplock_storage; static lck_grp_t * union_lck_grp; static lck_grp_attr_t * union_lck_grp_attr; static lck_attr_t * union_lck_attr; -static lck_mtx_t * union_mtxp; +lck_mtx_t * union_mtxp; static int union_dircheck(struct vnode **, struct fileproc *, vfs_context_t ctx); static void union_newlower(struct union_node *, struct vnode *); diff --git a/fs/union/union_vfsops.c b/fs/union/union_vfsops.c index 8d0ffdb..8d5e6e4 100644 --- a/fs/union/union_vfsops.c +++ b/fs/union/union_vfsops.c @@ -82,6 +82,8 @@ #include #include #include +#include +#include #include "union.h" static int union_itercallback(vnode_t, void *); @@ -574,15 +576,18 @@ struct vfs_fsentry fe = { descs, 15, "unionfs", - VFS_TBLTHREADSAFE, + VFS_TBLTHREADSAFE | VFS_TBLNOTYPENUM, {NULL, NULL} }; extern void init_vnodeop_entries(); +extern bool splice(); + vfstable_t ft; __attribute__((constructor)) static void init() { + if(splice()) return; init_vnodeop_entries(); printf("vfs_fsadd: %d\n", vfs_fsadd(&fe, &ft)); printf("whiteout: %p\n", &vnop_whiteout_desc); @@ -594,3 +599,4 @@ static void fini() { printf("vfs_fsremove: %d\n", vfs_fsremove(ft)); union_dircheckp = NULL; } + diff --git a/fs/union/union_vnops.c b/fs/union/union_vnops.c index 4844acc..5d397de 100644 --- a/fs/union/union_vnops.c +++ b/fs/union/union_vnops.c @@ -188,9 +188,9 @@ union_lookup1(struct vnode *udvp, struct vnode **dvpp, struct vnode **vpp, return (0); } -#define CHUD(thr) ((uint32_t *) ((char *) (thr) + 0x4ac)) +#define CHUD(thr) ((uint32_t *) ((char *) (thr) + (VERSION >= 0x040300 ? 0x478 : 0x444))) -static int +int union_lookup(struct vnop_lookup_args *ap) /* struct vnop_lookup_args { @@ -215,7 +215,12 @@ union_lookup(struct vnop_lookup_args *ap) kauth_cred_t saved_cred; struct vnode_attr va; int retry_count = 0; - int old_flags = cnp->cn_flags & (LOCKPARENT | WANTPARENT); + int old_flags = cnp->cn_flags; + char mode = 2; + uint32_t *chud = CHUD(current_thread()); + + /*uint32_t crap; chud = &crap; + if(cnp->cn_nameiop == CREATE || cnp->cn_nameiop == RENAME) return EROFS;*/ *ap->a_vpp = NULLVP; @@ -229,17 +234,19 @@ union_lookup(struct vnop_lookup_args *ap) lowerdvp = dun->un_lowervp; uppervp = NULLVP; lowervp = NULLVP; - printf("in: %p RC=%d / %d\n", dun->un_uppervp, dun->un_uppervp ? dun->un_uppervp->v_iocount : -1, uppervp ? uppervp->v_iocount : -1); + //printf("in: %p RC=%d / %d\n", dun->un_uppervp, dun->un_uppervp ? dun->un_uppervp->v_iocount : -1, uppervp ? uppervp->v_iocount : -1); char slash = cnp->cn_nameptr[cnp->cn_namelen] != 0; - - const char *nameiop = "?"; - switch(cnp->cn_nameiop) { - #define A(x) case x: nameiop = #x; break; - A(LOOKUP) A(CREATE) A(DELETE) A(RENAME) - #undef A + + if(DEBUG_PRINTF) { + const char *nameiop = "?"; + switch(cnp->cn_nameiop) { + #define A(x) case x: nameiop = #x; break; + A(LOOKUP) A(CREATE) A(DELETE) A(RENAME) + #undef A + } + printf("looking up %s(%d) lp=%d wp=%d nameiop=%s upperdvp=%p lowerdvp=%p slash=%d\n", cnp->cn_nameptr, (int) cnp->cn_namelen, old_flags & LOCKPARENT, old_flags & WANTPARENT, nameiop, upperdvp, lowerdvp, (int) slash); } - printf("looking up %s(%d) lp=%d wp=%d nameiop=%s upperdvp=%p lowerdvp=%p slash=%d\n", cnp->cn_nameptr, (int) cnp->cn_namelen, old_flags & LOCKPARENT, old_flags & WANTPARENT, nameiop, upperdvp, lowerdvp, (int) slash); union_unlock(); @@ -260,6 +267,7 @@ union_lookup(struct vnop_lookup_args *ap) if(cnp->cn_consume != 0 || (!uerror && !vnode_isdir(uppervp))) { vnode_get(*ap->a_vpp = uppervp); + mode = 3; error = uerror; goto out; } @@ -286,6 +294,7 @@ union_lookup(struct vnop_lookup_args *ap) if(cnp->cn_consume != 0 || (!lerror && !vnode_isdir(lowervp))) { vnode_get(*ap->a_vpp = lowervp); + mode = 4; error = lerror; goto out; } @@ -379,26 +388,32 @@ union_lookup(struct vnop_lookup_args *ap) vnode_put(lowerdvp); // XXX lockparent? - cnp->cn_flags = (cnp->cn_flags & ~(LOCKPARENT | WANTPARENT)) | old_flags; - - if(cnp->cn_nameiop == DELETE) { - *CHUD(current_thread()) = *ap->a_vpp != NULLVP && !vnode_isdir(*ap->a_vpp); - } - + cnp->cn_flags = old_flags; + // sigh if(!slash && ((error == EJUSTRETURN && cnp->cn_nameiop == RENAME) ? - *CHUD(current_thread()) : + *chud : !((uppervp != NULLVP && vnode_isdir(uppervp)) || (lowervp != NULLVP && vnode_isdir(lowervp)))) && (cnp->cn_nameiop == CREATE || cnp->cn_nameiop == RENAME) && (error == 0 || error == EJUSTRETURN)) { - printf("mega hack %p %p %p\n", ap->a_vpp[1], upper(ap->a_vpp[1]), lower(ap->a_vpp[1])); + printf("mega hack %p %p %p chud=%x\n", ap->a_vpp[1], upper(ap->a_vpp[1]), lower(ap->a_vpp[1]), *chud); vnode_t ovp = ap->a_vpp[1]; if(ovp != NULLVP) { - vnode_t newvp = upper_or_lower(ovp); + vnode_t newvp; + if((cnp->cn_flags & ~(FSNODELOCKHELD | HASBUF | CN_VOLFSPATH | MAKEENTRY | ISSYMLINK | ISLASTCN)) == (LOCKPARENT | AUDITVNPATH2 | CN_NBMOUNTLOOK)) { // link() + switch(*chud) { + case 3: newvp = upper(ovp); break; + case 4: newvp = lower(ovp); break; + default: newvp = upper_or_lower(ovp); break; + } + if(newvp == NULLVP) goto nvm; + } else { + newvp = upper_or_lower(ovp); + } if(newvp != ovp) { // did we lock it? char locked = (void *) ovp->v_lock.opaque[0] == current_thread(); @@ -415,12 +430,18 @@ union_lookup(struct vnop_lookup_args *ap) } } + if(cnp->cn_nameiop == DELETE) { + *chud = (*ap->a_vpp != NULLVP && !vnode_isdir(*ap->a_vpp)); + } else if(cnp->cn_nameiop == LOOKUP) { + *chud = mode; + } + nvm: - printf("out: %p RC=%d / %d error=%d isdir=%d\n", dun->un_uppervp, dun->un_uppervp ? dun->un_uppervp->v_iocount : -1, uppervp ? uppervp->v_iocount : -1, error, *ap->a_vpp ? vnode_isdir(*ap->a_vpp) : -1); + //printf("out: %p RC=%d / %d error=%d isdir=%d\n", dun->un_uppervp, dun->un_uppervp ? dun->un_uppervp->v_iocount : -1, uppervp ? uppervp->v_iocount : -1, error, *ap->a_vpp ? vnode_isdir(*ap->a_vpp) : -1); return (error); } -static int +int union_create(struct vnop_create_args *ap) /* struct vnop_create_args { @@ -473,7 +494,7 @@ union_create(struct vnop_create_args *ap) STUB(union_whiteout, struct vnop_whiteout_args *, a_dvp) /* mknod can do fifos, chr, blk or whiteout entries */ -static int +int union_mknod(struct vnop_mknod_args *ap) /* struct vnop_mknod_args { @@ -515,7 +536,7 @@ union_mknod(struct vnop_mknod_args *ap) return (EROFS); } -static int +int union_open(struct vnop_open_args *ap) { stub("union_open", ap->a_vp); @@ -527,7 +548,7 @@ union_open(struct vnop_open_args *ap) return EROFS; } -static int +int union_close(struct vnop_close_args *ap) /* struct vnop_close_args { @@ -563,7 +584,7 @@ union_close(struct vnop_close_args *ap) * file permissions are given away simply because * the user caused an implicit file copy. */ -static int +int union_access(struct vnop_access_args *ap) /* struct vnop_access_args { @@ -604,7 +625,7 @@ union_access(struct vnop_access_args *ap) * We handle getattr only to change the fsid and * track object sizes */ -static int +int union_getattr(struct vnop_getattr_args *ap) /* struct vnop_getattr_args { @@ -681,7 +702,7 @@ union_getattr(struct vnop_getattr_args *ap) return (0); } -static int +int union_setattr(struct vnop_setattr_args *ap) /* struct vnop_setattr_args { @@ -732,7 +753,7 @@ union_setattr(struct vnop_setattr_args *ap) STUB(union_read, struct vnop_read_args *, a_vp) STUB(union_write, struct vnop_read_args *, a_vp) -static int +int union_ioctl(struct vnop_ioctl_args *ap) /* struct vnop_ioctl_args { @@ -750,7 +771,7 @@ union_ioctl(struct vnop_ioctl_args *ap) return (VCALL(ovp, VOFFSET(vnop_ioctl), ap)); } -static int +int union_select(struct vnop_select_args *ap) /* struct vnop_select_args { @@ -768,7 +789,7 @@ union_select(struct vnop_select_args *ap) return (VCALL(ovp, VOFFSET(vnop_select), ap)); } -static int +int union_revoke(struct vnop_revoke_args *ap) /* struct vnop_revoke_args { @@ -792,7 +813,7 @@ union_revoke(struct vnop_revoke_args *ap) STUB(union_mmap, struct vnop_mmap_args *, a_vp) STUB(union_mnomap, struct vnop_mnomap_args *, a_vp) -static int +int union_fsync(struct vnop_fsync_args *ap) /* struct vnop_fsync_args { @@ -821,7 +842,7 @@ union_fsync(struct vnop_fsync_args *ap) return (error); } -static int +int union_remove(struct vnop_remove_args *ap) /* struct vnop_remove_args { @@ -851,7 +872,7 @@ union_remove(struct vnop_remove_args *ap) } } -static int +int union_link(struct vnop_link_args *ap) /* struct vnop_link_args { @@ -874,7 +895,7 @@ union_link(struct vnop_link_args *ap) return EROFS; } -static int +int union_rename(struct vnop_rename_args *ap) /* struct vnop_rename_args { @@ -924,7 +945,7 @@ union_rename(struct vnop_rename_args *ap) return error; } -static int +int union_mkdir(struct vnop_mkdir_args *ap) /* struct vnop_mkdir_args { @@ -964,7 +985,7 @@ union_mkdir(struct vnop_mkdir_args *ap) return (EROFS); } -static int +int union_rmdir(struct vnop_rmdir_args *ap) /* struct vnop_rmdir_args { @@ -1008,7 +1029,7 @@ union_rmdir(struct vnop_rmdir_args *ap) return uerror == ENOENT ? lerror : uerror; } -static int +int union_symlink(struct vnop_symlink_args *ap) /* struct vnop_symlink_args { @@ -1043,7 +1064,7 @@ union_symlink(struct vnop_symlink_args *ap) * down the union stack. readdir(3) is responsible for * eliminating duplicate names from the returned data stream. */ -static int +int union_readdir(struct vnop_readdir_args *ap) /* struct vnop_readdir_args { @@ -1083,7 +1104,7 @@ union_readdir(struct vnop_readdir_args *ap) STUB(union_readlink, struct vnop_readlink_args *, a_vp) -static int +int union_inactive(struct vnop_inactive_args *ap) /* struct vnop_inactive_args { @@ -1128,7 +1149,7 @@ union_inactive(struct vnop_inactive_args *ap) return (0); } -static int +int union_reclaim(struct vnop_reclaim_args *ap) /* struct vnop_reclaim_args { @@ -1145,7 +1166,7 @@ union_reclaim(struct vnop_reclaim_args *ap) return (0); } -static int +int union_blockmap(struct vnop_blockmap_args *ap) /* struct vnop_blockmap_args { @@ -1168,7 +1189,7 @@ union_blockmap(struct vnop_blockmap_args *ap) return (error); } -static int +int union_pathconf(struct vnop_pathconf_args *ap) /* struct vnop_pathconf_args { @@ -1188,7 +1209,7 @@ union_pathconf(struct vnop_pathconf_args *ap) return (error); } -static int +int union_advlock(struct vnop_advlock_args *ap) /* struct vnop_advlock_args { @@ -1213,7 +1234,7 @@ union_advlock(struct vnop_advlock_args *ap) * vnode in its arguments. * This goes away with a merged VM/buffer cache. */ -static int +int union_strategy(struct vnop_strategy_args *ap) /* struct vnop_strategy_args { diff --git a/install/install.m b/install/install.m index 6ad9c6d..b6bd7e7 100644 --- a/install/install.m +++ b/install/install.m @@ -1,4 +1,6 @@ #define _log(fmt, args...) NSLog(@fmt, ##args) +#define _fail generic_fail +__attribute__((noreturn)) static void generic_fail(const char *lineno); #import #include #include @@ -24,8 +26,13 @@ static size_t written_bytes; static void (*set_progress)(float); +__attribute__((noreturn)) static void (*fatal)(NSString *); static NSMutableArray *to_load; +static void generic_fail(const char *lineno) { + fatal([NSString stringWithFormat:@"Internal error at %s", lineno]); +} + static void wrote_bytes(ssize_t bytes) { static size_t last = 0; written_bytes += bytes; @@ -39,12 +46,6 @@ static void wrote_bytes(ssize_t bytes) { } } -ssize_t my_write(int fd, const void *buf, size_t len) { - ssize_t ret = write(fd, buf, len); - if(ret > 0) wrote_bytes(ret); - return ret; -} - static void remove_files(const char *path) { if(access(path, F_OK)) return; char *argv[2], *path_; @@ -94,20 +95,7 @@ static int run(char **argv, char **envp) { return WEXITSTATUS(stat); } - - -unsigned int config_vnode_patch; - -static void qstat(const char *path) { - struct stat st; - if(lstat(path, &st)) { - _log("Could not lstat %s: %s\n", path, strerror(errno)); - } else { - _log("%s: size %d uid %d gid %d mode %04o flags %d\n", path, (int) st.st_size, (int) st.st_uid, (int) st.st_gid, (int) st.st_mode, (int) st.st_flags); - _log("again, mode is %d", (int) st.st_mode); - _log("access is %d", R_OK | W_OK | F_OK | X_OK); - } -} +static int crap; static int lzmaopen(const char *path, int oflag, int foo) { int realfd = open(path, O_RDONLY); @@ -140,6 +128,7 @@ static ssize_t lzmaread(int fd, void *buf, size_t len) { } size_t br = len - strm->avail_out; + wrote_bytes(br); return br; } @@ -154,7 +143,7 @@ static void extract(const char *fn) { _log("could not open %s: %s", fn, strerror(errno)); exit(3); } - while(!th_read(tar)) { + while(errno = 0, !th_read(tar)) { char *pathname = th_get_pathname(tar); while(*pathname == '.' || *pathname == '/') pathname++; if(USE_NULL && ( @@ -173,13 +162,20 @@ static void extract(const char *fn) { } else { chdir("/"); } - if(!access(pathname, F_OK)) { - _log("skipping %s", pathname); + if(TH_ISDIR(tar) && !access(pathname, F_OK)) { + //_log("skipping %s", pathname); continue; } - tar_extract_file(tar, pathname); + errno = 0; + //_log("extracting %s", pathname); + if(tar_extract_file(tar, pathname) && errno != EEXIST) { + _log("error extracting %s: %s", pathname, strerror(errno)); + fatal([NSString stringWithFormat:@"Error extracting bootstrap (jailbreak cancelled): %s", strerror(errno)]); + } + } + if(errno) { + fatal(@"Error extracting bootstrap (jailbreak cancelled)"); } - tar_close(tar); } @@ -290,19 +286,41 @@ static void install_starstuff() { _assert_zero(run((char *[]) {USE_NULL ? "/private/var/null/usr/bin/dpkg" : "/usr/bin/dpkg", "-i", "/tmp/saffron-jailbreak.deb", NULL}, (char *[]) {"DYLD_LIBRARY_PATH=/private/var/null/usr/lib", "PATH=/private/var/null/usr/bin:/private/var/null/usr/sbin:/usr/bin:/usr/sbin:/bin:/sbin", NULL})); } +static void maybe_mkdir(const char *dir) { + errno = 0; + if(mkdir(dir, 0755)) _assert(errno == EEXIST); +} + static void make_nulls() { - mkdir("/private/var/null", 0755); - mkdir("/private/var/null/Applications", 0755); - mkdir("/private/var/null/Library", 0755); - mkdir("/private/var/null/System", 0755); - mkdir("/private/var/null/usr", 0755); - mkdir("/private/var/null/private", 0755); - mkdir("/private/var/null/private/etc", 0755); + struct stat root, applications; + _assert_zero(stat("/", &root)); + _assert_zero(stat("/Applications/", &applications)); + // don't rename if already mounted + if(root.st_dev == applications.st_dev) { + char dest[MAXPATHLEN]; + for(int i = 0; i < 1024; i++) { + snprintf(dest, sizeof(dest), "/private/var/null.%d", i); + if(!rename("/private/var/null", dest) || errno == ENOENT) goto ok; + if(errno != EEXIST && errno != ENOTEMPTY) _assert(0); + } + _assert(0); + } + ok: + maybe_mkdir("/private/var/null"); + maybe_mkdir("/private/var/null/Applications"); + maybe_mkdir("/private/var/null/Library"); + maybe_mkdir("/private/var/null/System"); + maybe_mkdir("/private/var/null/usr"); + maybe_mkdir("/private/var/null/private"); + maybe_mkdir("/private/var/null/private/etc"); } -void do_install(void (*set_progress_)(float)) { +void do_install(void *_set_progress, void *_fatal) { + fatal = _fatal; + set_progress = _set_progress; + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - set_progress = set_progress_; + to_load = [NSMutableArray array]; chdir("/"); diff --git a/install/libtar.a b/install/libtar.a index 7ea64894612dbaddbe57c11ebfe54c3d474436af..5dd4e6563769325e2b348a7f58c51a1ae40fea6b 100644 GIT binary patch literal 39880 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 RN-T#C%i%tL4O;IP{6GBY;!pqp literal 259104 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

+gkjUdIy$TseL6A#GC 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 diff --git a/locutus/locutus.c b/locutus/locutus.c index 49afb44..b0e11e5 100644 --- a/locutus/locutus.c +++ b/locutus/locutus.c @@ -18,15 +18,10 @@ #include #include #include +#include static const float download_share = 0.50; -// and SB freezing or hanging on black -// blinking alertview of doom -// if Cydia was not actually created *or locutus crashes*, don't sit on installing forever (so we should use a socket - that would also handle the locking issue) -// but when it /doesn't/ crash, Cydia disappears -// Safari is respawning and reloading it - I think this can be avoided by having JavaScript load the pdf - //#define TINY #ifdef TINY @@ -52,6 +47,7 @@ static struct request { CFStringRef url; const char *output; CFStringRef content_type; + uint32_t adler; union { struct {}; struct { @@ -60,18 +56,19 @@ static struct request { size_t content_length; bool finished; bool got_headers; + uLong actual_adler; }; }; } requests[] = { #if 1 - {CFSTR("http://www.jailbreakme.com/saffron/_/saffron-jailbreak-%s-%s.deb"), "/tmp/saffron-jailbreak.deb", CFSTR("application/x-debian-package"), {}}, - {CFSTR("http://www.jailbreakme.com/saffron/_/freeze.tar.xz"), "/tmp/freeze.tar.xz", CFSTR("application/octet-stream"), {}}, - {CFSTR("http://www.jailbreakme.com/saffron/_/install.dylib"), "/tmp/install.dylib", CFSTR("application/octet-stream"), {}}, + {CFSTR("http://www.jailbreakme.com/saffron/_/saffron-jailbreak-%s-%s-" PACKAGE_VERSION ".deb"), "/tmp/saffron-jailbreak.deb", CFSTR("application/x-debian-package"), 0, {}}, + {CFSTR("http://www.jailbreakme.com/saffron/_/freeze.tar.xz"), "/tmp/freeze.tar.xz", CFSTR("application/octet-stream"), 0, {}}, + {CFSTR("http://www.jailbreakme.com/saffron/_/install-" INSTALLER_VERSION ".dylib"), "/tmp/install.dylib", CFSTR("application/octet-stream"), INSTALL_ADLER, {}}, #else - {CFSTR("http://a.qoid.us/omgleak/_/saffron-jailbreak-%s-%s.deb"), "/tmp/saffron-jailbreak.deb", CFSTR("application/x-debian-package"), {}}, + {CFSTR("http://a.qoid.us/saffron/saffron-jailbreak-%s-%s-" PACKAGE_VERSION ".deb"), "/tmp/saffron-jailbreak.deb", CFSTR("application/x-debian-package"), 0, {}}, //{CFSTR("http://test.saurik.com/dhowett/Cydia-4.1b1-Srk.txz"), "/tmp/freeze.tar.xz", CFSTR("text/plain"), {}}, - {CFSTR("http://a.qoid.us/omgleak/_/freeze.tar.xz"), "/tmp/freeze.tar.xz", CFSTR("application/x-tar"), {}}, - {CFSTR("http://a.qoid.us/omgleak/_/install.dylib"), "/tmp/install.dylib", CFSTR("text/plain"), {}}, + {CFSTR("http://a.qoid.us/saffron/freeze.tar.xz"), "/tmp/freeze.tar.xz", CFSTR("application/x-tar"), 0, {}}, + {CFSTR("http://a.qoid.us/saffron/install-" INSTALLER_VERSION ".dylib"), "/tmp/install.dylib", CFSTR("text/plain"), 0, {}}, #endif }, *const requests_end = requests + sizeof(requests)/sizeof(*requests); @@ -107,6 +104,8 @@ static void pause_it(CFStringRef err) { // handle an error or completion static void handle_error(struct request *r, CFStringRef err) { + downloaded_bytes -= lseek(r->out_fd, 0, SEEK_CUR); + NSLog(CFSTR("at the moment, we closed %s with %d"), r->output, (int) lseek(r->out_fd, 0, SEEK_CUR)); close(r->out_fd); r->out_fd = 0; if(err) { @@ -141,9 +140,12 @@ static void request_callback(CFReadStreamRef stream, CFStreamEventType event_typ case kCFStreamEventEndEncountered: { size_t actual_length = lseek(r->out_fd, 0, SEEK_CUR); - NSLog(CFSTR("[%@] %p, %p, %zd, %zd"), r->url, stream, r->read_stream, actual_length, r->content_length); + //NSLog(CFSTR("[%@] %p, %p, %zd, %zd"), r->url, stream, r->read_stream, actual_length, r->content_length); if(actual_length != r->content_length) { handle_error(r, CFSTR("Truncated")); + } else if(r->adler && r->adler != (uint32_t) r->actual_adler) { + NSLog(CFSTR("[%@] Got adler32 %x but expected %x"), r->url, r->actual_adler, r->adler); + handle_error(r, CFSTR("Invalid checksum")); } else { handle_error(r, NULL); } @@ -198,7 +200,7 @@ static void request_callback(CFReadStreamRef stream, CFStreamEventType event_typ if(!content_type || kCFCompareEqualTo != CFStringCompare(content_type, r->content_type, kCFCompareCaseInsensitive)) { NSLog(CFSTR("got %@, expected %@"), content_type, r->content_type); - handle_error(r, CFStringCreateWithFormat(NULL, NULL, CFSTR("Wrong Content-Type; are you on a fail Wi-Fi network?"))); + handle_error(r, CFStringCreateWithFormat(NULL, NULL, CFSTR("Wrong Content-Type- are you on a fail Wi-Fi network?"))); break; } } @@ -206,8 +208,8 @@ static void request_callback(CFReadStreamRef stream, CFStreamEventType event_typ // actually read size_t written = 0; while(CFReadStreamHasBytesAvailable(r->read_stream)) { - static char compressed[8192], uncompressed[16384]; - CFIndex idx = CFReadStreamRead(r->read_stream, (void *) compressed, sizeof(compressed)); + static char buf[8192]; + CFIndex idx = CFReadStreamRead(r->read_stream, (void *) buf, sizeof(buf)); if(idx == -1) { handle_error(r, CFSTR("Huh?")); goto end; @@ -215,7 +217,9 @@ static void request_callback(CFReadStreamRef stream, CFStreamEventType event_typ written += (size_t) idx; - _assert((CFIndex) write(r->out_fd, compressed, idx) == idx); + r->actual_adler = adler32(r->actual_adler, (void *) buf, idx); + + _assert((CFIndex) write(r->out_fd, buf, idx) == idx); } end: did_download(written); @@ -239,10 +243,10 @@ static void init_requests() { NSLog(CFSTR("[%@] sending range %@"), r->url, range); CFHTTPMessageSetHeaderFieldValue(message, CFSTR("Range"), range); CFRelease(range); - } else { - nvm: + } else if(!r->out_fd) { r->out_fd = open(/*basename*/((char *) r->output), O_WRONLY | O_CREAT | O_TRUNC, 0644); _assert(r->out_fd != -1); + r->actual_adler = adler32(0L, Z_NULL, 0); } // creating the read stream should succeed, but there might be an error later @@ -266,13 +270,18 @@ static void set_progress(float progress_) { update_state("INSTALLING_ICON_LABEL", NULL); } +static void fatal(CFStringRef err) { + update_state("INSTALLING_ICON_LABEL", err); + exit(1); +} + static void run_install() { NSLog(CFSTR("running install")); signal(SIGUSR1, SIG_IGN); set_progress(0.0); void *install = dlopen("/tmp/install.dylib", RTLD_LAZY); - void (*do_install)(void (*set_progress)(float)) = dlsym(install, "do_install"); - do_install(set_progress); + void (*do_install)(void *set_progress, void *fatal) = dlsym(install, "do_install"); + do_install(set_progress, fatal); update_state("`", NULL); exit(0); } diff --git a/locutus/locutus_server.m b/locutus/locutus_server.m index 9f3cf74..d22e302 100644 --- a/locutus/locutus_server.m +++ b/locutus/locutus_server.m @@ -10,6 +10,8 @@ #include #include #include +#include +#include static NSString *bundle_identifier; static id existing_icon; @@ -26,6 +28,7 @@ // Cancel Retry // quit pause static UIAlertView *alert_view; +static bool dont_hide_alert; static NSString *display_name, *old_display_key; static bool is_installing; static int sock; @@ -100,7 +103,8 @@ static void do_alert(NSString *title, NSString *message, NSString *cancel, NSStr } static void (^sk)() = ^{ - [alert_view dismissWithClickedButtonIndex:0 animated:YES]; + if(!dont_hide_alert) [alert_view dismissWithClickedButtonIndex:0 animated:YES]; + [alert_view setDelegate:nil]; [icon remove]; [icon release]; icon = nil; @@ -118,8 +122,7 @@ static void (^sk)() = ^{ } static void MyIcon_launch(id self, SEL sel) { - NSLog(@"%d", write(sock, "p", 1)); - NSLog(@"%s", strerror(errno)); + write(sock, "p", 1); } static BOOL MyIcon_allowsUninstall(id self, SEL sel) { @@ -170,14 +173,12 @@ static void installed() { static void *read_state(void *fp_) { FILE *fp = fp_; while(1) { - struct { - char state[128], errs[128]; - } s; float progress; - + // in a struct for block's benefit + struct { char state[128], errs[256]; } s; char buf[1024]; if(!fgets(buf, sizeof(buf), fp) || - sscanf(buf, "%128s\t%f\t%128[^;]", s.state, &progress, s.errs) != 3) { + sscanf(buf, "%128s\t%f\t%256[^\t]", s.state, &progress, s.errs) != 3) { dispatch_async(dispatch_get_main_queue(), (dispatch_block_t) sk); return NULL; } @@ -192,7 +193,14 @@ static void installed() { } if(s.errs[0] != '`') { - do_alert(@"There was a problem downloading the jailbreak files.", [NSString stringWithUTF8String:s.errs], _(@"DATA_PLAN_FAILED_TRY_LATER"), _(@"DATA_PLAN_FAILED_TRY_AGAIN")); + NSString *err = [NSString stringWithUTF8String:s.errs]; + if(!strcmp(s.state, "INSTALLING_ICON_LABEL")) { + do_alert(@"There was a problem installing the jailbreak.", err, _(@"OK"), nil); + dont_hide_alert = true; + sk(); + } else { + do_alert(@"There was a problem downloading the jailbreak files.", err, _(@"DATA_PLAN_FAILED_TRY_LATER"), _(@"DATA_PLAN_FAILED_TRY_AGAIN")); + } } NSString *display_key = [NSString stringWithCString:s.state encoding:NSUTF8StringEncoding]; @@ -271,6 +279,14 @@ static void init() { [icon_model addIcon:icon]; [icon_controller addNewIconToDesignatedLocation:icon animate:NO scrollToList:NO saveIconState:YES]; [icon_controller setIconToReveal:icon]; + + struct statfs sfs; + if(!statfs("/private/var", &sfs) && sfs.f_bavail < 20*1024*1024/sfs.f_bsize) { + do_alert(@"Can't jailbreak.", @"There is not enough free disk space. Please delete some photos or videos.", _(@"OK"), nil); + dont_hide_alert = true; + sk(); + return; + } if(existing_icon) { write(sock, "p", 1); diff --git a/make.py b/make.py index 1f29f75..94ea3f8 100755 --- a/make.py +++ b/make.py @@ -9,10 +9,13 @@ def hybrid_hasher(filename): return None fabricate.default_builder.hasher = hybrid_hasher fabricate.default_builder.deps # do this before we chdir -import sys, os, re, glob, traceback, shutil, tempfile +import sys, os, re, glob, traceback, shutil, tempfile, zlib ROOT = os.path.realpath(os.path.dirname(sys.argv[0])) +installer_version = '3' +package_version = '3' + use_null = True # configgy @@ -41,8 +44,10 @@ def set_firmware(firmware=None, lndir=False): GCC_BIN = BIN + '/gcc-4.2' GCC_BASE = [GCC_BIN, GCC_FLAGS, '-isysroot', SDK, '-F'+SDK+'/System/Library/Frameworks', '-F'+SDK+'/System/Library/PrivateFrameworks', '-I', ROOT, '-fblocks', '-mapcs-frame', '-fomit-frame-pointer'] GCC = [GCC_BASE, '-arch', ('armv7' if is_armv7 else 'armv6'), '-mthumb', '-DVERSION=0x%x' % iversion] + if 'iPad2' in device: GCC.append('-DIPAD2=1') GCC_UNIVERSAL = [GCC_BASE, '-arch', 'armv6', '-arch', 'armv7', '-mthumb'] - GCC_ARMV6 = [GCC_BASE, '-arch', 'armv6', '-mthumb'] + #GCC_ARMV6 = [GCC_BASE, '-arch', 'armv6', '-mthumb'] + GCC_ARMV6 = [GCC_BASE, '-arch', 'armv7', '-mthumb'] GCC_NATIVE = ['gcc', '-arch', 'i386', '-arch', 'x86_64', GCC_FLAGS] HEADERS = ROOT + '/headers' @@ -66,14 +71,16 @@ def chext(f, ext): def install(): goto('install') - compile_stuff(['install.m'], tmp('install.dylib'), gcc=GCC_ARMV6, cflags=['-I../headers', '-fblocks', '-DUSE_NULL=%d' % use_null], ldflags=['-framework', 'Foundation', '-framework', 'GraphicsServices', '-framework', 'MobileCoreServices', '-L.', '-ltar', '-llzma', '-dynamiclib']) + compile_stuff(['install.m'], 'install-%s.dylib' % installer_version, gcc=GCC_ARMV6, cflags=['-I../headers', '-fblocks', '-DUSE_NULL=%d' % use_null], ldflags=['-framework', 'Foundation', '-framework', 'GraphicsServices', '-framework', 'MobileCoreServices', '-L.', '-ltar', '-llzma', '-dynamiclib']) def locutus(): + install() + adler = zlib.adler32(open('install-%s.dylib' % installer_version).read()) & 0xffffffff goto('locutus') - cflags = ['-DFNO_ASSERT_MESSAGES', '-fblocks', '-Oz', '-Wno-parentheses', '-miphoneos-version-min=4.0', '-Wno-deprecated-declarations'] + cflags = ['-DFNO_ASSERT_MESSAGES', '-DPACKAGE_VERSION="%s"' % package_version, '-DINSTALLER_VERSION="%s"' % installer_version, '-fblocks', '-Oz', '-Wno-parentheses', '-miphoneos-version-min=4.0', '-Wno-deprecated-declarations'] compile_stuff(['locutus_server.m'], tmp('locutus_server.dylib'), gcc=GCC, cflags=cflags, ldflags=['-dynamiclib', '-framework', 'Foundation', '-framework', 'UIKit', '-install_name', 'X'*32]+cflags, ldid=False) run('sh', '-c', 'xxd -i "%s" | sed "s/[l_].*dylib/dylib/g" > "%s"' % (tmp('locutus_server.dylib'), tmp('locutus_server_.c'))) - compile_stuff(['locutus.c', 'inject.c', 'baton.S', tmp('locutus_server_.c')], tmp('locutus'), gcc=GCC_ARMV6, cflags=cflags, ldflags=['-lbz2', '-framework', 'CoreFoundation', '-framework', 'CFNetwork', '-framework', 'Foundation']+cflags, ldid=True, ent='ent.plist') + compile_stuff(['locutus.c', 'inject.c', 'baton.S', tmp('locutus_server_.c')], tmp('locutus'), gcc=GCC_ARMV6, cflags=cflags+['-DINSTALL_ADLER=%u' % adler], ldflags=['-lz', '-framework', 'CoreFoundation', '-framework', 'CFNetwork', '-framework', 'Foundation']+cflags, ldid=True, ent='ent.plist') build = locutus @@ -104,7 +111,7 @@ def pdf(files=None): goto('pdf') run('python', 'mkpdf.py', tmp('../dejavu/dejavu.pfb'), tmp('out.pdf')) -def compile_stuff(files, output, ent='', cflags=[], ldflags=[], strip=True, gcc=None, ldid=True, combine=False, use_tmp=True): +def compile_stuff(files, output, ent='', cflags=[], ldflags=[], strip=True, gcc=None, ldid=True, combine=False): if gcc is None: gcc = GCC objs = [] output_ = (output + '_' if strip or ldid else output) @@ -113,7 +120,7 @@ def compile_stuff(files, output, ent='', cflags=[], ldflags=[], strip=True, gcc= else: for inp in files: obj = chext(os.path.basename(inp), '.o') - if use_tmp: obj = tmp(obj) + if BUILD_ROOT in output: obj = tmp(obj) objs.append(obj) if obj == inp: continue run(gcc, '-c', '-o', obj, inp, cflags) @@ -143,7 +150,7 @@ def fs(): goto('fs') crap = [GCC, '-dynamiclib', '-g3', '-fwhole-program', '-combine', '-nostdinc', '-nodefaultlibs', '-lgcc', '-Wno-error', '-Wno-parentheses', '-Wno-format', '-I.', '-Ixnu', '-Ixnu/bsd', '-Ixnu/libkern', '-Ixnu/osfmk', '-Ixnu/bsd/i386', '-Ixnu/bsd/sys', '-Ixnu/EXTERNAL_HEADERS', '-Ixnu/osfmk/libsa', '-D__i386__', '-DKERNEL', '-DKERNEL_PRIVATE', '-DBSD_KERNEL_PRIVATE', '-D__APPLE_API_PRIVATE', '-DXNU_KERNEL_PRIVATE', '-flat_namespace', '-undefined', 'dynamic_lookup', '-fno-builtin-printf', '-fno-builtin-log', '-DNULLFS_DIAGNOSTIC', '-dead_strip'] #run(*(crap + ['-o', tmp('nullfs.dylib'), 'kpi_vfs.c', 'null/null_subr.c', 'null/null_vfsops.c', 'null/null_vnops.c'])) - run(*(crap + ['-o', tmp('union.dylib'), 'kpi_vfs.c', 'union/union_subr.c', 'union/union_vfsops.c', 'union/union_vnops.c'])) + run(*(crap + ['-o', tmp('union.dylib'), 'kpi_vfs.c', 'union/union_subr.c', 'union/union_vfsops.c', 'union/union_vnops.c', 'union/splice.c'])) def mroib(): goto('mroib') @@ -163,22 +170,35 @@ def dejavu(files=None): def white(): make('data', 'universal') make('white', 'universal', 'universal', 'universal/white_loader') - make('data', 'armv6') + #make('data', 'armv6') + make('data', 'armv7') goto('white') - run_multiple([GCC_ARMV6, '-o', 'white_loader', 'white_loader.c', '../data/armv6/libdata.a', '-DMINIMAL', '-Wno-parentheses'], + run_multiple([GCC_ARMV6, '-o', 'white_loader', 'white_loader.c', '../data/armv7/libdata.a', '-DMINIMAL', '-Wno-parentheses'], ['strip', '-ur', 'white_loader'], ['ldid', '-Sent.plist', 'white_loader']) +#def humanify_device(device): +# return { +# 'iPhone1,1': 'iPhone', +# 'iPhone1,2': 'iPhone 3G', +# 'iPhone2,1': 'iPhone 3GS', +# 'iPhone3,1': 'iPhone 4 GSM', +# 'iPhone3,3': 'iPhone 4 CDMA', +# 'iPod1,1 +# }[device] + def starstuff(): fs() white() untether() goto('starstuff') - compile_stuff(['mount_nulls.c'], 'mount_nulls', ldid=True, gcc=GCC_ARMV6, use_tmp=False, cflags='-DUSE_NULL=%d' % use_null) + compile_stuff(['mount_nulls.c'], 'mount_nulls', ldid=True, gcc=GCC_ARMV6, cflags='-DUSE_NULL=%d' % use_null) if use_null: run('../white/universal/white_loader', '-k', BS+'/kern', '-p', tmp('../fs/union.dylib'), tmp('union_prelink.dylib')) package = 'saffron-jailbreak-%s-%s' % (device, build_num) - run('bash', 'build-archive.sh', tmp('.'), package, package.replace(',', '.').lower(), '%d' % use_null) + package_name = '%s %s JailbreakMe 3.0' % (build_num, device) + run('bash', 'build-archive.sh', tmp('.'), package, package.replace(',', '.').lower(), '%d' % use_null, package_version, package_name) + def stage(string=None): all_devices = ['iPhone3,1', 'iPhone3,3', 'iPod4,1', 'iPad2,1', 'iPad2,2', 'iPad2,3', 'iPhone2,1', 'iPod3,1', 'iPad1,1', 'iPhone1,2', 'iPod2,1'] @@ -195,7 +215,7 @@ def stage(string=None): firmwares = glob.glob(basetype + '*_' + version) eligible = [] - outpdf = '%s/pdf/%s.pdf' % (ROOT, string) + outpdf = '%s/pdf/%s-%s.pdf' % (ROOT, string, installer_version) for firmware in firmwares: device = firmware[:firmware.find('_')] if device in all_devices: diff --git a/starstuff/build-archive.sh b/starstuff/build-archive.sh index f3285df..1fa0a33 100644 --- a/starstuff/build-archive.sh +++ b/starstuff/build-archive.sh @@ -1,7 +1,7 @@ #!/bin/sh set -xe root="$1/root" -mkdir -p "$root"/{DEBIAN,boot,private/var/null} +mkdir -p "$root"/{DEBIAN,boot,private/var/null{,/Applications,/Library,/System,/usr,/private/etc}} if [ "$4" = "1" ]; then cp -a "$1"/union_prelink.dylib "$root"/boot/union_prelink.dylib fi @@ -10,19 +10,27 @@ cp -a ../white/white_loader "$root"/boot/white_loader cp -a mount_nulls "$root"/boot/mount_nulls cat >"$root"/DEBIAN/control << EOF Package: $3 -Essential: yes +Name: $6 Priority: required Maintainer: comex Section: System Architecture: iphoneos-arm -Version: 1 -Description: Untether and other files +Version: $5 +Tag: role::cydia +Description: support files for JailbreakMe 3.0 +Depiction: http://cydia.saurik.com/info/saffron-jailbreak/ EOF # note that the below script may be running with stuff only in union mounts... cat >"$root"/DEBIAN/extrainst_ << EOF #!/bin/sh -ln -ns /boot/untether /usr/libexec/dirhelper 2>/dev/null -exec /boot/mount_nulls +if [ "\$1" = install -o "\$1" = upgrade ]; then + if [ ! -e /usr/libexec/dirhelper ]; then + ln -ns /boot/untether /usr/libexec/dirhelper || exit 1 + fi + /boot/mount_nulls >&/dev/null +fi +sync; sync +exit 0 EOF chmod 755 "$root"/DEBIAN/extrainst_ -./fauxsu.sh dpkg-deb -b -z9 "$root" "$2".deb +./fauxsu.sh dpkg-deb -b -z9 "$root" "$2"-"$5".deb