Skip to content

Commit a9f8792

Browse files
author
ac2pic
committed
Bug fixes and improves
1 parent 0926530 commit a9f8792

File tree

5 files changed

+133
-25
lines changed

5 files changed

+133
-25
lines changed

config.nims

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import os
33
switch "o", "cecie.elf"
44
switch "mm", "orc"
55
switch "nimcache", "./cache"
6-
# switch "threads", "off"
6+
switch "threads", "off"
77

88
proc getContentId: string =
99
let servId = getEnv("app_SERVICE_ID")

src/commands.nim

+20-11
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ type ServerResponse = object
3131
type SaveListEntry = object
3232
kind: PathComponent
3333
path: string
34+
size: Off
3435
mode: Mode
3536
uid: Uid
3637
gid: Gid
@@ -70,7 +71,7 @@ proc setupCredentials() =
7071
# Run as root
7172
var cred = get_cred()
7273
cred.sonyCred = cred.sonyCred or uint64(0x40_00_00_00_00_00_00_00)
73-
cred.sceProcType = uint64(0x3800000000000010)
74+
cred.sceProcType = uint64(0x3801000000000013)
7475
discard set_cred(cred)
7576
discard setuid(0)
7677

@@ -192,6 +193,11 @@ proc updateSave(cmd: ClientRequest, client: AsyncSocket, mountId: string) {.asyn
192193
respondWithError(client, "E:MOUNT_FAILED-" & handle.toHex(8))
193194
else:
194195
for (kind, relativePath) in getRequiredFiles(cmd.sourceFolder, cmd.selectOnly):
196+
if relativePath.startsWith("sce_sys") or relativePath == "memory.dat":
197+
discard setuid(0)
198+
else:
199+
discard setuid(1)
200+
195201
let targetPath = joinPath(mntFolder, relativePath)
196202
if kind == pcDir:
197203
discard mkdir(targetPath.cstring, 0o777)
@@ -206,6 +212,7 @@ proc updateSave(cmd: ClientRequest, client: AsyncSocket, mountId: string) {.asyn
206212
respondWithError(client, "E:COPY_FAILED")
207213
failed = true
208214
break
215+
discard setuid(0)
209216
discard umountSave(mntFolder, handle, false)
210217
discard rmdir(mntFolder.cstring)
211218
if failed:
@@ -226,32 +233,34 @@ proc listSaveFiles(cmd: ClientRequest, client: AsyncSocket, mountId: string) {.a
226233
discard mkdir(mntFolder.cstring, 0o777)
227234

228235
let (errPath, handle) = mountSave(SAVE_DIRECTORY, cmd.listTargetSaveName, mntFolder)
236+
var listEntries: seq[SaveListEntry] = newSeq[SaveListEntry]()
229237
var failed = errPath != 0
230-
if errPath != 0:
238+
239+
if failed:
231240
respondWithError(client, "E:MOUNT_FAILED-" & handle.toHex(8))
232241
else:
233-
var listEntries: seq[SaveListEntry] = newSeq[SaveListEntry]()
234242
for (kind, relativePath) in getRequiredFiles(mntFolder, @[]):
235243
var s : Stat
236244
if stat((mntFolder / relativePath).cstring, s) == -1:
237245
respondWithError(client, "E:STAT_FAILED-" & errno.toHex(8))
246+
failed = true
238247
break
239-
listEntries.add SaveListEntry(kind: kind, path: relativePath, mode: s.st_mode, uid: s.st_uid, gid: s.st_gid)
240-
respondWithJson(client, %listEntries)
248+
listEntries.add SaveListEntry(kind: kind, path: relativePath, size: s.st_size, mode: s.st_mode, uid: s.st_uid, gid: s.st_gid)
241249
discard umountSave(mntFolder, handle, false)
242250
discard rmdir(mntFolder.cstring)
243-
if failed:
244-
exitnow(-1)
245-
else:
246-
exitnow(0)
251+
if not failed:
252+
respondWithJson(client, %listEntries)
253+
# Should not do a srOk response since that's redundant
254+
exitnow(-1)
247255

248256
type RequestHandler = proc (cmd: ClientRequest, client: AsyncSocket, mountId: string) {.async.}
249257
var cmds : array[ClientRequestType, RequestHandler]
250258
cmds[rtDumpSave] = dumpSave
251259
cmds[rtUpdateSave] = updateSave
252260
cmds[rtListSaveFiles] = listSaveFiles
253-
var slot: int
254-
var slotTotal: int
261+
var slot: uint
262+
var slotTotal: uint32
263+
255264
proc handleForkCmds(client: AsyncSocket, cmd: ClientRequest) {.async.} =
256265
inc slot
257266
# No matter who mounts

src/main.nim

+2-4
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import "./savedata"
99
import "./utils"
1010
import "./commands"
1111
import "./requests"
12+
1213
import libjbc
1314
import posix
1415
{.passc: "-fstack-protector".}
@@ -31,7 +32,7 @@ proc setup() =
3132
echo stat("/rootdev/sbl_srv", s)
3233
echo sys_mknod("/dev/sbl_srv", Mode(S_IFCHR or 0o777), s.st_dev)
3334
discard sudo_unmount("rootdev")
34-
35+
3536
# Get max keyset that can be decrypted
3637
discard getMaxKeySet()
3738
var old_cred = get_cred()
@@ -42,13 +43,10 @@ cred.sonyCred = cred.sonyCred or uint64(0x40_00_00_00_00_00_00_00)
4243
cred.sceProcType = uint64(0x3801000000000013)
4344
discard set_cred(cred)
4445
discard setuid(0)
45-
46-
4746
setup()
4847
discard set_cred(old_cred)
4948

5049

51-
5250
proc handleClient(clientContext : tuple[address: string, client: AsyncSocket]) {.async.} =
5351
# Wait for message
5452
# let address = clientContext.address

src/savedata.nim

+15-9
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ var sceFsInitCreatePfsSaveDataOpt: proc(opt: ptr CreatePfsSaveDataOpt) : cint {.
1818
var sceFsCreatePfsSaveDataImage : proc(opt: ptr CreatePfsSaveDataOpt, volumePath: cstring, idk:cint, volumeSize: culonglong, decryptSealedKey : array[32,byte]) : cint {.cdecl.}
1919

2020
type MountSaveDataOpt = object
21-
idk: bool
21+
readOnly: bool
2222
budgetid: cstring
2323

2424
var sceFsInitMountSaveDataOpt: proc(opt: ptr MountSaveDataOpt) : cint {.cdecl.}
@@ -103,20 +103,25 @@ proc createSave*(folder: string, saveName: string, blocks: cint) : cint =
103103
discard close(fd);
104104
return 0
105105

106-
proc mountSave*(folder: string, saveName: string, mountPath: string) : tuple[path: cint, error : cint] =
106+
proc decryptSealedKeyAtPath*(keyPath: string, decryptedSealedKey: var array[32,byte]) : cint =
107107
var sealedKey : array[96, byte]
108-
var volumeKeyPath : string = joinPath(folder, saveName & ".bin")
109-
var volumePath : string = joinPath(folder, saveName)
110-
var fd = sys_open(volumeKeyPath.cstring, O_RDONLY, 0)
108+
var fd = sys_open(keyPath.cstring, O_RDONLY, 0)
111109
if fd == -1:
112-
return (-1, errno)
110+
return -1
113111
discard read(fd,sealedKey.addr, sealedKey.len)
114112
discard close(fd)
115-
116-
var decryptedSealedKey: array[32, byte]
117113
var ret = decryptSealedKey(sealedKey, decryptedSealedKey)
118114
if ret == -1:
119-
return (-2, errno)
115+
return -2
116+
return 0
117+
118+
proc mountSave*(folder: string, saveName: string, mountPath: string) : tuple[path: cint, error : cint] =
119+
var volumeKeyPath : string = joinPath(folder, saveName & ".bin")
120+
var volumePath : string = joinPath(folder, saveName)
121+
var decryptedSealedKey: array[32,byte]
122+
var ret = decryptSealedKeyAtPath(volumeKeyPath, decryptedSealedKey)
123+
if ret < 0:
124+
return (ret, errno)
120125
var opt : MountSaveDataOpt
121126
discard sceFsInitMountSaveDataOpt(opt.addr)
122127
var bid: string = "system"
@@ -126,6 +131,7 @@ proc mountSave*(folder: string, saveName: string, mountPath: string) : tuple[pat
126131
return (-3, ret)
127132
return (0, 0)
128133

134+
129135
proc umountSave*(mountPath: string, handle: cint, ignoreErrors: bool) : cint =
130136
var opt: UmountSaveDataOpt
131137
discard sceFsInitUmountSaveDataOpt(opt.addr)

src/syscalls.nim

+95
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,57 @@ proc sys_open*(path: cstring, flags: cint, mode: cint = 0): cint {.cdecl, export
2020
"""
2121
toCError(result, err)
2222

23+
proc sys_read*(fd: cint, buffer: pointer, sz: int): cint {.cdecl, exportc.} =
24+
var err: bool
25+
asm """
26+
".intel_syntax;"
27+
"mov rax, 3;"
28+
"syscall;"
29+
: "=a"(`result`), "=@ccc"(`err`)
30+
"""
31+
toCError(result, err)
32+
33+
proc sys_pread*(fd: cint, buffer: pointer, sz: int, offset: Off): cint {.cdecl, exportc.} =
34+
var err: bool
35+
asm """
36+
".intel_syntax;"
37+
"mov rax, 475;"
38+
"mov r10, rcx;"
39+
"syscall;"
40+
: "=a"(`result`), "=@ccc"(`err`)
41+
"""
42+
toCError(result, err)
43+
44+
proc sys_write*(fd: cint, buffer: pointer, sz: int): cint {.cdecl, exportc.} =
45+
var err: bool
46+
asm """
47+
".intel_syntax;"
48+
"mov rax, 4;"
49+
"syscall;"
50+
: "=a"(`result`), "=@ccc"(`err`)
51+
"""
52+
toCError(result, err)
53+
54+
proc sys_pwrite*(fd: cint, buffer: pointer, sz: int, offset: Off): cint {.cdecl, exportc.} =
55+
var err: bool
56+
asm """
57+
".intel_syntax;"
58+
"mov rax, 476;"
59+
"mov r10, rcx;"
60+
"syscall;"
61+
: "=a"(`result`), "=@ccc"(`err`)
62+
"""
63+
toCError(result, err)
64+
65+
proc sys_close*(fd: cint): cint {.cdecl, exportc.} =
66+
var err: bool
67+
asm """
68+
".intel_syntax;"
69+
"mov rax, 6;"
70+
"syscall;"
71+
: "=a"(`result`), "=@ccc"(`err`)
72+
"""
73+
toCError(result, err)
2374

2475
proc sys_symlink*(src: cstring, dest: cstring): cint {.cdecl, exportc.} =
2576
var err: bool
@@ -31,6 +82,16 @@ proc sys_symlink*(src: cstring, dest: cstring): cint {.cdecl, exportc.} =
3182
"""
3283
toCError(result, err)
3384

85+
proc sys_unmount*(dir: cstring, flags: cint): cint {.cdecl, exportc.} =
86+
var err: bool
87+
asm """
88+
".intel_syntax;"
89+
"mov rax, 22;"
90+
"syscall;"
91+
: "=a"(`result`), "=@ccc"(`err`)
92+
"""
93+
toCError(result, err)
94+
3495
proc sys_link*(src: cstring, dest: cstring): cint {.cdecl, exportc.} =
3596
var err: bool
3697
asm """
@@ -40,6 +101,17 @@ proc sys_link*(src: cstring, dest: cstring): cint {.cdecl, exportc.} =
40101
: "=a"(`result`), "=@ccc"(`err`)
41102
"""
42103
toCError(result, err)
104+
105+
proc sys_rename*(src: cstring, dest: cstring): cint {.cdecl, exportc.} =
106+
var err: bool
107+
asm """
108+
".intel_syntax;"
109+
"mov rax, 128;"
110+
"syscall;"
111+
: "=a"(`result`), "=@ccc"(`err`)
112+
"""
113+
toCError(result, err)
114+
43115
proc sys_chroot*(newRoot: cstring): cint {.cdecl, exportc.} =
44116
var err: bool
45117
asm """
@@ -60,6 +132,7 @@ proc sys_mknod*(path: cstring, mode: Mode, dev: Dev): cint {.cdecl, exportc.} =
60132
: "=a"(`result`), "=@ccc"(`err`)
61133
"""
62134
toCError(result, err)
135+
63136
proc sys_fork*(): cint {.cdecl, exportc.} =
64137
var err: bool
65138
asm """
@@ -68,4 +141,26 @@ proc sys_fork*(): cint {.cdecl, exportc.} =
68141
"syscall;"
69142
: "=a"(`result`), "=@ccc"(`err`)
70143
"""
144+
145+
proc sys_get_authinfo*(pid : Pid, authinfo: pointer) : cint {.cdecl, exportc.} =
146+
var err: bool
147+
asm """
148+
".intel_syntax;"
149+
"mov rax, 587;"
150+
"syscall;"
151+
: "=a"(`result`), "=@ccc"(`err`)
152+
"""
153+
proc sys_sysctl*(name: var cint, namelen: cuint,
154+
oldp: pointer, oldlenp: var csize_t,
155+
newp: pointer, newlen: csize_t): cint {.cdecl, exportc.} =
156+
var err: bool
157+
asm """
158+
".intel_syntax;"
159+
"mov rax, 202;"
160+
"mov r10, rcx;"
161+
"syscall;"
162+
: "=a"(`result`), "=@ccc"(`err`)
163+
"""
164+
toCError(result, err)
165+
71166
{.pop.}

0 commit comments

Comments
 (0)