[lttng-dev] [PATCH lttng-tools 2/2] Fix: lttng-crash: remove tmp working directory

Jérémie Galarneau jeremie.galarneau at efficios.com
Sat Sep 5 14:54:18 EDT 2015


Merged with modifications, see below.

Thanks!
Jérémie

On Thu, Sep 3, 2015 at 5:52 PM, Jonathan Rajotte
<jonathan.rajotte-julien at efficios.com> wrote:
> Signed-off-by: Jonathan Rajotte <jonathan.rajotte-julien at efficios.com>
> ---
>  src/bin/lttng-crash/lttng-crash.c | 65 +++++++++++++++++++++++++++++----------
>  1 file changed, 48 insertions(+), 17 deletions(-)
>
> diff --git a/src/bin/lttng-crash/lttng-crash.c b/src/bin/lttng-crash/lttng-crash.c
> index 8e57034..00a97df 100644
> --- a/src/bin/lttng-crash/lttng-crash.c
> +++ b/src/bin/lttng-crash/lttng-crash.c
> @@ -1053,35 +1053,62 @@ end:
>  }
>
>  static
> -int delete_trace(const char *trace_path)
> +int delete_recursive_dir(const char *path)

Renamed to "delete_dir_recursive".

>  {
> -       DIR *trace_dir;
> -       int trace_dir_fd, ret = 0, closeret;
> +       DIR *dir;
> +       int dir_fd, ret = 0, closeret;
>         struct dirent *entry;
>

>         /* Open trace directory */
> -       trace_dir = opendir(trace_path);
> -       if (!trace_dir) {
> -               PERROR("Cannot open '%s' path", trace_path);
> +       dir = opendir(path);
> +       if (!dir) {
> +               PERROR("Cannot open '%s' path", path);
>                 return -1;
>         }
> -       trace_dir_fd = dirfd(trace_dir);
> -       if (trace_dir_fd < 0) {
> +       dir_fd = dirfd(dir);
> +       if (dir_fd < 0) {
>                 PERROR("dirfd");
>                 return -1;
>         }

Not introduced by your patch, but this will leak dir. I have fixed the
problem and modified your patch so that it applies cleanly on top of
it.

>
> -       while ((entry = readdir(trace_dir))) {
> +       while ((entry = readdir(dir))) {
>                 if (!strcmp(entry->d_name, ".")
>                                 || !strcmp(entry->d_name, "..")) {
>                         continue;
>                 }
>                 switch (entry->d_type) {
>                 case DT_DIR:
> -                       unlinkat(trace_dir_fd, entry->d_name, AT_REMOVEDIR);
> +               {
> +                       char subpath[PATH_MAX];
>

^ I changed this for dynamic allocation since "PATH_MAX" can become
quite large on some system configurations and we may "recurse" rather
deeply in a trace hierarchy.

> +                       strncpy(subpath, path,
> +                               sizeof(subpath));
> +                       subpath[sizeof(subpath) - 1] = '\0';
> +                       strncat(subpath, "/",
> +                               sizeof(subpath) - strlen(subpath) - 1);
> +                       strncat(subpath, entry->d_name,
> +                               sizeof(subpath) - strlen(subpath) - 1);
> +
> +                       ret = delete_recursive_dir(subpath);
> +                       if (ret) {
> +                               goto end;
> +                       }
> +
> +                       ret = unlinkat(dir_fd, entry->d_name, AT_REMOVEDIR);
> +                       if (ret) {
> +                               PERROR("Unlinking '%s'", entry->d_name);
> +                               goto end;
> +                       }

I have removed this unlinkat() to perform an rmdir() at the end to
always remove the "root" on which we are called.
This simplifies the caller in main() and this "case".

> +
>                         break;
> +               }
>                 case DT_REG:
> -                       unlinkat(trace_dir_fd, entry->d_name, 0);
> +                       ret = unlinkat(dir_fd, entry->d_name, 0);
> +                       if (ret) {
> +                               PERROR("Unlinking '%s'", entry->d_name);
> +                               goto end;
> +                       }
> +
>                         break;
>                 default:
>                         ret = -EINVAL;
> @@ -1089,13 +1116,10 @@ int delete_trace(const char *trace_path)
>                 }
>         }
>  end:
> -       closeret = closedir(trace_dir);
> +       closeret = closedir(dir);
>         if (closeret) {
>                 PERROR("closedir");
>         }
> -       if (!ret) {
> -               ret = rmdir(trace_path);
> -       }
>         return ret;
>  }
>
> @@ -1178,9 +1202,16 @@ int main(int argc, char *argv[])
>                         has_warning = 1;
>
>                 /* unlink temporary trace */
> -               ret = delete_trace(output_path);
> -               if (ret)
> +               ret = delete_recursive_dir(output_path);
> +               if (ret){

Missing space here ^.

>                         has_warning = 1;
> +               }else{

Missing spaces around "else" here ^.

> +                       ret = rmdir(output_path);
> +                       if (ret) {
> +                               PERROR("Deleting '%s'", output_path);
> +                               has_warning = 1;
> +                       }
> +               }
>         }
>         if (has_warning)
>                 exit(EXIT_FAILURE);
> --
> 2.1.4
>



-- 
Jérémie Galarneau
EfficiOS Inc.
http://www.efficios.com



More information about the lttng-dev mailing list