hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/arch/um/os-Linux/umid.c
....@@ -1,6 +1,6 @@
1
+// SPDX-License-Identifier: GPL-2.0
12 /*
23 * Copyright (C) 2002 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
3
- * Licensed under the GPL
44 */
55
66 #include <stdio.h>
....@@ -97,7 +97,7 @@
9797 while ((ent = readdir(directory)) != NULL) {
9898 if (!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, ".."))
9999 continue;
100
- len = strlen(dir) + sizeof("/") + strlen(ent->d_name) + 1;
100
+ len = strlen(dir) + strlen("/") + strlen(ent->d_name) + 1;
101101 if (len > sizeof(file)) {
102102 ret = -E2BIG;
103103 goto out;
....@@ -135,16 +135,15 @@
135135 */
136136 static inline int is_umdir_used(char *dir)
137137 {
138
- char file[strlen(uml_dir) + UMID_LEN + sizeof("/pid\0")];
139
- char pid[sizeof("nnnnn\0")], *end;
138
+ char pid[sizeof("nnnnnnnnn")], *end, *file;
140139 int dead, fd, p, n, err;
140
+ size_t filelen = strlen(dir) + sizeof("/pid") + 1;
141141
142
- n = snprintf(file, sizeof(file), "%s/pid", dir);
143
- if (n >= sizeof(file)) {
144
- printk(UM_KERN_ERR "is_umdir_used - pid filename too long\n");
145
- err = -E2BIG;
146
- goto out;
147
- }
142
+ file = malloc(filelen);
143
+ if (!file)
144
+ return -ENOMEM;
145
+
146
+ snprintf(file, filelen, "%s/pid", dir);
148147
149148 dead = 0;
150149 fd = open(file, O_RDONLY);
....@@ -185,6 +184,7 @@
185184 out_close:
186185 close(fd);
187186 out:
187
+ free(file);
188188 return 0;
189189 }
190190
....@@ -210,18 +210,22 @@
210210
211211 static void __init create_pid_file(void)
212212 {
213
- char file[strlen(uml_dir) + UMID_LEN + sizeof("/pid\0")];
214
- char pid[sizeof("nnnnn\0")];
213
+ char pid[sizeof("nnnnnnnnn")], *file;
215214 int fd, n;
216215
217
- if (umid_file_name("pid", file, sizeof(file)))
216
+ n = strlen(uml_dir) + UMID_LEN + sizeof("/pid");
217
+ file = malloc(n);
218
+ if (!file)
218219 return;
220
+
221
+ if (umid_file_name("pid", file, n))
222
+ goto out;
219223
220224 fd = open(file, O_RDWR | O_CREAT | O_EXCL, 0644);
221225 if (fd < 0) {
222226 printk(UM_KERN_ERR "Open of machine pid file \"%s\" failed: "
223227 "%s\n", file, strerror(errno));
224
- return;
228
+ goto out;
225229 }
226230
227231 snprintf(pid, sizeof(pid), "%d\n", getpid());
....@@ -231,6 +235,8 @@
231235 errno);
232236
233237 close(fd);
238
+out:
239
+ free(file);
234240 }
235241
236242 int __init set_umid(char *name)
....@@ -385,13 +391,19 @@
385391
386392 static void remove_umid_dir(void)
387393 {
388
- char dir[strlen(uml_dir) + UMID_LEN + 1], err;
394
+ char *dir, err;
395
+
396
+ dir = malloc(strlen(uml_dir) + UMID_LEN + 1);
397
+ if (!dir)
398
+ return;
389399
390400 sprintf(dir, "%s%s", uml_dir, umid);
391401 err = remove_files_and_dir(dir);
392402 if (err)
393403 os_warn("%s - remove_files_and_dir failed with err = %d\n",
394404 __func__, err);
405
+
406
+ free(dir);
395407 }
396408
397409 __uml_exitcall(remove_umid_dir);