X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=blobdiff_plain;f=src%2Finspect.c;h=1f4096d1529f8a39339d10094eb7dddaaa9bf16c;hp=11a53740eed8bc71e8c53325e7c25b0635900675;hb=641ccab6c3b17f1c94676eab99e8baa9cddf5a0b;hpb=000c4a82fbd78667849551114b6d08f391324796 diff --git a/src/inspect.c b/src/inspect.c index 11a5374..1f4096d 100644 --- a/src/inspect.c +++ b/src/inspect.c @@ -57,6 +57,8 @@ static pcre *re_xdev; static pcre *re_windows_version; static void compile_regexps (void) __attribute__((constructor)); +static void free_regexps (void) __attribute__((destructor)); + static void compile_regexps (void) { @@ -88,6 +90,22 @@ compile_regexps (void) COMPILE (re_windows_version, "^(\\d+)\\.(\\d+)", 0); } +static void +free_regexps (void) +{ + pcre_free (re_file_elf); + pcre_free (re_file_win64); + pcre_free (re_elf_ppc64); + pcre_free (re_fedora); + pcre_free (re_rhel_old); + pcre_free (re_rhel); + pcre_free (re_rhel_no_minor); + pcre_free (re_debian); + pcre_free (re_aug_seq); + pcre_free (re_xdev); + pcre_free (re_windows_version); +} + /* Match a regular expression which contains no captures. Returns * true if it matches or false if it doesn't. */ @@ -209,6 +227,15 @@ is_regular_file (const char *filename) static char * cpio_arch (guestfs_h *g, const char *file, const char *path) { + TMP_TEMPLATE_ON_STACK (dir); +#define dir_len (strlen (dir)) +#define initrd_len (dir_len + 16) + char initrd[initrd_len]; +#define cmd_len (dir_len + 256) + char cmd[cmd_len]; +#define bin_len (dir_len + 32) + char bin[bin_len]; + char *ret = NULL; const char *method; @@ -219,20 +246,16 @@ cpio_arch (guestfs_h *g, const char *file, const char *path) else method = "cat"; - char dir[] = "/tmp/initrd.XXXXXX"; -#define dir_len (sizeof dir) if (mkdtemp (dir) == NULL) { perrorf (g, "mkdtemp"); goto out; } - char dir_initrd[dir_len + 16]; - snprintf (dir_initrd, dir_len + 16, "%s/initrd", dir); - if (guestfs_download (g, path, dir_initrd) == -1) + snprintf (initrd, initrd_len, "%s/initrd", dir); + if (guestfs_download (g, path, initrd) == -1) goto out; - char cmd[dir_len + 256]; - snprintf (cmd, dir_len + 256, + snprintf (cmd, cmd_len, "cd %s && %s initrd | cpio --quiet -id " INITRD_BINARIES1, dir, method); int r = system (cmd); @@ -241,11 +264,10 @@ cpio_arch (guestfs_h *g, const char *file, const char *path) goto out; } - char bin[dir_len + 32]; const char *bins[] = INITRD_BINARIES2; size_t i; for (i = 0; i < sizeof bins / sizeof bins[0]; ++i) { - snprintf (bin, dir_len + 32, "%s/%s", dir, bins[i]); + snprintf (bin, bin_len, "%s/%s", dir, bins[i]); if (is_regular_file (bin)) { int flags = g->verbose ? MAGIC_DEBUG : 0; @@ -287,11 +309,14 @@ cpio_arch (guestfs_h *g, const char *file, const char *path) * contain shell meta-characters because of the way it was * constructed above. */ - snprintf (cmd, dir_len + 256, "rm -rf %s", dir); + snprintf (cmd, cmd_len, "rm -rf %s", dir); ignore_value (system (cmd)); return ret; #undef dir_len +#undef initrd_len +#undef cmd_len +#undef bin_len } char * @@ -965,6 +990,13 @@ static int check_windows_registry (guestfs_h *g, struct inspect_fs *fs, const char *systemroot) { + TMP_TEMPLATE_ON_STACK (dir); +#define dir_len (strlen (dir)) +#define software_hive_len (dir_len + 16) + char software_hive[software_hive_len]; +#define cmd_len (dir_len + 16) + char cmd[cmd_len]; + size_t len = strlen (systemroot) + 64; char software[len]; snprintf (software, len, "%s/system32/config/software", systemroot); @@ -980,15 +1012,12 @@ check_windows_registry (guestfs_h *g, struct inspect_fs *fs, hive_h *h = NULL; hive_value_h *values = NULL; - char dir[] = "/tmp/winreg.XXXXXX"; -#define dir_len 18 if (mkdtemp (dir) == NULL) { perrorf (g, "mkdtemp"); goto out; } - char software_hive[dir_len + 16]; - snprintf (software_hive, dir_len + 16, "%s/software", dir); + snprintf (software_hive, software_hive_len, "%s/software", dir); if (guestfs_download (g, software_path, software_hive) == -1) goto out; @@ -1074,10 +1103,11 @@ check_windows_registry (guestfs_h *g, struct inspect_fs *fs, * contain shell meta-characters because of the way it was * constructed above. */ - char cmd[dir_len + 16]; - snprintf (cmd, dir_len + 16, "rm -rf %s", dir); + snprintf (cmd, cmd_len, "rm -rf %s", dir); ignore_value (system (cmd)); #undef dir_len +#undef software_hive_len +#undef cmd_len return ret; }