iso9660: fix PVS 2430 to 2435.

* Incorrect handling of realloc() failure (if reallocation fails,
original buffer is still allocated and must be freed),
* Use of bit shift on signed integer (undefined behavior in C and C++).
This commit is contained in:
Adrien Destugues
2015-04-28 21:49:23 +02:00
parent 7c52cca938
commit 7dc68bfba5
@@ -307,6 +307,7 @@ parse_rock_ridge(iso9660_volume* volume, iso9660_inode* node, char* buffer,
// Now we're at the start of the rock ridge stuff
char* altName = NULL;
char* slName = NULL;
char* newSlName = NULL;
uint16 altNameSize = 0;
uint16 slNameSize = 0;
uint8 length = 0;
@@ -410,10 +411,13 @@ parse_rock_ridge(iso9660_volume* volume, iso9660_inode* node, char* buffer,
slNameSize += compLen;
if (useSeparator)
slNameSize++;
slName = (char*)realloc(slName,
newSlName = (char*)realloc(slName,
slNameSize + 1);
if (slName == NULL)
if (newSlName == NULL) {
free(slName);
return B_NO_MEMORY;
}
slName = newSlName;
if (useSeparator) {
TRACE(("Adding separator\n"));
@@ -431,10 +435,13 @@ parse_rock_ridge(iso9660_volume* volume, iso9660_inode* node, char* buffer,
case SLCP_CURRENT:
TRACE(("InitNode - found link to current directory\n"));
slNameSize += 2;
slName = (char*)realloc(slName,
newSlName = (char*)realloc(slName,
slNameSize + 1);
if (slName == NULL)
if (newSlName == NULL) {
free(slName);
return B_NO_MEMORY;
}
slName = newSlName;
memcpy(slName + addPos, "./", 2);
useSeparator = false;
@@ -442,10 +449,13 @@ parse_rock_ridge(iso9660_volume* volume, iso9660_inode* node, char* buffer,
case SLCP_PARENT:
slNameSize += 3;
slName = (char*)realloc(slName,
newSlName = (char*)realloc(slName,
slNameSize + 1);
if (slName == NULL)
if (newSlName == NULL) {
free(slName);
return B_NO_MEMORY;
}
slName = newSlName;
memcpy(slName + addPos, "../", 3);
useSeparator = false;
@@ -454,10 +464,13 @@ parse_rock_ridge(iso9660_volume* volume, iso9660_inode* node, char* buffer,
case SLCP_ROOT:
TRACE(("InitNode - found link to root directory\n"));
slNameSize += 1;
slName = (char*)realloc(slName,
newSlName = (char*)realloc(slName,
slNameSize + 1);
if (slName == NULL)
if (newSlName == NULL) {
free(slName);
return B_NO_MEMORY;
}
slName = newSlName;
memcpy(slName + addPos, "/", 1);
useSeparator = false;
break;
@@ -488,16 +501,20 @@ parse_rock_ridge(iso9660_volume* volume, iso9660_inode* node, char* buffer,
uint16 oldEnd = altNameSize;
altNameSize += length - 5;
altName = (char*)realloc(altName, altNameSize + 1);
if (altName == NULL)
char* newAltName = (char*)realloc(altName, altNameSize + 1);
if (newAltName == NULL) {
free(altName);
return B_NO_MEMORY;
}
altName = newAltName;
TRACE(("RR: found NM, length %u\n", length));
// Read flag and version.
node->attr.nmVer = *(uint8 *)(buffer + bytePos++);
flags = *(uint8 *)(buffer + bytePos++);
TRACE(("RR: nm buffer is %s, start at %p\n", (buffer + bytePos), buffer + bytePos));
TRACE(("RR: nm buffer is %s, start at %p\n", (buffer + bytePos),
buffer + bytePos));
// Build the file name.
memcpy(altName + oldEnd, buffer + bytePos, length - 5);
@@ -973,7 +990,8 @@ status_t
ConvertRecDate(ISORecDate* inDate, time_t* outDate)
{
time_t time;
int days, i, year, tz;
int days, i, year;
int8_t tz;
year = inDate->year - 70;
tz = inDate->offsetGMT;
@@ -998,8 +1016,6 @@ ConvertRecDate(ISORecDate* inDate, time_t* outDate)
days += inDate->date - 1;
time = ((((days*24) + inDate->hour) * 60 + inDate->minute) * 60)
+ inDate->second;
if (tz & 0x80)
tz |= (-1 << 8);
if (-48 <= tz && tz <= 52)
time -= tz * 15 * 60;