summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/modules/vfs_fruit.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/source3/modules/vfs_fruit.c b/source3/modules/vfs_fruit.c
index c1c71a5d21f..7201d5f6535 100644
--- a/source3/modules/vfs_fruit.c
+++ b/source3/modules/vfs_fruit.c
@@ -2675,13 +2675,19 @@ static ssize_t fruit_pread(vfs_handle_struct *handle,
char afpinfo_buf[AFP_INFO_SIZE];
size_t to_return;
- if ((offset < 0) || (offset > AFP_INFO_SIZE)) {
+ /*
+ * OS X has a off-by-1 error in the offset calculation, so we're
+ * bug compatible here. It won't hurt, as any relevant real
+ * world read requests from the AFP_AfpInfo stream will be
+ * offset=0 n=60. offset is ignored anyway, see below.
+ */
+ if ((offset < 0) || (offset >= AFP_INFO_SIZE + 1)) {
len = 0;
rc = 0;
goto exit;
}
- to_return = AFP_INFO_SIZE - offset;
+ to_return = MIN(n, AFP_INFO_SIZE);
ai = afpinfo_new(talloc_tos());
if (ai == NULL) {
@@ -2704,7 +2710,10 @@ static ssize_t fruit_pread(vfs_handle_struct *handle,
goto exit;
}
- memcpy(data, afpinfo_buf + offset, to_return);
+ /*
+ * OS X ignores offset when reading from AFP_AfpInfo stream!
+ */
+ memcpy(data, afpinfo_buf, to_return);
len = to_return;
} else {
len = SMB_VFS_NEXT_PREAD(