kioslave: fix possible crash in case the FTP mode string is invalid

Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
This commit is contained in:
Ivailo Monev 2024-05-27 20:40:41 +03:00
parent e88a8bd627
commit 1cdb2c631f

View file

@ -76,57 +76,61 @@ static inline int ftpUserModeFromChar(const char modechar, const int rmode, cons
return result; return result;
} }
static inline mode_t ftpModeFromString(const char* const modestring) static inline mode_t ftpModeFromString(const QByteArray &modestring)
{ {
mode_t result = 0; mode_t result = 0;
switch (modestring[0]) { if (modestring.size() != 10) {
case '-': { kWarning(7103) << "Invalid FTP mode string" << modestring;
result |= S_IFREG; return result;
break; }
} switch (modestring[0]) {
case 'b': { case '-': {
result |= S_IFBLK; result |= S_IFREG;
break; break;
} }
case 'c': { case 'b': {
result |= S_IFCHR; result |= S_IFBLK;
break; break;
} }
case 'd': { case 'c': {
result |= S_IFDIR; result |= S_IFCHR;
break; break;
} }
case 'l': { case 'd': {
result |= S_IFLNK; result |= S_IFDIR;
break; break;
} }
case 'p': { case 'l': {
result |= S_IFIFO; result |= S_IFLNK;
break; break;
} }
case 's': { case 'p': {
result |= S_IFSOCK; result |= S_IFIFO;
break; break;
} }
default: { case 's': {
kWarning(7103) << "Invalid FTP mode string" << modestring; result |= S_IFSOCK;
break; break;
} }
} default: {
kWarning(7103) << "Invalid FTP mode string" << modestring;
break;
}
}
result |= ftpUserModeFromChar(modestring[1], S_IRUSR, S_IWUSR, S_IXUSR); result |= ftpUserModeFromChar(modestring[1], S_IRUSR, S_IWUSR, S_IXUSR);
result |= ftpUserModeFromChar(modestring[2], S_IRUSR, S_IWUSR, S_IXUSR); result |= ftpUserModeFromChar(modestring[2], S_IRUSR, S_IWUSR, S_IXUSR);
result |= ftpUserModeFromChar(modestring[3], S_IRUSR, S_IWUSR, S_IXUSR); result |= ftpUserModeFromChar(modestring[3], S_IRUSR, S_IWUSR, S_IXUSR);
result |= ftpUserModeFromChar(modestring[4], S_IRGRP, S_IWGRP, S_IXGRP); result |= ftpUserModeFromChar(modestring[4], S_IRGRP, S_IWGRP, S_IXGRP);
result |= ftpUserModeFromChar(modestring[5], S_IRGRP, S_IWGRP, S_IXGRP); result |= ftpUserModeFromChar(modestring[5], S_IRGRP, S_IWGRP, S_IXGRP);
result |= ftpUserModeFromChar(modestring[6], S_IRGRP, S_IWGRP, S_IXGRP); result |= ftpUserModeFromChar(modestring[6], S_IRGRP, S_IWGRP, S_IXGRP);
result |= ftpUserModeFromChar(modestring[7], S_IROTH, S_IWOTH, S_IXOTH); result |= ftpUserModeFromChar(modestring[7], S_IROTH, S_IWOTH, S_IXOTH);
result |= ftpUserModeFromChar(modestring[8], S_IROTH, S_IWOTH, S_IXOTH); result |= ftpUserModeFromChar(modestring[8], S_IROTH, S_IWOTH, S_IXOTH);
result |= ftpUserModeFromChar(modestring[9], S_IROTH, S_IWOTH, S_IXOTH); result |= ftpUserModeFromChar(modestring[9], S_IROTH, S_IWOTH, S_IXOTH);
return result; return result;
} }
// for reference: // for reference: