Static analysis fixes

Change-Id: I7bc42545a1c497f704d7bfa6ea1b7e3893acc697
This commit is contained in:
Dominique Martinet
2018-07-02 15:06:12 +09:00
committed by Dominique Martinet
parent 141fa5120e
commit 9a79920ef9
5 changed files with 36 additions and 18 deletions

View File

@@ -2081,7 +2081,7 @@ int do_process_vm_read_writev(int pid,
range = lookup_process_memory_range(lthread->vm, range = lookup_process_memory_range(lthread->vm,
(uintptr_t)local_iov, (uintptr_t)local_iov,
(uintptr_t)(local_iov + liovcnt * sizeof(struct iovec))); (uintptr_t)(local_iov + liovcnt));
if (!range) { if (!range) {
ret = -EFAULT; ret = -EFAULT;
@@ -2090,7 +2090,7 @@ int do_process_vm_read_writev(int pid,
range = lookup_process_memory_range(lthread->vm, range = lookup_process_memory_range(lthread->vm,
(uintptr_t)remote_iov, (uintptr_t)remote_iov,
(uintptr_t)(remote_iov + riovcnt * sizeof(struct iovec))); (uintptr_t)(remote_iov + riovcnt));
if (!range) { if (!range) {
ret = -EFAULT; ret = -EFAULT;

View File

@@ -42,7 +42,7 @@ int print_kregs(char *rbp, size_t rbp_size, const struct arch_kregs *kregs)
} }
for (i = 0; i < sizeof(regs_1)/sizeof(regs_1[0]); i++) { /* rsi, rdi, rbp, rsp */ for (i = 0; i < sizeof(regs_1)/sizeof(regs_1[0]); i++) { /* rsi, rdi, rbp, rsp */
ret = print_bin(rbp, rbp_size, (void *)regs_1[i], sizeof(regs_1[0])); ret = print_bin(rbp, rbp_size, regs_1 + i, sizeof(regs_1[0]));
if (ret < 0) { if (ret < 0) {
return ret; return ret;
} }
@@ -62,7 +62,7 @@ int print_kregs(char *rbp, size_t rbp_size, const struct arch_kregs *kregs)
} }
for (i = 0; i < sizeof(regs_2)/sizeof(regs_2[0]); i++) { /* r12-r15 */ for (i = 0; i < sizeof(regs_2)/sizeof(regs_2[0]); i++) { /* r12-r15 */
ret = print_bin(rbp, rbp_size, (void *)regs_2[i], sizeof(regs_2[0])); ret = print_bin(rbp, rbp_size, regs_2 + i, sizeof(regs_2[0]));
if (ret < 0) { if (ret < 0) {
return ret; return ret;
} }

View File

@@ -441,10 +441,12 @@ struct program_load_desc *load_interp(struct program_load_desc *desc0, FILE *fp)
for (i = 0; i < hdr.e_phnum; i++) { for (i = 0; i < hdr.e_phnum; i++) {
if (fread(&phdr, sizeof(phdr), 1, fp) < 1) { if (fread(&phdr, sizeof(phdr), 1, fp) < 1) {
__eprintf("Loading phdr failed (%d)\n", i); __eprintf("Loading phdr failed (%d)\n", i);
free(desc);
return NULL; return NULL;
} }
if (phdr.p_type == PT_INTERP) { if (phdr.p_type == PT_INTERP) {
__eprint("PT_INTERP on interp\n"); __eprint("PT_INTERP on interp\n");
free(desc);
return NULL; return NULL;
} }
if (phdr.p_type == PT_LOAD) { if (phdr.p_type == PT_LOAD) {
@@ -505,11 +507,13 @@ retry:
if (!execvp) { if (!execvp) {
if (strlen(filename) + 1 > max_len) { if (strlen(filename) + 1 > max_len) {
free(link_path);
return ENAMETOOLONG; return ENAMETOOLONG;
} }
strcpy(path, filename); strcpy(path, filename);
error = access(path, X_OK); error = access(path, X_OK);
if (error) { if (error) {
free(link_path);
return errno; return errno;
} }
found = 1; found = 1;
@@ -521,6 +525,7 @@ retry:
} }
if (strlen(filename) >= 255) { if (strlen(filename) >= 255) {
free(link_path);
return ENAMETOOLONG; return ENAMETOOLONG;
} }
@@ -530,6 +535,7 @@ retry:
tofree = string = strdup(PATH); tofree = string = strdup(PATH);
if (string == NULL) { if (string == NULL) {
printf("lookup_exec_path(): copying PATH, not enough memory?\n"); printf("lookup_exec_path(): copying PATH, not enough memory?\n");
free(link_path);
return ENOMEM; return ENOMEM;
} }
@@ -550,7 +556,8 @@ retry:
} }
free(tofree); free(tofree);
if(!found){ if (!found) {
free(link_path);
return ENOENT; return ENOENT;
} }
break; break;
@@ -562,6 +569,7 @@ retry:
if (error < 0 || error >= max_len) { if (error < 0 || error >= max_len) {
fprintf(stderr, "lookup_exec_path(): array too small?\n"); fprintf(stderr, "lookup_exec_path(): array too small?\n");
free(link_path);
return ENOMEM; return ENOMEM;
} }
@@ -581,6 +589,7 @@ retry:
if (error < 0 || error >= max_len) { if (error < 0 || error >= max_len) {
fprintf(stderr, "lookup_exec_path(): array too small?\n"); fprintf(stderr, "lookup_exec_path(): array too small?\n");
free(link_path);
return ENOMEM; return ENOMEM;
} }
@@ -611,6 +620,7 @@ retry:
error = readlink(path, link_path, max_len); error = readlink(path, link_path, max_len);
if (error == -1 || error == max_len) { if (error == -1 || error == max_len) {
fprintf(stderr, "lookup_exec_path(): error readlink\n"); fprintf(stderr, "lookup_exec_path(): error readlink\n");
free(link_path);
return EINVAL; return EINVAL;
} }
link_path[error] = '\0'; link_path[error] = '\0';
@@ -628,7 +638,7 @@ retry:
filename = link_path; filename = link_path;
goto retry; goto retry;
} }
if (!found) { if (!found) {
fprintf(stderr, fprintf(stderr,
"lookup_exec_path(): error finding file %s\n", filename); "lookup_exec_path(): error finding file %s\n", filename);
@@ -677,6 +687,7 @@ int load_elf_desc(char *filename, struct program_load_desc **desc_p,
if (fread(&header, 1, 2, fp) != 2) { if (fread(&header, 1, 2, fp) != 2) {
fprintf(stderr, "Error: Failed to read header from %s\n", filename); fprintf(stderr, "Error: Failed to read header from %s\n", filename);
fclose(fp);
return errno; return errno;
} }
@@ -699,6 +710,7 @@ int load_elf_desc(char *filename, struct program_load_desc **desc_p,
if ((ret = ioctl(fd, MCEXEC_UP_OPEN_EXEC, filename)) != 0) { if ((ret = ioctl(fd, MCEXEC_UP_OPEN_EXEC, filename)) != 0) {
fprintf(stderr, "Error: open_exec() fails for %s: %d (fd: %d)\n", fprintf(stderr, "Error: open_exec() fails for %s: %d (fd: %d)\n",
filename, ret, fd); filename, ret, fd);
fclose(fp);
return ret; return ret;
} }
@@ -713,6 +725,7 @@ int load_elf_desc(char *filename, struct program_load_desc **desc_p,
if (!exec_path) { if (!exec_path) {
fprintf(stderr, "WARNING: strdup(filename) failed\n"); fprintf(stderr, "WARNING: strdup(filename) failed\n");
fclose(fp);
return ENOMEM; return ENOMEM;
} }
} }
@@ -720,12 +733,14 @@ int load_elf_desc(char *filename, struct program_load_desc **desc_p,
char *cwd = getcwd(NULL, 0); char *cwd = getcwd(NULL, 0);
if (!cwd) { if (!cwd) {
fprintf(stderr, "Error: getting current working dir pathname\n"); fprintf(stderr, "Error: getting current working dir pathname\n");
fclose(fp);
return ENOMEM; return ENOMEM;
} }
exec_path = malloc(strlen(cwd) + strlen(filename) + 2); exec_path = malloc(strlen(cwd) + strlen(filename) + 2);
if (!exec_path) { if (!exec_path) {
fprintf(stderr, "Error: allocating exec_path\n"); fprintf(stderr, "Error: allocating exec_path\n");
fclose(fp);
return ENOMEM; return ENOMEM;
} }
@@ -735,8 +750,8 @@ int load_elf_desc(char *filename, struct program_load_desc **desc_p,
desc = load_elf(fp, &interp_path); desc = load_elf(fp, &interp_path);
if (!desc) { if (!desc) {
fclose(fp);
fprintf(stderr, "Error: Failed to parse ELF!\n"); fprintf(stderr, "Error: Failed to parse ELF!\n");
fclose(fp);
return 1; return 1;
} }
@@ -746,18 +761,22 @@ int load_elf_desc(char *filename, struct program_load_desc **desc_p,
path = search_file(interp_path, X_OK); path = search_file(interp_path, X_OK);
if (!path) { if (!path) {
fprintf(stderr, "Error: interp not found: %s\n", interp_path); fprintf(stderr, "Error: interp not found: %s\n", interp_path);
fclose(fp);
return 1; return 1;
} }
interp = fopen(path, "rb"); interp = fopen(path, "rb");
if (!interp) { if (!interp) {
fprintf(stderr, "Error: Failed to open %s\n", path); fprintf(stderr, "Error: Failed to open %s\n", path);
fclose(fp);
return 1; return 1;
} }
desc = load_interp(desc, interp); desc = load_interp(desc, interp);
if (!desc) { if (!desc) {
fprintf(stderr, "Error: Failed to parse interp!\n"); fprintf(stderr, "Error: Failed to parse interp!\n");
fclose(fp);
fclose(interp);
return 1; return 1;
} }
} }
@@ -1775,11 +1794,7 @@ void bind_mount_recursive(const char *root, char *prefix)
return; return;
} }
if (!(entry = readdir(dir))) { while ((entry = readdir(dir))) {
return;
}
do {
len = snprintf(path, sizeof(path) - 1, len = snprintf(path, sizeof(path) - 1,
"%s/%s", prefix, entry->d_name); "%s/%s", prefix, entry->d_name);
path[len] = 0; path[len] = 0;
@@ -1813,7 +1828,6 @@ void bind_mount_recursive(const char *root, char *prefix)
} }
} }
} }
while ((entry = readdir(dir)) != NULL);
closedir(dir); closedir(dir);
} }
@@ -2712,7 +2726,8 @@ do_generic_syscall(
sprintf(proc_path, "/proc/self/fd/%d", (int)w->sr.args[0]); sprintf(proc_path, "/proc/self/fd/%d", (int)w->sr.args[0]);
/* Get filename */ /* Get filename */
if ((len = readlink(proc_path, path, sizeof(path))) < 0) { len = readlink(proc_path, path, sizeof(path));
if (len < 0 || len >= sizeof(path)) {
fprintf(stderr, "%s: error: readlink() failed for %s\n", fprintf(stderr, "%s: error: readlink() failed for %s\n",
__FUNCTION__, proc_path); __FUNCTION__, proc_path);
goto out; goto out;
@@ -3387,6 +3402,8 @@ int main_loop(struct thread_data_s *my_thread)
ret = open(fn, w.sr.args[2], w.sr.args[3]); ret = open(fn, w.sr.args[2], w.sr.args[3]);
SET_ERR(ret); SET_ERR(ret);
do_syscall_return(fd, cpu, ret, 0, 0, 0, 0); do_syscall_return(fd, cpu, ret, 0, 0, 0, 0);
if (ret >= 0)
close(ret);
break; break;
case __NR_futex: case __NR_futex:

View File

@@ -656,7 +656,9 @@ static int fileobj_get_page(struct memobj *memobj, off_t off,
npages = 1 << p2align; npages = 1 << p2align;
virt = ihk_mc_alloc_pages_user(npages, (IHK_MC_AP_NOWAIT | virt = ihk_mc_alloc_pages_user(npages, (IHK_MC_AP_NOWAIT |
(to_memobj(obj)->flags & MF_ZEROFILL) ? IHK_MC_AP_USER : 0), virt_addr); ((to_memobj(obj)->flags & MF_ZEROFILL) ?
IHK_MC_AP_USER : 0)),
virt_addr);
if (!virt) { if (!virt) {
error = -ENOMEM; error = -ENOMEM;
kprintf("fileobj_get_page(%p,%lx,%x,%x,%p):" kprintf("fileobj_get_page(%p,%lx,%x,%x,%p):"

View File

@@ -8018,9 +8018,8 @@ SYSCALL_DECLARE(msync)
if ((range->flag & VR_PRIVATE) || !range->memobj if ((range->flag & VR_PRIVATE) || !range->memobj
|| !memobj_has_pager(range->memobj)) { || !memobj_has_pager(range->memobj)) {
dkprintf("sys_msync(%#lx,%#lx,%#x):" dkprintf("sys_msync(%#lx,%#lx,%#x):unsyncable VMR %#lx-%#lx %#lx\n",
"unsyncable VMR %d %#lx-%#lx %#lx\n", start0, len0, flags,
start0, len0, flags, error,
range->start, range->end, range->flag); range->start, range->end, range->flag);
/* nothing to do */ /* nothing to do */
continue; continue;