aboutsummaryrefslogtreecommitdiffstats
path: root/src/firejail/util.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/firejail/util.c')
-rw-r--r--src/firejail/util.c42
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
539char *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
536void check_unsigned(const char *str, const char *msg) { 576void 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");