Skip to content

Commit 4fc4995

Browse files
committed
修复 procfs 越界填充问题, 修复 meminfo 显示异常问题.
1 parent e0324cc commit 4fc4995

File tree

9 files changed

+114
-108
lines changed

9 files changed

+114
-108
lines changed

src/arch/x86_64/task/prsys_x64.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,7 @@ syscall_(execve, char *path, char **argv, char **envp) {
321321
// process->ipc_queue = ipc_queue_init();
322322

323323
free(norm_path);
324+
free_envp(old_envp);
324325

325326
uint64_t stack = page_alloc_random(get_current_directory(), BIG_USER_STACK,
326327
PTE_PRESENT | PTE_WRITEABLE | PTE_USER);

src/fs/procfs/proc_meminfo.c

Lines changed: 77 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -2,109 +2,95 @@
22
#include "mem/frame.h"
33
#include "mem/memstat.h"
44
#include "string_builder.h"
5+
#include "term/klog.h"
56

6-
#define MEMINFO_TODO 0ULL // Things to do in the future ;)
7+
static bool meminfo_append_kb(string_builder_t *builder, const char *key, uint64_t value_kb) {
8+
return string_builder_append(builder, "%s:%8llu kB\n", key, value_kb);
9+
}
710

8-
char *meminfo_origin[] = {"MemTotal:\t\t%llu kB\n", "MemFree:\t\t%llu kB\n",
9-
"MemAvailable:\t%llu kB\n", "Buffers:\t\t%llu kB\n",
10-
"Cached:\t\t%llu kB\n", "SwapCached:\t\t%llu kB\n",
11-
"Active:\t\t%llu kB\n", "Inactive:\t\t%llu kB\n",
12-
"Active(anon):\t%llu kB\n", "Inactive(anon):\t%llu kB\n",
13-
"Active(file):\t%llu kB\n", "Inactive(file):\t%llu kB\n",
14-
"Unevictable:\t\t%llu kB\n", "Mlocked:\t\t%llu kB\n",
15-
"SwapTotal:\t\t%llu kB\n", "SwapFree:\t\t%llu kB\n",
16-
"Zswap:\t\t%llu kB\n", "Zswapped:\t\t%llu kB\n",
17-
"Dirty:\t\t%llu kB\n", "Writeback:\t\t%llu kB\n",
18-
"AnonPages: \t\t%llu kB\n", "Mapped:\t\t%llu kB\n",
19-
"Shmem:\t\t%llu kB\n", "KReclaimable:\t%llu kB\n",
20-
"Slab:\t\t%llu kB\n", "SReclaimable:\t\t%llu kB\n",
21-
"SUnreclaim:\t\t%llu kB\n", "KernelStack:\t\t%llu kB\n",
22-
"PageTables:\t\t%llu kB\n", "SecPageTables:\t\t%llu kB\n",
23-
"NFS_Unstable:\t\t%llu kB\n", "Bounce:\t\t%llu kB\n",
24-
"WritebackTmp:\t\t%llu kB\n", "CommitLimit:\t%llu kB\n",
25-
"Committed_AS:\t%llu kB\n", "VmallocTotal:\t%llu kB\n",
26-
"VmallocUsed:\t\t%llu kB\n", "VmallocChunk:\t\t%llu kB\n",
27-
"Percpu:\t\t%llu kB\n", "HardwareCorrupted:\t%llu kB\n",
28-
"AnonHugePages:\t%llu kB\n", "ShmemHugePages:\t\t%llu kB\n",
29-
"ShmemPmdMapped:\t\t%llu kB\n", "FileHugePages:\t\t%llu kB\n",
30-
"FilePmdMapped:\t\t%llu kB\n", "Unaccepted:\t\t%llu kB\n",
31-
"HugePages_Total:\t\t%llu\n", "HugePages_Free:\t\t%llu\n",
32-
"HugePages_Rsvd:\t\t%llu\n", "HugePages_Surp:\t\t%llu\n",
33-
"Hugepagesize:\t%llu kB\n", "Hugetlb:\t\t%llu kB\n",
34-
"DirectMap4k:\t%llu kB\n", "DirectMap2M:\t%llu kB\n",
35-
"DirectMap1G:\t%llu kB\n"};
11+
static bool meminfo_append_raw(string_builder_t *builder, const char *key, uint64_t value) {
12+
return string_builder_append(builder, "%s:%8llu\n", key, value);
13+
}
3614

3715
char *proc_gen_meminfo(size_t *context_len) {
3816
string_builder_t *builder = create_string_builder(4096);
3917
if (unlikely(builder == NULL)) return NULL;
4018

41-
bool status = false;
42-
for (size_t i = 0; i < 55; i++) {
43-
status &= string_builder_append(builder,meminfo_origin[i],MEMINFO_TODO);
44-
}
19+
const uint64_t mem_total_kb = get_origin_frames() * 4;
20+
const uint64_t mem_free_kb = get_usable_frames() * 4;
21+
const uint64_t mem_available_kb = mem_free_kb;
22+
const uint64_t mem_used_kb = mem_total_kb - mem_free_kb;
23+
const uint64_t bad_kb = get_bad_memory() / 1024;
4524

46-
// int length = sprintf(result, meminfo_origin,
47-
// get_memory_size() / 1024, // MemTotal
48-
// (get_memory_size() - get_used_memory()) / 1024, // MemFree
49-
// get_available_memory() / 1024, // MemAvailable
50-
// MEMINFO_TODO, // Buffers
51-
// MEMINFO_TODO, // Cached
52-
// MEMINFO_TODO, // SwapCached
53-
// MEMINFO_TODO, // Active
54-
// MEMINFO_TODO, // Inactive
55-
// MEMINFO_TODO, // Active(anon)
56-
// MEMINFO_TODO, // Inactive(anon)
57-
// MEMINFO_TODO, // Active(file)
58-
// MEMINFO_TODO, // Inactive(file)
59-
// MEMINFO_TODO, // Unevictable
60-
// MEMINFO_TODO, // Mlocked
61-
// MEMINFO_TODO, // SwapTotal
62-
// MEMINFO_TODO, // SwapFree
63-
// MEMINFO_TODO, // Zswap
64-
// MEMINFO_TODO, // Zswapped
65-
// MEMINFO_TODO, // Dirty
66-
// MEMINFO_TODO, // Writeback
67-
// MEMINFO_TODO, // AnonPages
68-
// MEMINFO_TODO, // Mapped
69-
// MEMINFO_TODO, // Shmem
70-
// MEMINFO_TODO, // KReclaimable
71-
// MEMINFO_TODO, // Slab
72-
// MEMINFO_TODO, // SReclaimable
73-
// MEMINFO_TODO, // SUnreclaim
74-
// MAX_STACK_SIZE, // KernelStack
75-
// MEMINFO_TODO, // PageTables
76-
// MEMINFO_TODO, // SecPageTables
77-
// MEMINFO_TODO, // NFS_Unstable
78-
// MEMINFO_TODO, // Bounce
79-
// MEMINFO_TODO, // WritebackTmp
80-
// MEMINFO_TODO, // CommitLimit
81-
// MEMINFO_TODO, // Committed_AS
82-
// MEMINFO_TODO, // VmallocTotal
83-
// MEMINFO_TODO, // VmallocUsed
84-
// MEMINFO_TODO, // VmallocChunk
85-
// MEMINFO_TODO, // Percpu
86-
// MEMINFO_TODO, // HardwareCorrupted
87-
// MEMINFO_TODO, // AnonHugePages
88-
// MEMINFO_TODO, // ShmemHugePages
89-
// MEMINFO_TODO, // ShmemPmdMapped
90-
// MEMINFO_TODO, // FileHugePages
91-
// MEMINFO_TODO, // FilePmdMapped
92-
// MEMINFO_TODO, // Unaccepted
93-
// MEMINFO_TODO, // HugePages_Total
94-
// MEMINFO_TODO, // HugePages_Free
95-
// MEMINFO_TODO, // HugePages_Rsvd
96-
// MEMINFO_TODO, // HugePages_Surp
97-
// MEMINFO_TODO, // Hugepagesize
98-
// MEMINFO_TODO, // Hugetlb
99-
// MEMINFO_TODO, // DirectMap4k
100-
// MEMINFO_TODO, // DirectMap2M
101-
// MEMINFO_TODO // DirectMap1G
102-
// );
25+
logkf("proc_meminfo: %llu %llu %llu\n\r", mem_total_kb, mem_free_kb, mem_used_kb);
26+
27+
const uint64_t zero_kb = 0;
28+
const uint64_t swap_total_kb = 0;
29+
const uint64_t swap_free_kb = 0;
30+
const uint64_t commit_limit_kb = mem_total_kb + swap_total_kb;
31+
const uint64_t committed_as_kb = mem_used_kb;
32+
33+
if (!meminfo_append_kb(builder, "MemTotal", mem_total_kb)) goto err;
34+
if (!meminfo_append_kb(builder, "MemFree", mem_free_kb)) goto err;
35+
if (!meminfo_append_kb(builder, "MemAvailable", mem_available_kb)) goto err;
36+
if (!meminfo_append_kb(builder, "Buffers", zero_kb)) goto err;
37+
if (!meminfo_append_kb(builder, "Cached", zero_kb)) goto err;
38+
if (!meminfo_append_kb(builder, "SwapCached", zero_kb)) goto err;
39+
if (!meminfo_append_kb(builder, "Active", zero_kb)) goto err;
40+
if (!meminfo_append_kb(builder, "Inactive", zero_kb)) goto err;
41+
if (!meminfo_append_kb(builder, "Active(anon)", zero_kb)) goto err;
42+
if (!meminfo_append_kb(builder, "Inactive(anon)", zero_kb)) goto err;
43+
if (!meminfo_append_kb(builder, "Active(file)", zero_kb)) goto err;
44+
if (!meminfo_append_kb(builder, "Inactive(file)", zero_kb)) goto err;
45+
if (!meminfo_append_kb(builder, "Unevictable", zero_kb)) goto err;
46+
if (!meminfo_append_kb(builder, "Mlocked", zero_kb)) goto err;
47+
if (!meminfo_append_kb(builder, "SwapTotal", swap_total_kb)) goto err;
48+
if (!meminfo_append_kb(builder, "SwapFree", swap_free_kb)) goto err;
49+
if (!meminfo_append_kb(builder, "Dirty", zero_kb)) goto err;
50+
if (!meminfo_append_kb(builder, "Writeback", zero_kb)) goto err;
51+
if (!meminfo_append_kb(builder, "AnonPages", zero_kb)) goto err;
52+
if (!meminfo_append_kb(builder, "Mapped", zero_kb)) goto err;
53+
if (!meminfo_append_kb(builder, "Shmem", zero_kb)) goto err;
54+
if (!meminfo_append_kb(builder, "KReclaimable", zero_kb)) goto err;
55+
if (!meminfo_append_kb(builder, "Slab", zero_kb)) goto err;
56+
if (!meminfo_append_kb(builder, "SReclaimable", zero_kb)) goto err;
57+
if (!meminfo_append_kb(builder, "SUnreclaim", zero_kb)) goto err;
58+
if (!meminfo_append_kb(builder, "KernelStack", STACK_SIZE)) goto err;
59+
if (!meminfo_append_kb(builder, "PageTables", zero_kb)) goto err;
60+
if (!meminfo_append_kb(builder, "NFS_Unstable", zero_kb)) goto err;
61+
if (!meminfo_append_kb(builder, "Bounce", zero_kb)) goto err;
62+
if (!meminfo_append_kb(builder, "WritebackTmp", zero_kb)) goto err;
63+
if (!meminfo_append_kb(builder, "CommitLimit", commit_limit_kb)) goto err;
64+
if (!meminfo_append_kb(builder, "Committed_AS", committed_as_kb)) goto err;
65+
if (!meminfo_append_kb(builder, "VmallocTotal", zero_kb)) goto err;
66+
if (!meminfo_append_kb(builder, "VmallocUsed", zero_kb)) goto err;
67+
if (!meminfo_append_kb(builder, "VmallocChunk", zero_kb)) goto err;
68+
if (!meminfo_append_kb(builder, "Percpu", zero_kb)) goto err;
69+
if (!meminfo_append_kb(builder, "HardwareCorrupted", bad_kb)) goto err;
70+
if (!meminfo_append_kb(builder, "AnonHugePages", zero_kb)) goto err;
71+
if (!meminfo_append_kb(builder, "ShmemHugePages", zero_kb)) goto err;
72+
if (!meminfo_append_kb(builder, "ShmemPmdMapped", zero_kb)) goto err;
73+
if (!meminfo_append_kb(builder, "FileHugePages", zero_kb)) goto err;
74+
if (!meminfo_append_kb(builder, "FilePmdMapped", zero_kb)) goto err;
75+
if (!meminfo_append_kb(builder, "Unaccepted", zero_kb)) goto err;
76+
if (!meminfo_append_raw(builder, "HugePages_Total", 0)) goto err;
77+
if (!meminfo_append_raw(builder, "HugePages_Free", 0)) goto err;
78+
if (!meminfo_append_raw(builder, "HugePages_Rsvd", 0)) goto err;
79+
if (!meminfo_append_raw(builder, "HugePages_Surp", 0)) goto err;
80+
if (!meminfo_append_kb(builder, "Hugepagesize", 0)) goto err;
81+
if (!meminfo_append_kb(builder, "Hugetlb", 0)) goto err;
82+
if (!meminfo_append_kb(builder, "DirectMap4k", 0)) goto err;
83+
if (!meminfo_append_kb(builder, "DirectMap2M", 0)) goto err;
84+
if (!meminfo_append_kb(builder, "DirectMap1G", 0)) goto err;
10385

10486
*context_len = builder->size;
10587
char *data = builder->data;
10688
free(builder);
10789
return data;
90+
err:
91+
free(builder->data);
92+
free(builder);
93+
return NULL;
10894
}
10995

11096
size_t proc_meminfo_stat(proc_handle_t *handle) {
@@ -134,6 +120,6 @@ size_t proc_meminfo_read(proc_handle_t *handle, void *addr, size_t offset, size_
134120
memcpy(addr, content + offset, to_copy);
135121
free(content);
136122

137-
((char *)addr)[to_copy] = '\0';
123+
if(to_copy < size) ((char *)addr)[to_copy] = '\0';
138124
return to_copy;
139125
}

src/fs/procfs/proc_pmaps.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,6 @@ size_t proc_pmaps_read(proc_handle_t *handle,void *addr, size_t offset, size_t s
7878
size_t to_copy = MIN(content_len, size);
7979
memcpy(addr, content + offset, to_copy);
8080
free(content);
81-
((char *)addr)[to_copy] = '\0';
81+
if(to_copy < size) ((char *)addr)[to_copy] = '\0';
8282
return to_copy;
8383
}

src/fs/procfs/proc_pstat.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,6 @@ size_t proc_pstat_read(proc_handle_t *handle, void *addr, size_t offset, size_t
9898
size_t to_copy = MIN(content_len, size);
9999
memcpy(addr, content + offset, to_copy);
100100
free(content);
101-
((char *)addr)[to_copy] = '\0';
101+
if(to_copy < size) ((char *)addr)[to_copy] = '\0';
102102
return to_copy;
103103
}

src/include/mem/frame.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
typedef struct {
1515
void *allocator;
16+
size_t total_frames;
1617
size_t origin_frames;
1718
size_t usable_frames;
1819
} FrameAllocator;

src/include/mem/memstat.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,7 @@ uint64_t get_available_memory();
1111
uint64_t get_used_memory();
1212

1313
uint64_t get_bad_memory();
14+
15+
size_t get_total_frames();
16+
size_t get_origin_frames();
17+
size_t get_usable_frames();

src/mem/buddy.c

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,7 @@ uint64_t max_pfn = 0;
2222
uint64_t min_pfn = 0;
2323
zone_t *zones[__MAX_NR_ZONES] = {NULL};
2424
int nr_zones = 0;
25-
static size_t origin_frames = 0;
26-
static size_t usable_frames = 0;
2725
static size_t total_frames = 0;
28-
static size_t metadata_frames = 0;
2926
Bitmap usable_regions;
3027
spin_t frame_op_lock = SPIN_INIT;
3128
static size_t early_last_alloc_pos = 0;
@@ -684,9 +681,10 @@ void init_frame_buddy(uint64_t memory_size) {
684681
}
685682

686683
frame_allocator.origin_frames = origin_frames;
687-
frame_allocator.usable_frames = usable_frames;
688-
logkf("buddy: total frames = %zu, metadata_frames = %zu, usable_frames = %zu\n", total_frames,
689-
metadata_frames, usable_frames);
684+
frame_allocator.usable_frames = origin_frames;
685+
frame_allocator.total_frames = total_frames;
686+
logkf("buddy: total frames = %zu, usable_frames = %zu\n", total_frames,
687+
frame_allocator.usable_frames);
690688
}
691689

692690
static size_t next_power_of_2(size_t n) {

src/mem/memstat.c

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,13 @@
44

55
uint64_t reserved_memory = 0;
66
uint64_t bad_memory = 0;
7-
uint64_t all_memory = 0;
87

98
uint64_t get_reserved_memory() {
109
return reserved_memory;
1110
}
1211

1312
uint64_t get_all_memory() {
14-
return all_memory;
13+
return frame_allocator.total_frames * PAGE_SIZE;
1514
}
1615

1716
uint64_t get_available_memory() {
@@ -22,6 +21,18 @@ uint64_t get_used_memory() {
2221
return (frame_allocator.origin_frames - frame_allocator.usable_frames) * PAGE_SIZE;
2322
}
2423

24+
size_t get_total_frames() {
25+
return frame_allocator.total_frames;
26+
}
27+
28+
size_t get_origin_frames() {
29+
return frame_allocator.origin_frames;
30+
}
31+
32+
size_t get_usable_frames() {
33+
return frame_allocator.usable_frames;
34+
}
35+
2536
uint64_t get_bad_memory() {
2637
return bad_memory;
2738
}

src/util/string_builder.c

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11
#include "string_builder.h"
22
#include "lib/sprintf.h"
33
#include "mem/heap.h"
4+
#include "types/limits.h"
45

56
string_builder_t *create_string_builder(size_t initial_capacity) {
7+
if (initial_capacity == 0) initial_capacity = 1;
68
string_builder_t *buf = malloc(sizeof(string_builder_t));
79
if (!buf) return NULL;
810

9-
buf->data = malloc(initial_capacity);
11+
buf->data = calloc(1,initial_capacity);
1012
if (!buf->data) {
1113
free(buf);
1214
return NULL;
1315
}
1416

1517
buf->size = 0;
1618
buf->capacity = initial_capacity;
17-
buf->data[0] = '\0';
1819

1920
return buf;
2021
}
@@ -59,17 +60,21 @@ bool string_builder_append(string_builder_t *buf, const char *format, ...) {
5960
}
6061

6162
// 实际写入
63+
size_t avail = buf->capacity - buf->size;
64+
if (avail > (size_t)INT_MAX) avail = (size_t)INT_MAX;
65+
6266
va_start(args, format);
63-
int written = vsnprintf(buf->data + buf->size,
64-
buf->capacity - buf->size,
65-
format, args);
67+
int written = vsnprintf(buf->data + buf->size,
68+
(int)avail,
69+
format, args);
6670
va_end(args);
6771

6872
if (written < 0) return false;
69-
73+
if ((size_t)written >= avail) return false;
74+
7075
// 更新大小(写入的字符数不会超过 needed)
7176
buf->size += (size_t)written;
7277
buf->data[buf->size] = '\0'; // 确保 null 终止
73-
78+
7479
return true;
7580
}

0 commit comments

Comments
 (0)