]> git.armaanb.net Git - stagit.git/commitdiff
fix path join '/'
authorHiltjo Posthuma <hiltjo@codemadness.org>
Sun, 1 May 2016 12:38:57 +0000 (14:38 +0200)
committerHiltjo Posthuma <hiltjo@codemadness.org>
Sun, 1 May 2016 12:51:02 +0000 (14:51 +0200)
add joinpath() function to handle this.

stagit-index.c
stagit.c

index 412721d078115e1eb49a906f8871e34f63793df7..2d7bf8579d303cdd264a1e0cfcaed7023a3bda88 100644 (file)
@@ -140,13 +140,25 @@ err:
        return ret;
 }
 
+void
+joinpath(char *buf, size_t bufsiz, const char *path, const char *path2)
+{
+       int r;
+
+       r = snprintf(buf, bufsiz, "%s%s%s",
+               repodir, path[0] && path[strlen(path) - 1] != '/' ? "/" : "", path2);
+       if (r == -1 || (size_t)r >= bufsiz)
+               errx(1, "path truncated: '%s%s%s'",
+                       path, path[0] && path[strlen(path) - 1] != '/' ? "/" : "", path2);
+}
+
 int
 main(int argc, char *argv[])
 {
        const git_error *e = NULL;
        FILE *fp;
        char path[PATH_MAX], repodirabs[PATH_MAX + 1];
-       int i, r, ret = 0;
+       int i, ret = 0;
 
        if (argc < 2) {
                fprintf(stderr, "%s [repodir...]\n", argv[0]);
@@ -176,20 +188,12 @@ main(int argc, char *argv[])
                        name = "";
 
                /* read description or .git/description */
-               description[0] = '\0';
-               r = snprintf(path, sizeof(path), "%s%s%s",
-                       repodir, repodir[strlen(repodir)] == '/' ? "" : "/", "description");
-               if (r == -1 || (size_t)r >= sizeof(path))
-                       errx(1, "path truncated: '%s%s%s'",
-                               repodir, repodir[strlen(repodir)] == '/' ? "" : "/", "description");
+               joinpath(path, sizeof(path), repodir, "description");
                if (!(fp = fopen(path, "r"))) {
-                       r = snprintf(path, sizeof(path), "%s%s%s",
-                               repodir, repodir[strlen(repodir)] == '/' ? "" : "/", ".git/description");
-                       if (r == -1 || (size_t)r >= sizeof(path))
-                               errx(1, "path truncated: '%s%s%s'",
-                                       repodir, repodir[strlen(repodir)] == '/' ? "" : "/", ".git/description");
+                       joinpath(path, sizeof(path), repodir, ".git/description");
                        fp = fopen(path, "r");
                }
+               description[0] = '\0';
                if (fp) {
                        if (!fgets(description, sizeof(description), fp))
                                description[0] = '\0';
@@ -197,20 +201,12 @@ main(int argc, char *argv[])
                }
 
                /* read owner or .git/owner */
-               owner[0] = '\0';
-               r = snprintf(path, sizeof(path), "%s%s%s",
-                       repodir, repodir[strlen(repodir)] == '/' ? "" : "/", "owner");
-               if (r == -1 || (size_t)r >= sizeof(path))
-                       errx(1, "path truncated: '%s%s%s'",
-                               repodir, repodir[strlen(repodir)] == '/' ? "" : "/", "owner");
+               joinpath(path, sizeof(path), repodir, "owner");
                if (!(fp = fopen(path, "r"))) {
-                       r = snprintf(path, sizeof(path), "%s%s%s",
-                               repodir, repodir[strlen(repodir)] == '/' ? "" : "/", ".git/owner");
-                       if (r == -1 || (size_t)r >= sizeof(path))
-                               errx(1, "path truncated: '%s%s%s'",
-                                       repodir, repodir[strlen(repodir)] == '/' ? "" : "/", ".git/owner");
+                       joinpath(path, sizeof(path), repodir, ".git/owner");
                        fp = fopen(path, "r");
                }
+               owner[0] = '\0';
                if (fp) {
                        if (!fgets(owner, sizeof(owner), fp))
                                owner[0] = '\0';
index f5216d2d48524827e26f60df30fe9dc2815a8bac..24a630d35621e79d2924df6fac2f08d9d09d8cc7 100644 (file)
--- a/stagit.c
+++ b/stagit.c
@@ -970,6 +970,18 @@ err:
        return 0;
 }
 
+void
+joinpath(char *buf, size_t bufsiz, const char *path, const char *path2)
+{
+       int r;
+
+       r = snprintf(buf, bufsiz, "%s%s%s",
+               repodir, path[0] && path[strlen(path) - 1] != '/' ? "/" : "", path2);
+       if (r == -1 || (size_t)r >= bufsiz)
+               errx(1, "path truncated: '%s%s%s'",
+                       path, path[0] && path[strlen(path) - 1] != '/' ? "/" : "", path2);
+}
+
 int
 main(int argc, char *argv[])
 {
@@ -978,13 +990,14 @@ main(int argc, char *argv[])
        const git_error *e = NULL;
        FILE *fp, *fpread;
        char path[PATH_MAX], repodirabs[PATH_MAX + 1], *p;
-       int r, status;
+       int status;
 
        if (argc != 2) {
                fprintf(stderr, "%s <repodir>\n", argv[0]);
                return 1;
        }
        repodir = argv[1];
+
        if (!realpath(repodir, repodirabs))
                err(1, "realpath");
 
@@ -1017,17 +1030,9 @@ main(int argc, char *argv[])
                        *p = '\0';
 
        /* read description or .git/description */
-       r = snprintf(path, sizeof(path), "%s%s%s",
-               repodir, repodir[strlen(repodir)] == '/' ? "" : "/", "description");
-       if (r == -1 || (size_t)r >= sizeof(path))
-               errx(1, "path truncated: '%s%s%s'",
-                       repodir, repodir[strlen(repodir)] == '/' ? "" : "/", "description");
+       joinpath(path, sizeof(path), repodir, "description");
        if (!(fpread = fopen(path, "r"))) {
-               r = snprintf(path, sizeof(path), "%s%s%s",
-                       repodir, repodir[strlen(repodir)] == '/' ? "" : "/", ".git/description");
-               if (r == -1 || (size_t)r >= sizeof(path))
-                       errx(1, "path truncated: '%s%s%s'",
-                               repodir, repodir[strlen(repodir)] == '/' ? "" : "/", ".git/description");
+               joinpath(path, sizeof(path), repodir, ".git/description");
                fpread = fopen(path, "r");
        }
        if (fpread) {
@@ -1037,17 +1042,9 @@ main(int argc, char *argv[])
        }
 
        /* read url or .git/url */
-       r = snprintf(path, sizeof(path), "%s%s%s",
-               repodir, repodir[strlen(repodir)] == '/' ? "" : "/", "url");
-       if (r == -1 || (size_t)r >= sizeof(path))
-               errx(1, "path truncated: '%s%s%s'",
-                       repodir, repodir[strlen(repodir)] == '/' ? "" : "/", "url");
+       joinpath(path, sizeof(path), repodir, "url");
        if (!(fpread = fopen(path, "r"))) {
-               r = snprintf(path, sizeof(path), "%s%s%s",
-                       repodir, repodir[strlen(repodir)] == '/' ? "" : "/", ".git/url");
-               if (r == -1 || (size_t)r >= sizeof(path))
-                       errx(1, "path truncated: '%s%s%s'",
-                               repodir, repodir[strlen(repodir)] == '/' ? "" : "/", ".git/url");
+               joinpath(path, sizeof(path), repodir, ".git/url");
                fpread = fopen(path, "r");
        }
        if (fpread) {