cabinet: Close the opened file handle even in error cases.
This commit is contained in:
parent
7f31cc4756
commit
a79765ff02
|
@ -2809,6 +2809,17 @@ BOOL __cdecl FDICopy(
|
||||||
err = fdi_decomp(file, 1, decomp_state, pszCabPath, pfnfdin, pvUser);
|
err = fdi_decomp(file, 1, decomp_state, pszCabPath, pfnfdin, pvUser);
|
||||||
if (err) CAB(current) = NULL; else CAB(offset) += file->length;
|
if (err) CAB(current) = NULL; else CAB(offset) += file->length;
|
||||||
|
|
||||||
|
/* fdintCLOSE_FILE_INFO notification */
|
||||||
|
ZeroMemory(&fdin, sizeof(FDINOTIFICATION));
|
||||||
|
fdin.pv = pvUser;
|
||||||
|
fdin.psz1 = (char *)file->filename;
|
||||||
|
fdin.hf = filehf;
|
||||||
|
fdin.cb = (file->attribs & cffile_A_EXEC) ? TRUE : FALSE; /* FIXME: is that right? */
|
||||||
|
fdin.date = file->date;
|
||||||
|
fdin.time = file->time;
|
||||||
|
fdin.attribs = file->attribs; /* FIXME: filter _A_EXEC? */
|
||||||
|
((*pfnfdin)(fdintCLOSE_FILE_INFO, &fdin));
|
||||||
|
|
||||||
switch (err) {
|
switch (err) {
|
||||||
case DECR_OK:
|
case DECR_OK:
|
||||||
break;
|
break;
|
||||||
|
@ -2829,28 +2840,6 @@ BOOL __cdecl FDICopy(
|
||||||
PFDI_INT(hfdi)->perf->fError = TRUE;
|
PFDI_INT(hfdi)->perf->fError = TRUE;
|
||||||
goto bail_and_fail;
|
goto bail_and_fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* fdintCLOSE_FILE_INFO notification */
|
|
||||||
ZeroMemory(&fdin, sizeof(FDINOTIFICATION));
|
|
||||||
fdin.pv = pvUser;
|
|
||||||
fdin.psz1 = (char *)file->filename;
|
|
||||||
fdin.hf = filehf;
|
|
||||||
fdin.cb = (file->attribs & cffile_A_EXEC) ? TRUE : FALSE; /* FIXME: is that right? */
|
|
||||||
fdin.date = file->date;
|
|
||||||
fdin.time = file->time;
|
|
||||||
fdin.attribs = file->attribs; /* FIXME: filter _A_EXEC? */
|
|
||||||
err = ((*pfnfdin)(fdintCLOSE_FILE_INFO, &fdin));
|
|
||||||
if (err == FALSE || err == -1) {
|
|
||||||
/*
|
|
||||||
* SDK states that even though they indicated failure,
|
|
||||||
* we are not supposed to try and close the file, so we
|
|
||||||
* just treat this like all the others
|
|
||||||
*/
|
|
||||||
PFDI_INT(hfdi)->perf->erfOper = FDIERROR_USER_ABORT;
|
|
||||||
PFDI_INT(hfdi)->perf->erfType = 0;
|
|
||||||
PFDI_INT(hfdi)->perf->fError = TRUE;
|
|
||||||
goto bail_and_fail;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue