builtin: fix leaks in `os.execute()` and `[]string{} == []string{}`
parent
d098a3caca
commit
7f91b75cbc
|
@ -685,8 +685,12 @@ pub fn (a1 []string) eq(a2 []string) bool {
|
||||||
if a1.len != a2.len {
|
if a1.len != a2.len {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
size_of_string := int(sizeof(string))
|
||||||
for i in 0 .. a1.len {
|
for i in 0 .. a1.len {
|
||||||
if a1[i] != a2[i] {
|
offset := i * size_of_string
|
||||||
|
s1 := &string(unsafe { byteptr(a1.data) + offset })
|
||||||
|
s2 := &string(unsafe { byteptr(a2.data) + offset })
|
||||||
|
if *s1 != *s2 {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -157,6 +157,7 @@ pub fn mkdir(path string) ?bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
// execute starts the specified command, waits for it to complete, and returns its output.
|
// execute starts the specified command, waits for it to complete, and returns its output.
|
||||||
|
[manualfree]
|
||||||
pub fn execute(cmd string) Result {
|
pub fn execute(cmd string) Result {
|
||||||
// if cmd.contains(';') || cmd.contains('&&') || cmd.contains('||') || cmd.contains('\n') {
|
// if cmd.contains(';') || cmd.contains('&&') || cmd.contains('||') || cmd.contains('\n') {
|
||||||
// return Result{ exit_code: -1, output: ';, &&, || and \\n are not allowed in shell commands' }
|
// return Result{ exit_code: -1, output: ';, &&, || and \\n are not allowed in shell commands' }
|
||||||
|
@ -171,6 +172,9 @@ pub fn execute(cmd string) Result {
|
||||||
}
|
}
|
||||||
buf := [4096]byte{}
|
buf := [4096]byte{}
|
||||||
mut res := strings.new_builder(1024)
|
mut res := strings.new_builder(1024)
|
||||||
|
defer {
|
||||||
|
unsafe { res.free() }
|
||||||
|
}
|
||||||
unsafe {
|
unsafe {
|
||||||
bufbp := &buf[0]
|
bufbp := &buf[0]
|
||||||
for C.fgets(charptr(bufbp), 4096, f) != 0 {
|
for C.fgets(charptr(bufbp), 4096, f) != 0 {
|
||||||
|
@ -178,7 +182,6 @@ pub fn execute(cmd string) Result {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
soutput := res.str()
|
soutput := res.str()
|
||||||
// res.free()
|
|
||||||
exit_code := vpclose(f)
|
exit_code := vpclose(f)
|
||||||
return Result{
|
return Result{
|
||||||
exit_code: exit_code
|
exit_code: exit_code
|
||||||
|
@ -196,19 +199,25 @@ pub:
|
||||||
redirect_stdout bool
|
redirect_stdout bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// pub fn command(cmd Command) Command {
|
[manualfree]
|
||||||
//}
|
|
||||||
pub fn (mut c Command) start() ? {
|
pub fn (mut c Command) start() ? {
|
||||||
pcmd := '$c.path 2>&1'
|
pcmd := c.path + ' 2>&1'
|
||||||
|
defer {
|
||||||
|
unsafe { pcmd.free() }
|
||||||
|
}
|
||||||
c.f = vpopen(pcmd)
|
c.f = vpopen(pcmd)
|
||||||
if isnil(c.f) {
|
if isnil(c.f) {
|
||||||
return error('exec("$c.path") failed')
|
return error('exec("$c.path") failed')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[manualfree]
|
||||||
pub fn (mut c Command) read_line() string {
|
pub fn (mut c Command) read_line() string {
|
||||||
buf := [4096]byte{}
|
buf := [4096]byte{}
|
||||||
mut res := strings.new_builder(1024)
|
mut res := strings.new_builder(1024)
|
||||||
|
defer {
|
||||||
|
unsafe { res.free() }
|
||||||
|
}
|
||||||
unsafe {
|
unsafe {
|
||||||
bufbp := &buf[0]
|
bufbp := &buf[0]
|
||||||
for C.fgets(charptr(bufbp), 4096, c.f) != 0 {
|
for C.fgets(charptr(bufbp), 4096, c.f) != 0 {
|
||||||
|
@ -216,14 +225,16 @@ pub fn (mut c Command) read_line() string {
|
||||||
for i in 0 .. len {
|
for i in 0 .. len {
|
||||||
if bufbp[i] == `\n` {
|
if bufbp[i] == `\n` {
|
||||||
res.write_ptr(bufbp, i)
|
res.write_ptr(bufbp, i)
|
||||||
return res.str()
|
final := res.str()
|
||||||
|
return final
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
res.write_ptr(bufbp, len)
|
res.write_ptr(bufbp, len)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
c.eof = true
|
c.eof = true
|
||||||
return res.str()
|
final := res.str()
|
||||||
|
return final
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn (c &Command) close() ? {
|
pub fn (c &Command) close() ? {
|
||||||
|
|
Loading…
Reference in New Issue