我的代码适用于文本文件,但不适用于jpegs

时间:2016-04-17 23:00:36

标签: curl libcurl s3fs

我有一个s3fs-fuse的分支我正在努力。我的工作是使用RC4透明地加密文件。我已经将加密添加到FdEntity :: Read和Write函数(在fdcache.cpp中找到)但是当我尝试复制jpeg文件(17kb)时它失败了(文件被复制,但图像已损坏)并且根据cmp,文件在4096字节之后开始不同。但是,复制198kb文本文件没有错误。

这就是我所知道的:4kb就是一个街区的大小 但是,s3fs并没有进入"多部分模式"直到20mb。即便如此,我已使用-o nomultipart禁用了多部分(我也使用-o direct_io)。
所以可能不是因为多部分上传。

知道4kb之后可能会触发什么,但只能在jpeg文件上触发?它可能与二进制vs文本文件有关吗?

1 个答案:

答案 0 :(得分:0)

我明白了。当您使用RC4解密部分数据时,每个部分的大小必须与编码时的大小相同。但是,作为参数接收的Read大小大于Write接收的大小(Read将被要求读取20480字节,而Write被限制为4096)。因此,如果我尝试读取整个20480字节的数据部分,加密将失败。我的解决方案是将读取的数量限制为4096,即使我被要求阅读更多。 S3fs自动调用该函数额外的次数进行补偿。这种解决方案在技术上可能不是密不透风的:不能保证每个非最终的数据部分都是通过写入在4096b块中加密的,并且不能保证最后一部分总是在该对齐时加密。特定尺寸(总尺寸为4096)。但是,这个解决方案足以满足我的目的。

问题只出现在jpeg而不是文本文件中,因为文本文件是一遍又一遍地重复的相同字符串。