Fix installation of more than one widget
[src/app-framework-main.git] / src / wgtpkg-install.c
index a405cfa..c4e70e3 100644 (file)
@@ -56,14 +56,19 @@ static int check_valid_string(const char *value, const char *name)
                return -1;
        pos = 0;
        c = value[pos];
-       while(c) {
+       if (c == 0) {
+               ERROR("empty string forbidden in '%s' (temporary constraints)", name);
+               errno = EINVAL;
+               return -1;                      
+       }
+       do {
                if (!isalnum(c) && !strchr(".-_", c)) {
                        ERROR("forbidden char %c in '%s' -> '%s' (temporary constraints)", c, name, value);
                        errno = EINVAL;
                        return -1;                      
                }
                c = value[++pos];
-       }
+       } while(c);
        return 0;
 }
 
@@ -121,7 +126,7 @@ static int move_widget(const char *root, const struct wgt_desc *desc, int force)
        int rc;
 
        rc = snprintf(newdir, sizeof newdir, "%s/%s/%s", root, desc->id, desc->ver);
-       if (rc >= sizeof newdir) {
+       if (rc >= (int)sizeof newdir) {
                ERROR("path to long in move_widget");
                errno = EINVAL;
                return -1;
@@ -137,15 +142,15 @@ static int install_icon(const struct wgt_desc *desc)
        int rc;
 
        create_directory(FWK_ICON_DIR, 0755, 1);
-       rc = snprintf(link, sizeof link, "%s/%s@%s", FWK_ICON_DIR, desc->id, desc->ver);
-       if (rc >= sizeof link) {
+       rc = snprintf(link, sizeof link, "%s/%s", FWK_ICON_DIR, desc->idaver);
+       if (rc >= (int)sizeof link) {
                ERROR("link to long in install_icon");
                errno = EINVAL;
                return -1;
        }
 
        rc = snprintf(target, sizeof target, "%s/%s", workdir, desc->icons->src);
-       if (rc >= sizeof target) {
+       if (rc >= (int)sizeof target) {
                ERROR("target to long in install_icon");
                errno = EINVAL;
                return -1;
@@ -162,8 +167,8 @@ static int install_security(const struct wgt_desc *desc)
 {
        char path[PATH_MAX], *head;
        const char *icon, *perm;
-       int rc, len, lic, lf;
-       unsigned int i, n;
+       int rc;
+       unsigned int i, n, len, lic, lf;
        struct filedesc *f;
 
        rc = secmgr_init(desc->id);
@@ -176,8 +181,8 @@ static int install_security(const struct wgt_desc *desc)
 
        /* instal the files */
        head = stpcpy(path, workdir);
-       assert(sizeof path > (head - path));
-       len = (int)(sizeof path - (head - path));
+       assert(head < path + sizeof path);
+       len = (unsigned)((path + sizeof path) - head);
        if (!len) {
                ERROR("root path too long in install_security");
                errno = ENAMETOOLONG;
@@ -186,12 +191,12 @@ static int install_security(const struct wgt_desc *desc)
        len--;
        *head++ = '/';
        icon = desc->icons->src;
-       lic = (int)strlen(icon);
+       lic = (unsigned)strlen(icon);
        n = file_count();
        i = 0;
        while(i < n) {
                f = file_of_index(i++);
-               lf = (int)strlen(f->name);
+               lf = (unsigned)strlen(f->name);
                if (lf >= len) {
                        ERROR("path too long in install_security");
                        errno = ENAMETOOLONG;
@@ -233,7 +238,7 @@ struct wgt_info *install_widget(const char *wgtfile, const char *root, int force
 
        /* workdir */
        create_directory(root, 0755, 1);
-       if (make_workdir_base(root, "TMP", 0)) {
+       if (make_workdir(root, "TMP", 0)) {
                ERROR("failed to create a working directory");
                goto error1;
        }
@@ -248,6 +253,7 @@ struct wgt_info *install_widget(const char *wgtfile, const char *root, int force
        if (!ifo)
                goto error2;
 
+       reset_requested_permissions();
        desc = wgt_info_desc(ifo);
        if (check_widget(desc))
                goto error3;