diff options
| -rw-r--r-- | arch/um/os-Linux/umid.c | 36 |
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 | */ |
| 136 | static inline int is_umdir_used(char *dir) | 136 | static 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) | |||
| 185 | out_close: | 191 | out_close: |
| 186 | close(fd); | 192 | close(fd); |
| 187 | out: | 193 | out: |
| 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 | ||
| 211 | static void __init create_pid_file(void) | 218 | static 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); |
| 244 | out: | ||
| 245 | free(file); | ||
| 234 | } | 246 | } |
| 235 | 247 | ||
| 236 | int __init set_umid(char *name) | 248 | int __init set_umid(char *name) |
| @@ -385,13 +397,19 @@ __uml_setup("uml_dir=", set_uml_dir, | |||
| 385 | 397 | ||
| 386 | static void remove_umid_dir(void) | 398 | static 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); |
