Skip to content

Instantly share code, notes, and snippets.

@PsychoTea
Created April 17, 2019 02:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save PsychoTea/60d16aa65f4608f1e30b03fabbec82a7 to your computer and use it in GitHub Desktop.
Save PsychoTea/60d16aa65f4608f1e30b03fabbec82a7 to your computer and use it in GitHub Desktop.
signed __int64 __fastcall apfs_snapshot_rename_raw(rename_call_struct *args)
{
void *v_mount; // x0
__int64 fs_private; // x19
snap_info_args_struct *oldsnap_info; // x8
__int64 oldname_len; // x20
unsigned __int8 *oldname; // x21
snap_info_args_struct *newsnap_info; // x8
unsigned __int64 namelen; // x22
unsigned __int8 *newname; // x23
int v10; // w8
int v11; // w9
signed __int64 v13; // x10
char *v14; // x11
char *v15; // x12
char v16; // t1
char v17; // t1
__int64 ret; // x0 MAPDST
void *snap_vnode; // x25
signed int a3; // [xsp+44h] [xbp-6Ch]
__int64 snap_data_out; // [xsp+48h] [xbp-68h]
__int64 result; // [xsp+50h] [xbp-60h]
__int64 fsnode; // [xsp+58h] [xbp-58h] MAPDST
__int64 v29; // [xsp+60h] [xbp-50h]
__int64 snap_xid; // [xsp+68h] [xbp-48h]
v_mount = vnode_mount_stub(args->vnode);
fs_private = vfs_fsprivate(v_mount);
v29 = 0LL;
result = 0LL;
fsnode = 0LL;
snap_data_out = 0LL;
if ( *(*(fs_private + 0xB8) + 0x11CLL)
|| *(vnode_fsnode_stub(args->vnode) + 8)
|| *vnode_fsnode_stub(args->vnode) != 1
|| *(vnode_fsnode_stub(args->fvp) + 8)
|| *vnode_fsnode_stub(args->fvp) != 1 )
{
return 1LL;
}
oldsnap_info = args->oldsnap_info;
oldname_len = oldsnap_info->oldname_len;
oldname = oldsnap_info->oldname_buf;
newsnap_info = args->newsnap_info;
namelen = newsnap_info->oldname_len;
newname = newsnap_info->oldname_buf;
v10 = *oldname;
if ( v10 == 46 && (oldname_len == 1 || oldname_len == 2 && oldname[1] == 46) )
return 22LL;
v11 = *newname;
if ( v11 == 46 && (namelen == 1 || namelen == 2 && newname[1] == 46) )
return 22LL;
if ( namelen > 255 )
return 63LL;
if ( oldname_len == namelen )
{
if ( oldname_len )
{
v13 = 1 - oldname_len;
v14 = (newname + 1);
v15 = (oldname + 1);
while ( v10 == v11 )
{
if ( !v11 || !v13 )
return 22LL;
v16 = *v15++;
LOBYTE(v10) = v16;
v17 = *v14++;
LOBYTE(v11) = v17;
++v13;
}
goto LABEL_23;
}
return 22LL;
}
LABEL_23:
if ( apfs_find_snap_from_name(newname, namelen, 0LL, 0LL) & 1 )
return 1LL;
sub_FFFFFFF006AA1CDC(*(fs_private + 7872));
++*(fs_private + 7864);
sub_FFFFFFF006AA1CF4(*(fs_private + 7872));
sub_FFFFFFF006AA1D18(*(fs_private + 7840));
sub_FFFFFFF006A28870(fs_private);
sub_FFFFFFF006AA1D30(*(fs_private + 7848));
ret = sub_FFFFFFF006A1E6D8(fs_private, newname, namelen, &result);
if ( ret != 2 )
{
if ( !ret )
{
sub_FFFFFFF006A5ED28(result);
ret = 17LL;
}
goto LABEL_47;
}
if ( apfs_find_snap_from_name(oldname, oldname_len, &a3, &snap_xid) )
{
if ( a3 != 1 )
{
ret = 2LL;
goto LABEL_47;
}
ret = sub_FFFFFFF006A1E5A0(fs_private, snap_xid, &fsnode, &snap_data_out);
}
else
{
ret = apfs_lookup_snap(fs_private, oldname, oldname_len, &fsnode, &snap_data_out);
}
if ( ret )
{
LABEL_35:
if ( fsnode )
sub_FFFFFFF006A5ED28(fsnode);
goto LABEL_47;
}
snap_vnode = apfs_jhash_getvnode(fs_private, *(fs_private + 0x1B8), *(fsnode + 8), 1LL, 0LL, 0LL);
if ( snap_vnode && (sub_FFFFFFF006A5ED28(fsnode), fsnode = vnode_fsnode_stub(snap_vnode), *(fsnode + 49) & 0x40) )
{
ret = 1LL;
}
else
{
v29 = 0LL;
ret = fs_tx_enter_recursively(fs_private, 1LL, 4LL, 0LL, &v29);
if ( !ret )
{
ret = fs_rename_snapshot(fs_private, fsnode, snap_data_out, newname, namelen, v29);
if ( ret )
vprintf_sth_stub(aSDFsRenameSnap, aApfsSnapVnopRe_0, 898LL, oldname, oldname_len, newname, namelen, ret);
}
if ( !snap_vnode )
goto LABEL_35;
}
vnode_put_stub(snap_vnode);
LABEL_47:
if ( snap_data_out )
sub_FFFFFFF006A5ED28(snap_data_out);
if ( v29 )
{
sub_FFFFFFF006A66B50(fs_private, 1LL, 4LL, 0LL);
v29 = 0LL;
}
sub_FFFFFFF006AA1D54(*(fs_private + 7840));
sub_FFFFFFF006AA1D60(*(fs_private + 7848));
return ret;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment