Check for potential write error (or not buffer fully consumed)

This commit is contained in:
Grégory Soutadé 2022-12-23 17:51:51 +01:00
parent e4bd73c03d
commit c41dd46ca7
2 changed files with 21 additions and 4 deletions

View File

@ -931,14 +931,19 @@ namespace gourou
void DRMProcessor::exportPrivateLicenseKey(std::string path) void DRMProcessor::exportPrivateLicenseKey(std::string path)
{ {
int fd = open(path.c_str(), O_CREAT|O_TRUNC|O_WRONLY, S_IRWXU); int fd = open(path.c_str(), O_CREAT|O_TRUNC|O_WRONLY, S_IRWXU);
int ret;
if (fd <= 0) if (fd <= 0)
EXCEPTION(GOUROU_FILE_ERROR, "Unable to open " << path); EXCEPTION(GOUROU_FILE_ERROR, "Unable to open " << path);
ByteArray privateLicenseKey = ByteArray::fromBase64(user->getPrivateLicenseKey()); ByteArray privateLicenseKey = ByteArray::fromBase64(user->getPrivateLicenseKey());
/* In adobekey.py, we get base64 decoded data [26:] */ /* In adobekey.py, we get base64 decoded data [26:] */
write(fd, privateLicenseKey.data()+26, privateLicenseKey.length()-26); ret = write(fd, privateLicenseKey.data()+26, privateLicenseKey.length()-26);
close(fd); close(fd);
if (ret != privateLicenseKey.length()-26)
{
EXCEPTION(gourou::GOUROU_FILE_ERROR, "Error writing " << path);
}
} }
int DRMProcessor::getLogLevel() {return (int)gourou::logLevel;} int DRMProcessor::getLogLevel() {return (int)gourou::logLevel;}

View File

@ -99,7 +99,7 @@ void mkpath(const char *dir)
void fileCopy(const char* in, const char* out) void fileCopy(const char* in, const char* out)
{ {
char buffer[4096]; char buffer[4096];
int ret, fdIn, fdOut; int ret, ret2, fdIn, fdOut;
fdIn = open(in, O_RDONLY); fdIn = open(in, O_RDONLY);
@ -119,7 +119,19 @@ void fileCopy(const char* in, const char* out)
ret = ::read(fdIn, buffer, sizeof(buffer)); ret = ::read(fdIn, buffer, sizeof(buffer));
if (ret <= 0) if (ret <= 0)
break; break;
::write(fdOut, buffer, ret); do
{
ret2 = ::write(fdOut, buffer, ret);
if (ret2 >= 0)
{
ret -= ret2;
buffer += ret2;
}
else
{
EXCEPTION(gourou::CLIENT_FILE_ERROR, "Error writing " << out);
}
} while (ret);
} }
close (fdIn); close (fdIn);