]> pd.if.org Git - zpackage/blobdiff - lib/zpm.c
fix pointer related bugs
[zpackage] / lib / zpm.c
index 9eb69c286b568e01708bbb707cb36f8434ebeee4..e775b1209809f36c22ba7584d1036168a442432d 100644 (file)
--- a/lib/zpm.c
+++ b/lib/zpm.c
@@ -114,18 +114,6 @@ void uncompresslzma(void *buf, size_t bufsize, FILE *out);
 #define SQLERROR(x) fprintf(stderr, "%s %d: %s\n", __func__, __LINE__, (x))
 #endif
 
-static char *dupstr(char *s) {
-       size_t n;
-       char *d;
-
-       n = strlen(s);
-       d = malloc(n+1);
-       if (d) {
-               d = strcpy(d, s);
-       }
-       return d;
-}
-
 #if 0
 int zpm_newpkg(struct zpm *z, char *base, char *version, int release) {
        char *sql = "insert or ignore into packages (package,version,release) values (?,?,?)";
@@ -340,6 +328,10 @@ int zpm_init(struct zpm *pkg, char *path) {
        sqlite3 *db = 0;
        int appid;
 
+       if (!pkg) {
+               return 0;
+       }
+
        zpm_clearmem(pkg);
 
        rc = sqlite3_open_v2(path, &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
@@ -374,6 +366,7 @@ int zpm_init(struct zpm *pkg, char *path) {
                pkg->db = 0;
                return 0;
        }
+       zpm_addvercmp(pkg);
 
        return 1;
 }
@@ -401,6 +394,7 @@ int zpm_open(struct zpm *zpm, char *path) {
                zpm->error = 1;
                return 0;
        }
+       zpm_addvercmp(zpm);
 
        return 1;
 }
@@ -430,37 +424,6 @@ int zpm_addvercmp(struct zpm *pkg) {
                        );
 }
 
-/* set package struct variables, database, environment, then command line */
-int zpm_readopts(struct zpm *zpm, int ac, char **av) {
-       char *ev;
-       struct zpm_package *pkg;
-
-       if (!zpm) {
-               return -1;
-       }
-
-               pkg = zpm->current_package;
-
-       if (pkg) {
-               ev = getenv("ZPMPACKAGE");
-               if (ev) {
-                       pkg->name = dupstr(ev);
-               }
-               ev = getenv("ZPMPKGREL");
-               if (ev) {
-                       pkg->release = strtol(ev, 0, 0);
-               }
-               ev = getenv("ZPMPKGVER");
-               if (ev) {
-                       pkg->version = dupstr(ev);
-               }
-       }
-
-       /* now, parse the options, return optind so the caller can adjust if needed */
-
-       return av ? ac : 1;
-}
-
 int zpm_extract(struct zpm *pkg, char *hash, char *path, int mode) {
        int rc;
 
@@ -543,7 +506,7 @@ int zpm_extract(struct zpm *pkg, char *hash, char *path, int mode) {
        return 1;
 }
 
-static sqlite3_stmt *run_for_hash(sqlite3 *db, char *sql, char *hash) {
+static int run_for_hash(sqlite3 *db, char *sql, char *hash) {
        int rc;
        sqlite3_stmt *ifile;
 
@@ -556,10 +519,17 @@ static sqlite3_stmt *run_for_hash(sqlite3 *db, char *sql, char *hash) {
        /* hash, filename */
 
        sqlite3_bind_text(ifile, 1, hash, 64, SQLITE_STATIC);
+       do {
+               rc = sqlite3_step(ifile);
+       } while (rc == SQLITE_ROW);
+
+       sqlite3_finalize(ifile);
 
-       return ifile;
+       return rc == SQLITE_DONE;
 }
 
+#define SQLERP(db, msg) fprintf(stderr, "%s: %s\n", msg, sqlite3_errmsg(db))
+
 static int set_elf_info(sqlite3 *db, char *hash, char *content, size_t length) {
        if (length >= sizeof (Elf64_Ehdr) && libelf_iself(content)) {
                char *strtab;
@@ -570,54 +540,21 @@ static int set_elf_info(sqlite3 *db, char *hash, char *content, size_t length) {
                sqlite3_stmt *ifile;
                int rc;
 
-               /* go ahead and set up elf information now */
                /* clear existing for this hash */
-               ifile = run_for_hash(db, "delete from elfinfo where file = ?", hash);
-               do {
-                       rc = sqlite3_step(ifile);
-#if 0
-                       if (rc == SQLITE_ROW) {
-                               int nc;
-                               fprintf(stderr, "delete row has %d columns: ", sqlite3_column_count(ifile));
-                               nc = sqlite3_column_count(ifile);
-                               for (i = 0; i < nc; i++) {
-                                       char *r;
-                                       r = sqlite3_column_text(ifile, i);
-                                       fprintf(stderr, ", %s", r);
-                               }
-                               fprintf(stderr, "\n");
-                       }
-#endif
-               } while (rc == SQLITE_ROW);
-               if (rc != SQLITE_DONE) {
-                       SQLERROR(sqlite3_errmsg(db));
-                       sqlite3_finalize(ifile);
-                       fprintf(stderr, "error clearing elf info: %d\n", rc);
+               if (!run_for_hash(db, "delete from elfinfo where file = ?", hash)) {
+                       SQLERP(db, "error clearing elf info");
                        return 0;
                }
-               sqlite3_finalize(ifile);
-               ifile = run_for_hash(db, "delete from elflibraries where file = ?", hash);
-               do {
-                       rc = sqlite3_step(ifile);
-               } while (rc == SQLITE_ROW);
-               if (rc != SQLITE_DONE) {
-                       SQLERROR(sqlite3_errmsg(db));
-                       sqlite3_finalize(ifile);
-                       fprintf(stderr, "error clearing elf library: %d\n", rc);
+
+               if (!run_for_hash(db, "delete from elflibraries where file = ?", hash)) {
+                       SQLERP(db, "error clearing elf library");
                        return 0;
                }
-               sqlite3_finalize(ifile);
-               ifile = run_for_hash(db, "delete from elfneeded where file = ?", hash);
-               do {
-                       rc = sqlite3_step(ifile);
-               } while (rc == SQLITE_ROW);
-               if (rc != SQLITE_DONE) {
-                       SQLERROR(sqlite3_errmsg(db));
-                       sqlite3_finalize(ifile);
-                       fprintf(stderr, "error clearing elf needed\n");
+
+               if (!run_for_hash(db, "delete from elfneeded where file = ?", hash)) {
+                       SQLERP(db, "error clearing elf needed");
                        return 0;
                }
-               sqlite3_finalize(ifile);
 
                hdr = libelf_header(content);
                /* if lib, set soname */
@@ -643,7 +580,7 @@ static int set_elf_info(sqlite3 *db, char *hash, char *content, size_t length) {
 
                /* if exe, set neededs */
                if (libelf_type(content) == ET_EXEC) {
-                       Elf64_Shdr *dsect;
+                       Elf64_Shdr *dsect = 0;
                        char *elf;
 
                        elf = (char *)content;
@@ -654,10 +591,17 @@ static int set_elf_info(sqlite3 *db, char *hash, char *content, size_t length) {
                                        dsect = (Elf64_Shdr *)(elf + phdr->p_offset);
                                }
                        }
+                       if (!dsect) {
+                               /* no dynamic section found */
+                               return 1;
+                       }
+
+#if 0
                        dyn = (Elf64_Dyn *)(elf + dsect->sh_offset);
                        if (!dyn) {
                                exit(9);
                        }
+#endif
                        dyn = (Elf64_Dyn *)dsect;
 
                        dsect = libelf_section(elf, SHT_DYNAMIC);
@@ -681,9 +625,8 @@ static int set_elf_info(sqlite3 *db, char *hash, char *content, size_t length) {
 #endif
                                        rc = sqlite3_step(ifile);
                                        if (rc != SQLITE_DONE) {
-                                               SQLERROR(sqlite3_errmsg(db));
+                                               SQLERP(db, "error setting needed library");
                                                sqlite3_finalize(ifile);
-                                               fprintf(stderr, "error setting needed library\n");
                                                return 0;
                                        }
                                        sqlite3_reset(ifile);