Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Bartosz Golaszewski and committed by
Richard Weinberger
0d4e5ac7 4b6b4c90

+27 -9
+27 -9
arch/um/os-Linux/umid.c
··· 135 135 */ 136 136 static inline int is_umdir_used(char *dir) 137 137 { 138 - char file[strlen(uml_dir) + UMID_LEN + sizeof("/pid\0")]; 139 - char pid[sizeof("nnnnn\0")], *end; 138 + char pid[sizeof("nnnnn\0")], *end, *file; 140 139 int dead, fd, p, n, err; 140 + size_t filelen; 141 141 142 - n = snprintf(file, sizeof(file), "%s/pid", dir); 143 - if (n >= sizeof(file)) { 142 + err = asprintf(&file, "%s/pid", dir); 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 150 printk(UM_KERN_ERR "is_umdir_used - pid filename too long\n"); 145 151 err = -E2BIG; 146 152 goto out; ··· 191 185 out_close: 192 186 close(fd); 193 187 out: 188 + free(file); 194 189 return 0; 195 190 } 196 191 ··· 217 210 218 211 static void __init create_pid_file(void) 219 212 { 220 - char file[strlen(uml_dir) + UMID_LEN + sizeof("/pid\0")]; 221 - char pid[sizeof("nnnnn\0")]; 213 + char pid[sizeof("nnnnn\0")], *file; 222 214 int fd, n; 223 215 224 - if (umid_file_name("pid", file, sizeof(file))) 216 + file = malloc(strlen(uml_dir) + UMID_LEN + sizeof("/pid\0")); 217 + if (!file) 225 218 return; 219 + 220 + if (umid_file_name("pid", file, sizeof(file))) 221 + goto out; 226 222 227 223 fd = open(file, O_RDWR | O_CREAT | O_EXCL, 0644); 228 224 if (fd < 0) { 229 225 printk(UM_KERN_ERR "Open of machine pid file \"%s\" failed: " 230 226 "%s\n", file, strerror(errno)); 231 - return; 227 + goto out; 232 228 } 233 229 234 230 snprintf(pid, sizeof(pid), "%d\n", getpid()); ··· 241 231 errno); 242 232 243 233 close(fd); 234 + out: 235 + free(file); 244 236 } 245 237 246 238 int __init set_umid(char *name) ··· 397 385 398 386 static void remove_umid_dir(void) 399 387 { 400 - char dir[strlen(uml_dir) + UMID_LEN + 1], err; 388 + char *dir, err; 389 + 390 + dir = malloc(strlen(uml_dir) + UMID_LEN + 1); 391 + if (!dir) 392 + return; 401 393 402 394 sprintf(dir, "%s%s", uml_dir, umid); 403 395 err = remove_files_and_dir(dir); 404 396 if (err) 405 397 os_warn("%s - remove_files_and_dir failed with err = %d\n", 406 398 __func__, err); 399 + 400 + free(dir); 407 401 } 408 402 409 403 __uml_exitcall(remove_umid_dir);