summaryrefslogtreecommitdiff
path: root/std/fs.zc
diff options
context:
space:
mode:
authorZuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian>2026-01-19 22:48:04 +0000
committerZuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian>2026-01-19 22:48:04 +0000
commit23065ddf6ed0b3762dda5f5059888eb52b5c2415 (patch)
treeaec187b8211203081e8dacb07a5ce325eb348cc4 /std/fs.zc
parent3af5dcf34d705cc52c1ffe5b85c2a90b5104e4c9 (diff)
Fixes related to memory safety. I will work more on this related to the stdlib.
Diffstat (limited to 'std/fs.zc')
-rw-r--r--std/fs.zc18
1 files changed, 14 insertions, 4 deletions
diff --git a/std/fs.zc b/std/fs.zc
index 4223054..d35a1fa 100644
--- a/std/fs.zc
+++ b/std/fs.zc
@@ -50,7 +50,7 @@ struct Metadata {
is_file: bool;
}
-@derive(Eq)
+// @derive(Eq) - Removed to avoid double-free on String field
struct DirEntry {
name: String;
is_dir: bool;
@@ -87,7 +87,11 @@ impl File {
var s = String::new(buffer);
free(buffer);
- return Result<String>::Ok(s);
+ var res = Result<String>::Ok(s);
+ s.forget();
+ var ret = res;
+ res.forget();
+ return ret;
}
fn read_all(path: char*) -> Result<String> {
@@ -97,7 +101,9 @@ impl File {
var f: File = res.unwrap();
var s_res = f.read_to_string();
f.close();
- return s_res;
+ var ret = s_res;
+ s_res.forget();
+ return ret;
}
fn write_string(self, content: char*) -> Result<bool> {
@@ -157,6 +163,10 @@ impl File {
free(name_buf);
closedir(dir);
- return Result< Vec<DirEntry> >::Ok(entries);
+ var res = Result< Vec<DirEntry> >::Ok(entries);
+ entries.forget();
+ var ret = res;
+ res.forget();
+ return ret;
}
}