Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ac2bf29d authored by Riley Andrews's avatar Riley Andrews Committed by Android Git Automerger
Browse files

am 53432b46: Merge "fix memory leak in copy_remote_dir_local"

* commit '53432b46':
  fix memory leak in copy_remote_dir_local
parents dd2fe64c 53432b46
Loading
Loading
Loading
Loading
+43 −19
Original line number Diff line number Diff line
@@ -893,6 +893,21 @@ static int set_time_and_mode(const char *lpath, unsigned int time, unsigned int
    return r1 ? : r2;
}

/* Return a copy of the path string with / appended if needed */
static char *add_slash_to_path(const char *path)
{
    if (path[strlen(path) - 1] != '/') {
        size_t len = strlen(path) + 2;
        char *path_with_slash = malloc(len);
        if (path_with_slash == NULL)
            return NULL;
        snprintf(path_with_slash, len, "%s/", path);
        return path_with_slash;
    } else {
        return strdup(path);
    }
}

static int copy_remote_dir_local(int fd, const char *rpath, const char *lpath,
                                 int copy_attrs)
{
@@ -900,28 +915,32 @@ static int copy_remote_dir_local(int fd, const char *rpath, const char *lpath,
    copyinfo *ci, *next;
    int pulled = 0;
    int skipped = 0;
    char *rpath_clean = NULL;
    char *lpath_clean = NULL;
    int ret = 0;

    if (rpath[0] == '\0' || lpath[0] == '\0') {
        ret = -1;
        goto finish;
    }

    /* Make sure that both directory paths end in a slash. */
    if (rpath[0] == 0 || lpath[0] == 0) return -1;
    if (rpath[strlen(rpath) - 1] != '/') {
        int  tmplen = strlen(rpath) + 2;
        char *tmp = malloc(tmplen);
        if (tmp == 0) return -1;
        snprintf(tmp, tmplen, "%s/", rpath);
        rpath = tmp;
    rpath_clean = add_slash_to_path(rpath);
    if (!rpath_clean) {
        ret = -1;
        goto finish;
    }
    if (lpath[strlen(lpath) - 1] != '/') {
        int  tmplen = strlen(lpath) + 2;
        char *tmp = malloc(tmplen);
        if (tmp == 0) return -1;
        snprintf(tmp, tmplen, "%s/", lpath);
        lpath = tmp;
    lpath_clean = add_slash_to_path(lpath);
    if (!lpath_clean) {
        ret = -1;
        goto finish;
    }

    fprintf(stderr, "pull: building file list...\n");
    /* Recursively build the list of files to copy. */
    if (remote_build_list(fd, &filelist, rpath, lpath)) {
        return -1;
    fprintf(stderr, "pull: building file list...\n");
    if (remote_build_list(fd, &filelist, rpath_clean, lpath_clean)) {
        ret = -1;
        goto finish;
    }

    for (ci = filelist; ci != 0; ci = next) {
@@ -929,11 +948,13 @@ static int copy_remote_dir_local(int fd, const char *rpath, const char *lpath,
        if (ci->flag == 0) {
            fprintf(stderr, "pull: %s -> %s\n", ci->src, ci->dst);
            if (sync_recv(fd, ci->src, ci->dst, 0 /* no show progress */)) {
                return 1;
                ret = -1;
                goto finish;
            }

            if (copy_attrs && set_time_and_mode(ci->dst, ci->time, ci->mode)) {
               return 1;
                ret = -1;
                goto finish;
            }
            pulled++;
        } else {
@@ -946,7 +967,10 @@ static int copy_remote_dir_local(int fd, const char *rpath, const char *lpath,
            pulled, (pulled == 1) ? "" : "s",
            skipped, (skipped == 1) ? "" : "s");

    return 0;
finish:
    free(lpath_clean);
    free(rpath_clean);
    return ret;
}

int do_sync_pull(const char *rpath, const char *lpath, int show_progress, int copy_attrs)