diff options
Diffstat (limited to 'src/firejail/util.c')
-rw-r--r-- | src/firejail/util.c | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/src/firejail/util.c b/src/firejail/util.c index ae07a42b0..0d1418b43 100644 --- a/src/firejail/util.c +++ b/src/firejail/util.c | |||
@@ -533,6 +533,46 @@ char *split_comma(char *str) { | |||
533 | } | 533 | } |
534 | 534 | ||
535 | 535 | ||
536 | // remove consecutive and trailing slashes | ||
537 | // and return allocated memory | ||
538 | // e.g. /home//user/ -> /home/user | ||
539 | char *clean_pathname(const char *path) { | ||
540 | assert(path); | ||
541 | size_t len = strlen(path); | ||
542 | char *rv = calloc(len + 1, 1); | ||
543 | if (!rv) | ||
544 | errExit("calloc"); | ||
545 | |||
546 | if (len > 0) { | ||
547 | int i, j, cnt; | ||
548 | for (i = 0, j = 0, cnt = 0; i < len; i++) { | ||
549 | if (path[i] == '/') | ||
550 | cnt++; | ||
551 | else | ||
552 | cnt = 0; | ||
553 | |||
554 | if (cnt < 2) { | ||
555 | rv[j] = path[i]; | ||
556 | j++; | ||
557 | } | ||
558 | } | ||
559 | |||
560 | // remove a trailing slash | ||
561 | if (j > 1 && rv[j - 1] == '/') | ||
562 | rv[j - 1] = '\0'; | ||
563 | |||
564 | size_t new_len = strlen(rv); | ||
565 | if (new_len < len) { | ||
566 | rv = realloc(rv, new_len + 1); | ||
567 | if (!rv) | ||
568 | errExit("realloc"); | ||
569 | } | ||
570 | } | ||
571 | |||
572 | return rv; | ||
573 | } | ||
574 | |||
575 | |||
536 | void check_unsigned(const char *str, const char *msg) { | 576 | void check_unsigned(const char *str, const char *msg) { |
537 | EUID_ASSERT(); | 577 | EUID_ASSERT(); |
538 | const char *ptr = str; | 578 | const char *ptr = str; |
@@ -656,7 +696,7 @@ void extract_command_name(int index, char **argv) { | |||
656 | // command name is a substring of cfg.command_name | 696 | // command name is a substring of cfg.command_name |
657 | if (basename != cfg.command_name || *ptr != '\0') { | 697 | if (basename != cfg.command_name || *ptr != '\0') { |
658 | *ptr = '\0'; | 698 | *ptr = '\0'; |
659 | 699 | ||
660 | basename = strdup(basename); | 700 | basename = strdup(basename); |
661 | if (!basename) | 701 | if (!basename) |
662 | errExit("strdup"); | 702 | errExit("strdup"); |