diff options
Diffstat (limited to 'fs/exec.c')
-rw-r--r-- | fs/exec.c | 50 |
1 files changed, 34 insertions, 16 deletions
@@ -982,33 +982,51 @@ void compute_creds(struct linux_binprm *bprm) | |||
982 | task_unlock(current); | 982 | task_unlock(current); |
983 | security_bprm_post_apply_creds(bprm); | 983 | security_bprm_post_apply_creds(bprm); |
984 | } | 984 | } |
985 | |||
986 | EXPORT_SYMBOL(compute_creds); | 985 | EXPORT_SYMBOL(compute_creds); |
987 | 986 | ||
987 | /* | ||
988 | * Arguments are '\0' separated strings found at the location bprm->p | ||
989 | * points to; chop off the first by relocating brpm->p to right after | ||
990 | * the first '\0' encountered. | ||
991 | */ | ||
988 | void remove_arg_zero(struct linux_binprm *bprm) | 992 | void remove_arg_zero(struct linux_binprm *bprm) |
989 | { | 993 | { |
990 | if (bprm->argc) { | 994 | if (bprm->argc) { |
991 | unsigned long offset; | 995 | char ch; |
992 | char * kaddr; | ||
993 | struct page *page; | ||
994 | 996 | ||
995 | offset = bprm->p % PAGE_SIZE; | 997 | do { |
996 | goto inside; | 998 | unsigned long offset; |
999 | unsigned long index; | ||
1000 | char *kaddr; | ||
1001 | struct page *page; | ||
997 | 1002 | ||
998 | while (bprm->p++, *(kaddr+offset++)) { | 1003 | offset = bprm->p & ~PAGE_MASK; |
999 | if (offset != PAGE_SIZE) | 1004 | index = bprm->p >> PAGE_SHIFT; |
1000 | continue; | 1005 | |
1001 | offset = 0; | 1006 | page = bprm->page[index]; |
1002 | kunmap_atomic(kaddr, KM_USER0); | ||
1003 | inside: | ||
1004 | page = bprm->page[bprm->p/PAGE_SIZE]; | ||
1005 | kaddr = kmap_atomic(page, KM_USER0); | 1007 | kaddr = kmap_atomic(page, KM_USER0); |
1006 | } | 1008 | |
1007 | kunmap_atomic(kaddr, KM_USER0); | 1009 | /* run through page until we reach end or find NUL */ |
1010 | do { | ||
1011 | ch = *(kaddr + offset); | ||
1012 | |||
1013 | /* discard that character... */ | ||
1014 | bprm->p++; | ||
1015 | offset++; | ||
1016 | } while (offset < PAGE_SIZE && ch != '\0'); | ||
1017 | |||
1018 | kunmap_atomic(kaddr, KM_USER0); | ||
1019 | |||
1020 | /* free the old page */ | ||
1021 | if (offset == PAGE_SIZE) { | ||
1022 | __free_page(page); | ||
1023 | bprm->page[index] = NULL; | ||
1024 | } | ||
1025 | } while (ch != '\0'); | ||
1026 | |||
1008 | bprm->argc--; | 1027 | bprm->argc--; |
1009 | } | 1028 | } |
1010 | } | 1029 | } |
1011 | |||
1012 | EXPORT_SYMBOL(remove_arg_zero); | 1030 | EXPORT_SYMBOL(remove_arg_zero); |
1013 | 1031 | ||
1014 | /* | 1032 | /* |