diff options
author | Andreas Schneider <asn@samba.org> | 2019-11-15 09:58:27 +0100 |
---|---|---|
committer | Andreas Schneider <asn@samba.org> | 2019-11-15 11:35:48 +0100 |
commit | 047e9fb616d21e202add9f16347cea2084444104 (patch) | |
tree | 39eaa48abc52bcc774078bf99d9aea1e2667db13 | |
parent | 50036d052a5746c91d94ceb7eb68a1aa9d8554fb (diff) | |
download | pam_wrapper-047e9fb616d21e202add9f16347cea2084444104.tar.gz pam_wrapper-047e9fb616d21e202add9f16347cea2084444104.tar.xz pam_wrapper-047e9fb616d21e202add9f16347cea2084444104.zip |
pwrap: Fix pso_copy to work with libpam.so.0.84.2
Signed-off-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
-rw-r--r-- | src/pam_wrapper.c | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/src/pam_wrapper.c b/src/pam_wrapper.c index 8997e36..043c00e 100644 --- a/src/pam_wrapper.c +++ b/src/pam_wrapper.c @@ -779,13 +779,14 @@ static void pwrap_clean_stale_dirs(const char *dir) static int pso_copy(const char *src, const char *dst, const char *pdir, mode_t mode) { -#define PSO_COPY_READ_SIZE 9 +#define PSO_COPY_READ_SIZE 16 int srcfd = -1; int dstfd = -1; int rc = -1; ssize_t bread, bwritten; struct stat sb; char buf[PSO_COPY_READ_SIZE + 1]; + size_t pso_copy_read_size = PSO_COPY_READ_SIZE; int cmp; size_t to_read; bool found_slash; @@ -832,13 +833,35 @@ static int pso_copy(const char *src, const char *dst, const char *pdir, mode_t m to_read = 1; if (!found_slash && buf[0] == '/') { found_slash = true; - to_read = PSO_COPY_READ_SIZE; + to_read = pso_copy_read_size; } if (found_slash && bread == PSO_COPY_READ_SIZE) { - cmp = memcmp(buf, "etc/pam.d", 9); + cmp = memcmp(buf, "usr/etc/pam.d/%s", 16); if (cmp == 0) { - memcpy(buf, pdir + 1, 9); + char tmp[16] = {0}; + + snprintf(tmp, sizeof(tmp), "%s/%%s", pdir + 1); + + memcpy(buf, tmp, 12); + memset(&buf[12], '\0', 4); + + /* + * If we found this string, we need to reduce + * the read size to not miss, the next one. + */ + pso_copy_read_size = 13; + } else { + cmp = memcmp(buf, "usr/etc/pam.d", 13); + if (cmp == 0) { + memcpy(buf, pdir + 1, 9); + memset(&buf[9], '\0', 4); + } else { + cmp = memcmp(buf, "etc/pam.d", 9); + if (cmp == 0) { + memcpy(buf, pdir + 1, 9); + } + } } found_slash = false; } |