Commit a859647b authored by Peng Fan's avatar Peng Fan Committed by Thomas Bogendoerfer
Browse files

mips/vdso: Fix resource leaks in genvdso.c



Close "fd" before the return of map_vdso() and close "out_file"
in main().

Signed-off-by: default avatarPeng Fan <fanpeng@loongson.cn>
Signed-off-by: default avatarThomas Bogendoerfer <tsbogend@alpha.franken.de>
parent c8353fbd
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -122,6 +122,7 @@ static void *map_vdso(const char *path, size_t *_size)
	if (fstat(fd, &stat) != 0) {
		fprintf(stderr, "%s: Failed to stat '%s': %s\n", program_name,
			path, strerror(errno));
		close(fd);
		return NULL;
	}

@@ -130,6 +131,7 @@ static void *map_vdso(const char *path, size_t *_size)
	if (addr == MAP_FAILED) {
		fprintf(stderr, "%s: Failed to map '%s': %s\n", program_name,
			path, strerror(errno));
		close(fd);
		return NULL;
	}

@@ -139,6 +141,7 @@ static void *map_vdso(const char *path, size_t *_size)
	if (memcmp(ehdr->e_ident, ELFMAG, SELFMAG) != 0) {
		fprintf(stderr, "%s: '%s' is not an ELF file\n", program_name,
			path);
		close(fd);
		return NULL;
	}

@@ -150,6 +153,7 @@ static void *map_vdso(const char *path, size_t *_size)
	default:
		fprintf(stderr, "%s: '%s' has invalid ELF class\n",
			program_name, path);
		close(fd);
		return NULL;
	}

@@ -161,6 +165,7 @@ static void *map_vdso(const char *path, size_t *_size)
	default:
		fprintf(stderr, "%s: '%s' has invalid ELF data order\n",
			program_name, path);
		close(fd);
		return NULL;
	}

@@ -168,15 +173,18 @@ static void *map_vdso(const char *path, size_t *_size)
		fprintf(stderr,
			"%s: '%s' has invalid ELF machine (expected EM_MIPS)\n",
			program_name, path);
		close(fd);
		return NULL;
	} else if (swap_uint16(ehdr->e_type) != ET_DYN) {
		fprintf(stderr,
			"%s: '%s' has invalid ELF type (expected ET_DYN)\n",
			program_name, path);
		close(fd);
		return NULL;
	}

	*_size = stat.st_size;
	close(fd);
	return addr;
}

@@ -293,10 +301,12 @@ int main(int argc, char **argv)
	/* Calculate and write symbol offsets to <output file> */
	if (!get_symbols(dbg_vdso_path, dbg_vdso)) {
		unlink(out_path);
		fclose(out_file);
		return EXIT_FAILURE;
	}

	fprintf(out_file, "};\n");
	fclose(out_file);

	return EXIT_SUCCESS;
}