fixed misuse of realloc
if called with size 0, realloc frees the buffer, which may eventually lead to a double free corruption.
This commit is contained in:
@@ -93,12 +93,14 @@ bool PipeReader::QueryTransmit(BYTE *APDU,int APDUlen,BYTE **Resp,int *Resplen)
|
||||
pipe=NULL;
|
||||
return false;
|
||||
}
|
||||
BYTE *p=(BYTE *)realloc(*Resp, dwRespLen);
|
||||
if (p==NULL) {
|
||||
pipe=NULL;
|
||||
return false;
|
||||
if (0 != dwRespLen) {
|
||||
BYTE *p=(BYTE *)realloc(*Resp, dwRespLen);
|
||||
if (p==NULL) {
|
||||
pipe=NULL;
|
||||
return false;
|
||||
}
|
||||
*Resp=p;
|
||||
}
|
||||
*Resp=p;
|
||||
if (!ReadFile(pipe,*Resp,dwRespLen,&read,NULL)) {
|
||||
pipe=NULL;
|
||||
return false;
|
||||
|
||||
@@ -71,13 +71,15 @@ bool TcpIpReader::QueryTransmit(BYTE *APDU,int APDUlen,BYTE **Resp,int *Resplen)
|
||||
AcceptSocket=NULL;
|
||||
return false;
|
||||
}
|
||||
BYTE *p=(BYTE *)realloc(*Resp, dwRespLen);
|
||||
if (p==NULL) {
|
||||
::shutdown(AcceptSocket,SD_BOTH);
|
||||
AcceptSocket=NULL;
|
||||
return false;
|
||||
if (0 != dwRespLen) {
|
||||
BYTE *p=(BYTE *)realloc(*Resp, dwRespLen);
|
||||
if (p==NULL) {
|
||||
::shutdown(AcceptSocket,SD_BOTH);
|
||||
AcceptSocket=NULL;
|
||||
return false;
|
||||
}
|
||||
*Resp=p;
|
||||
}
|
||||
*Resp=p;
|
||||
if ((read=recv(AcceptSocket,(char*)*Resp,dwRespLen,MSG_WAITALL))<=0) {
|
||||
::shutdown(AcceptSocket,SD_BOTH);
|
||||
AcceptSocket=NULL;
|
||||
|
||||
@@ -11,14 +11,16 @@ bool getBuffer(IWDFIoRequest* pRequest,void **buffer,int *bufferLen) {
|
||||
else {
|
||||
SIZE_T size;
|
||||
void *data=inmem->GetDataBuffer(&size);
|
||||
void *out = realloc(*buffer, size);
|
||||
if (out==NULL) {
|
||||
OutputDebugString(L"realloc failed");
|
||||
return false;
|
||||
if (0 != size) {
|
||||
void *out = realloc(*buffer, size);
|
||||
if (out==NULL) {
|
||||
OutputDebugString(L"realloc failed");
|
||||
return false;
|
||||
}
|
||||
memcpy(out,data,size);
|
||||
(*buffer)=out;
|
||||
}
|
||||
memcpy(out,data,size);
|
||||
(*bufferLen)=(int)size;
|
||||
(*buffer)=out;
|
||||
inmem->Release();
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user