Skip to content

Commit 3ca900c

Browse files
committed
修复潜在的内存泄漏与错误的设备句柄注册.
1 parent 5040478 commit 3ca900c

File tree

2 files changed

+9
-1
lines changed

2 files changed

+9
-1
lines changed

src/driver/zero.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ void zero_setup() {
5151
null_device->ops.write = null_write;
5252
null_device->ops.poll = zero_poll;
5353
null_device->ops.ioctl = zero_ioctl;
54+
null_device->handle = null_device;
5455
strcpy(null_device->name, "null");
5556
register_device(null_device);
5657

@@ -63,6 +64,7 @@ void zero_setup() {
6364
zero_device->ops.write = null_write;
6465
zero_device->ops.poll = zero_poll;
6566
zero_device->ops.ioctl = zero_ioctl;
67+
zero_device->handle = zero_device;
6668
strcpy(zero_device->name, "zero");
6769
register_device(zero_device);
6870
}

src/fs/fssys.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,10 @@ syscall_(readv, int fd, struct iovec *iov, int iovcnt0) {
130130
}
131131
uint8_t *buf = (uint8_t *)malloc(buf_len);
132132
if (handle->node->size != (uint64_t)-1) {
133-
if (handle->offset > handle->node->size) return EOK;
133+
if (handle->offset > handle->node->size) {
134+
free(buf);
135+
return EOK;
136+
}
134137
}
135138
size_t status = vfs_read(handle->node, buf, handle->offset, buf_len);
136139
if (status == (size_t)-1) {
@@ -222,6 +225,7 @@ syscall_(getcwd, char *buffer, size_t length) {
222225
size_t cwd_leng = strlen(cwd);
223226
if (length > cwd_leng) length = cwd_leng;
224227
memcpy(buffer, cwd, length);
228+
free(cwd);
225229
return length;
226230
}
227231

@@ -253,6 +257,7 @@ syscall_(chdir, char *s) {
253257
if (node->type == file_dir) {
254258
process->cwd = node;
255259
} else {
260+
free(normalized_path);
256261
return SYSCALL_FAULT_(ENOTDIR);
257262
}
258263

@@ -809,6 +814,7 @@ syscall_(unlink, char *name) {
809814

810815
if (node->refcount > 1) {
811816
node->refcount--;
817+
free(npath);
812818
return EOK;
813819
}
814820
size_t ret = vfs_delete(node) == EOK ? EOK : SYSCALL_FAULT_(ENOENT);

0 commit comments

Comments
 (0)