D17816: Support for xattrs on kio copy/move
Stefan Brüns
noreply at phabricator.kde.org
Fri Apr 17 02:02:14 BST 2020
bruns requested changes to this revision.
bruns added inline comments.
This revision now requires changes to proceed.
INLINE COMMENTS
> file_unix.cpp:141
> + // Get the list of keys
> + ssize_t listlen = 512;
> + QByteArray keylist(listlen, Qt::Uninitialized);
The idea is almost right, the implementation is wrong.
1. set listlen to 0
2. resize keylist to listlen
3. execute flistxattr with size = keylist.size();
4a. if (3.) returns listlen > 0 and keylist.size() == 0, go to (2.)
4b. if (3.) returns listlen > 0 and keylist.size() > 0 -> break
4c. if (3.) returns listlen == -1 and errno == ERANGE, set listlen to 0 and go to (2.)
4d. if (3.) returns listlen == -1 and errno == ENOTSUP -> return
4e. if (3.) returns listlen == 0 -> return
5. resize keylist to listlen, the list may shrink between flistxattr calls.
> file_unix.cpp:153
> + if (errno == ERANGE) {
> + keylist.resize(listlen + 512);
> + }
as listlen is -1 here, you always resize to 511 ...
> file_unix.cpp:163
> + }
> + } while (listlen == -1 && errno == ERANGE);
> +
man 2 flistxattr:
> In addition, the errors documented in stat(2) can also occur.
So any error but ERANGE will exit the loop, and you will have bogus keylist contents.
Do `return false` on any error but ERANGE in the loop.
After the loop (i.e. when listlen is guaranteed to be > 0), resize keylist to listlen, the list may shrink.
> file_unix.cpp:173
> + // For each key
> + keylist.squeeze();
> + while (keyPtr != keylist.cend()) {
Thats bad. Thats really bad.
squeeze may reallocate. This invalidates keyPtr.
> file_unix.cpp:186
> + ssize_t valuelen = 512;
> + QByteArray value(valuelen, Qt::Uninitialized);
> + do {
`QByteArray value` should be created outside the keyPtr loop.
This reduces the calls to malloc for the QByteArray data storage.
Then for each attribute, do a `value.resize(value.capacity)`.
> file_unix.cpp:196
> + if (valuelen == -1 && errno == ERANGE) {
> + value.resize(valuelen + 512);
> + }
-1 + 512 = 511 ...
Should be `value.resize(value.size() + 512)` or something similar.
> file_unix.cpp:198
> + }
> + } while (valuelen == -1 && errno == ERANGE);
> +
Again, valuelen may be -1 here ...
REPOSITORY
R241 KIO
REVISION DETAIL
https://phabricator.kde.org/D17816
To: cochise, dfaure, chinmoyr, bruns, #frameworks, tmarshall, usta
Cc: usta, scheirle, anthonyfieroni, tmarshall, arrowd, cfeck, bruns, phidrho, dhaumann, funkybomber, abika, pino, davidedmundson, ngraham, atha.kane, spoorun, nicolasfella, kde-frameworks-devel, LeGast00n, cblack, michaelh
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.kde.org/pipermail/kde-frameworks-devel/attachments/20200417/6024ece9/attachment.html>
More information about the Kde-frameworks-devel
mailing list