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