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

Commit 4425c1d9 authored by Yabin Cui's avatar Yabin Cui
Browse files

Fix some memory leaks.

Bug: 26906328
Change-Id: Iebaf03db0cb3054f91715f8c849be6087d01b27b
parent c213a7c1
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -124,20 +124,20 @@ try_update_binary(const char* path, ZipArchive* zip, bool* wipe_cache) {
    //   - the name of the package zip file.
    //

    const char** args = (const char**)malloc(sizeof(char*) * 5);
    const char* args[5];
    args[0] = binary;
    args[1] = EXPAND(RECOVERY_API_VERSION);   // defined in Android.mk
    char* temp = (char*)malloc(10);
    sprintf(temp, "%d", pipefd[1]);
    char temp[16];
    snprintf(temp, sizeof(temp), "%d", pipefd[1]);
    args[2] = temp;
    args[3] = (char*)path;
    args[3] = path;
    args[4] = NULL;

    pid_t pid = fork();
    if (pid == 0) {
        umask(022);
        close(pipefd[0]);
        execv(binary, (char* const*)args);
        execv(binary, const_cast<char**>(args));
        fprintf(stdout, "E:Can't run %s (%s)\n", binary, strerror(errno));
        _exit(-1);
    }
+9 −13
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@
#include <linux/fb.h>
#include <linux/kd.h>

#include <vector>
#include <png.h>

#include "minui.h"
@@ -398,18 +399,13 @@ int res_create_localized_alpha_surface(const char* name,
    png_infop info_ptr = NULL;
    png_uint_32 width, height;
    png_byte channels;
    unsigned char* row;
    png_uint_32 y;
    std::vector<unsigned char> row;

    *pSurface = NULL;

    if (locale == NULL) {
        surface = malloc_surface(0);
        surface->width = 0;
        surface->height = 0;
        surface->row_bytes = 0;
        surface->pixel_bytes = 1;
        goto exit;
        return result;
    }

    result = open_png(name, &png_ptr, &info_ptr, &width, &height, &channels);
@@ -420,13 +416,13 @@ int res_create_localized_alpha_surface(const char* name,
        goto exit;
    }

    row = reinterpret_cast<unsigned char*>(malloc(width));
    row.resize(width);
    for (y = 0; y < height; ++y) {
        png_read_row(png_ptr, row, NULL);
        png_read_row(png_ptr, row.data(), NULL);
        int w = (row[1] << 8) | row[0];
        int h = (row[3] << 8) | row[2];
        int len = row[4];
        char* loc = (char*)row+5;
        char* loc = reinterpret_cast<char*>(&row[5]);

        if (y+1+h >= height || matches_locale(loc, locale)) {
            printf("  %20s: %s (%d x %d @ %d)\n", name, loc, w, h, y);
@@ -443,8 +439,8 @@ int res_create_localized_alpha_surface(const char* name,

            int i;
            for (i = 0; i < h; ++i, ++y) {
                png_read_row(png_ptr, row, NULL);
                memcpy(surface->data + i*w, row, w);
                png_read_row(png_ptr, row.data(), NULL);
                memcpy(surface->data + i*w, row.data(), w);
            }

            *pSurface = reinterpret_cast<GRSurface*>(surface);
@@ -452,7 +448,7 @@ int res_create_localized_alpha_surface(const char* name,
        } else {
            int i;
            for (i = 0; i < h; ++i, ++y) {
                png_read_row(png_ptr, row, NULL);
                png_read_row(png_ptr, row.data(), NULL);
            }
        }
    }
+1 −1
Original line number Diff line number Diff line
@@ -4,7 +4,7 @@ include $(CLEAR_VARS)
LOCAL_SRC_FILES := \
	Hash.c \
	SysUtil.c \
	DirUtil.c \
	DirUtil.cpp \
	Inlines.c \
	Zip.c

+20 −41
Original line number Diff line number Diff line
@@ -24,6 +24,8 @@
#include <dirent.h>
#include <limits.h>

#include <string>

#include "DirUtil.h"

typedef enum { DMISSING, DDIR, DILLEGAL } DirStatus;
@@ -66,43 +68,25 @@ dirCreateHierarchy(const char *path, int mode,
        errno = ENOENT;
        return -1;
    }

    /* Allocate a path that we can modify; stick a slash on
     * the end to make things easier.
     */
    size_t pathLen = strlen(path);
    char *cpath = (char *)malloc(pathLen + 2);
    if (cpath == NULL) {
        errno = ENOMEM;
        return -1;
    }
    memcpy(cpath, path, pathLen);
    // Allocate a path that we can modify; stick a slash on
    // the end to make things easier.
    std::string cpath = path;
    if (stripFileName) {
        /* Strip everything after the last slash.
         */
        char *c = cpath + pathLen - 1;
        while (c != cpath && *c != '/') {
            c--;
        }
        if (c == cpath) {
            //xxx test this path
            /* No directory component.  Act like the path was empty.
             */
        // Strip everything after the last slash.
        size_t pos = cpath.rfind('/');
        if (pos == std::string::npos) {
            errno = ENOENT;
            free(cpath);
            return -1;
        }
        c[1] = '\0';    // Terminate after the slash we found.
        cpath.resize(pos + 1);
    } else {
        /* Make sure that the path ends in a slash.
         */
        cpath[pathLen] = '/';
        cpath[pathLen + 1] = '\0';
        // Make sure that the path ends in a slash.
        cpath.push_back('/');
    }

    /* See if it already exists.
     */
    ds = getPathDirStatus(cpath);
    ds = getPathDirStatus(cpath.c_str());
    if (ds == DDIR) {
        return 0;
    } else if (ds == DILLEGAL) {
@@ -112,7 +96,8 @@ dirCreateHierarchy(const char *path, int mode,
    /* Walk up the path from the root and make each level.
     * If a directory already exists, no big deal.
     */
    char *p = cpath;
    const char *path_start = &cpath[0];
    char *p = &cpath[0];
    while (*p != '\0') {
        /* Skip any slashes, watching out for the end of the string.
         */
@@ -135,12 +120,11 @@ dirCreateHierarchy(const char *path, int mode,
        /* Check this part of the path and make a new directory
         * if necessary.
         */
        ds = getPathDirStatus(cpath);
        ds = getPathDirStatus(path_start);
        if (ds == DILLEGAL) {
            /* Could happen if some other process/thread is
             * messing with the filesystem.
             */
            free(cpath);
            return -1;
        } else if (ds == DMISSING) {
            int err;
@@ -148,11 +132,11 @@ dirCreateHierarchy(const char *path, int mode,
            char *secontext = NULL;

            if (sehnd) {
                selabel_lookup(sehnd, &secontext, cpath, mode);
                selabel_lookup(sehnd, &secontext, path_start, mode);
                setfscreatecon(secontext);
            }

            err = mkdir(cpath, mode);
            err = mkdir(path_start, mode);

            if (secontext) {
                freecon(secontext);
@@ -160,22 +144,17 @@ dirCreateHierarchy(const char *path, int mode,
            }

            if (err != 0) {
                free(cpath);
                return -1;
            }
            if (timestamp != NULL && utime(cpath, timestamp)) {
                free(cpath);
            if (timestamp != NULL && utime(path_start, timestamp)) {
                return -1;
            }
        }
        // else, this directory already exists.

        /* Repair the path and continue.
         */
        // Repair the path and continue.
        *p = '/';
    }
    free(cpath);

    return 0;
}