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 {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	size_of_string := int(sizeof(string))
 | 
			
		||||
	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
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -157,6 +157,7 @@ pub fn mkdir(path string) ?bool {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// execute starts the specified command, waits for it to complete, and returns its output.
 | 
			
		||||
[manualfree]
 | 
			
		||||
pub fn execute(cmd string) Result {
 | 
			
		||||
	// if cmd.contains(';') || cmd.contains('&&') || cmd.contains('||') || cmd.contains('\n') {
 | 
			
		||||
	// 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{}
 | 
			
		||||
	mut res := strings.new_builder(1024)
 | 
			
		||||
	defer {
 | 
			
		||||
		unsafe { res.free() }
 | 
			
		||||
	}
 | 
			
		||||
	unsafe {
 | 
			
		||||
		bufbp := &buf[0]
 | 
			
		||||
		for C.fgets(charptr(bufbp), 4096, f) != 0 {
 | 
			
		||||
| 
						 | 
				
			
			@ -178,7 +182,6 @@ pub fn execute(cmd string) Result {
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
	soutput := res.str()
 | 
			
		||||
	// res.free()
 | 
			
		||||
	exit_code := vpclose(f)
 | 
			
		||||
	return Result{
 | 
			
		||||
		exit_code: exit_code
 | 
			
		||||
| 
						 | 
				
			
			@ -196,19 +199,25 @@ pub:
 | 
			
		|||
	redirect_stdout bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// pub fn command(cmd Command) Command {
 | 
			
		||||
//}
 | 
			
		||||
[manualfree]
 | 
			
		||||
pub fn (mut c Command) start() ? {
 | 
			
		||||
	pcmd := '$c.path 2>&1'
 | 
			
		||||
	pcmd := c.path + ' 2>&1'
 | 
			
		||||
	defer {
 | 
			
		||||
		unsafe { pcmd.free() }
 | 
			
		||||
	}
 | 
			
		||||
	c.f = vpopen(pcmd)
 | 
			
		||||
	if isnil(c.f) {
 | 
			
		||||
		return error('exec("$c.path") failed')
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[manualfree]
 | 
			
		||||
pub fn (mut c Command) read_line() string {
 | 
			
		||||
	buf := [4096]byte{}
 | 
			
		||||
	mut res := strings.new_builder(1024)
 | 
			
		||||
	defer {
 | 
			
		||||
		unsafe { res.free() }
 | 
			
		||||
	}
 | 
			
		||||
	unsafe {
 | 
			
		||||
		bufbp := &buf[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 {
 | 
			
		||||
				if bufbp[i] == `\n` {
 | 
			
		||||
					res.write_ptr(bufbp, i)
 | 
			
		||||
					return res.str()
 | 
			
		||||
					final := res.str()
 | 
			
		||||
					return final
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			res.write_ptr(bufbp, len)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	c.eof = true
 | 
			
		||||
	return res.str()
 | 
			
		||||
	final := res.str()
 | 
			
		||||
	return final
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn (c &Command) close() ? {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue