summaryrefslogtreecommitdiffstats
path: root/arch/um
diff options
context:
space:
mode:
authorBartosz Golaszewski <bgolaszewski@baylibre.com>2019-04-11 05:49:42 -0400
committerRichard Weinberger <richard@nod.at>2019-05-07 17:18:28 -0400
commit0d4e5ac7e78035950d564e65c38ce148cb9af681 (patch)
tree9fb0db982a614a81981afef8dca37515bfcf9e38 /arch/um
parent4b6b4c902947cae374593e601400a7bdd3d7f7a4 (diff)
um: remove uses of variable length arrays
While the affected code is run in user-mode, the build still warns about it. Convert all uses of VLA to dynamic allocations. Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com> Signed-off-by: Richard Weinberger <richard@nod.at>
Diffstat (limited to 'arch/um')
-rw-r--r--arch/um/os-Linux/umid.c36
1 files changed, 27 insertions, 9 deletions
diff --git a/arch/um/os-Linux/umid.c b/arch/um/os-Linux/umid.c
index 998fbb445458..e261656fe9d7 100644
--- a/arch/um/os-Linux/umid.c
+++ b/arch/um/os-Linux/umid.c
@@ -135,12 +135,18 @@ out:
135 */ 135 */
136static inline int is_umdir_used(char *dir) 136static inline int is_umdir_used(char *dir)
137{ 137{
138 char file[strlen(uml_dir) + UMID_LEN + sizeof("/pid\0")]; 138 char pid[sizeof("nnnnn\0")], *end, *file;
139 char pid[sizeof("nnnnn\0")], *end;
140 int dead, fd, p, n, err; 139 int dead, fd, p, n, err;
140 size_t filelen;
141 141
142 n = snprintf(file, sizeof(file), "%s/pid", dir); 142 err = asprintf(&file, "%s/pid", dir);
143 if (n >= sizeof(file)) { 143 if (err < 0)
144 return 0;
145
146 filelen = strlen(file);
147
148 n = snprintf(file, filelen, "%s/pid", dir);
149 if (n >= filelen) {
144 printk(UM_KERN_ERR "is_umdir_used - pid filename too long\n"); 150 printk(UM_KERN_ERR "is_umdir_used - pid filename too long\n");
145 err = -E2BIG; 151 err = -E2BIG;
146 goto out; 152 goto out;
@@ -185,6 +191,7 @@ static inline int is_umdir_used(char *dir)
185out_close: 191out_close:
186 close(fd); 192 close(fd);
187out: 193out:
194 free(file);
188 return 0; 195 return 0;
189} 196}
190 197
@@ -210,18 +217,21 @@ static int umdir_take_if_dead(char *dir)
210 217
211static void __init create_pid_file(void) 218static void __init create_pid_file(void)
212{ 219{
213 char file[strlen(uml_dir) + UMID_LEN + sizeof("/pid\0")]; 220 char pid[sizeof("nnnnn\0")], *file;
214 char pid[sizeof("nnnnn\0")];
215 int fd, n; 221 int fd, n;
216 222
217 if (umid_file_name("pid", file, sizeof(file))) 223 file = malloc(strlen(uml_dir) + UMID_LEN + sizeof("/pid\0"));
224 if (!file)
218 return; 225 return;
219 226
227 if (umid_file_name("pid", file, sizeof(file)))
228 goto out;
229
220 fd = open(file, O_RDWR | O_CREAT | O_EXCL, 0644); 230 fd = open(file, O_RDWR | O_CREAT | O_EXCL, 0644);
221 if (fd < 0) { 231 if (fd < 0) {
222 printk(UM_KERN_ERR "Open of machine pid file \"%s\" failed: " 232 printk(UM_KERN_ERR "Open of machine pid file \"%s\" failed: "
223 "%s\n", file, strerror(errno)); 233 "%s\n", file, strerror(errno));
224 return; 234 goto out;
225 } 235 }
226 236
227 snprintf(pid, sizeof(pid), "%d\n", getpid()); 237 snprintf(pid, sizeof(pid), "%d\n", getpid());
@@ -231,6 +241,8 @@ static void __init create_pid_file(void)
231 errno); 241 errno);
232 242
233 close(fd); 243 close(fd);
244out:
245 free(file);
234} 246}
235 247
236int __init set_umid(char *name) 248int __init set_umid(char *name)
@@ -385,13 +397,19 @@ __uml_setup("uml_dir=", set_uml_dir,
385 397
386static void remove_umid_dir(void) 398static void remove_umid_dir(void)
387{ 399{
388 char dir[strlen(uml_dir) + UMID_LEN + 1], err; 400 char *dir, err;
401
402 dir = malloc(strlen(uml_dir) + UMID_LEN + 1);
403 if (!dir)
404 return;
389 405
390 sprintf(dir, "%s%s", uml_dir, umid); 406 sprintf(dir, "%s%s", uml_dir, umid);
391 err = remove_files_and_dir(dir); 407 err = remove_files_and_dir(dir);
392 if (err) 408 if (err)
393 os_warn("%s - remove_files_and_dir failed with err = %d\n", 409 os_warn("%s - remove_files_and_dir failed with err = %d\n",
394 __func__, err); 410 __func__, err);
411
412 free(dir);
395} 413}
396 414
397__uml_exitcall(remove_umid_dir); 415__uml_exitcall(remove_umid_dir);