[poppler] RFC: Potential invalid pointer / release after free fix in HtmlOutputDev

Reece Dunn msclrhd at googlemail.com
Wed Nov 4 11:57:37 PST 2009


2009/11/4 Albert Astals Cid <aacid at kde.org>:
> A Dimecres, 4 de novembre de 2009, Reece Dunn va escriure:
>> NOTE: I haven't built this, as I cannot build at the moment (missing
>> fontconfig dependency in Ubuntu that I haven't figured out).
>
> sudo apt-get install libfontconfig1-dev
> ?

That works, thanks.

>> The original code is something like:
>>
>>    GooString *str, *str1 = NULL;
>>    for(HtmlString *tmp=yxStrings;tmp;tmp=tmp->yxNext){
>>     if (tmp->htext){
>>        str=new GooString(tmp->htext);
>>        fprintf(f,"<text top=\"%d\" left=\"%d\"
>> ",xoutRound(tmp->yMin),xoutRound(tmp->xMin));
>>        fprintf(f,"width=\"%d\" height=\"%d\"
>> ",xoutRound(tmp->xMax-tmp->xMin),xoutRound(tmp->yMax-tmp->yMin));
>>        fprintf(f,"font=\"%d\">", tmp->fontpos);
>>       if (tmp->fontpos!=-1){
>>       str1=fonts->getCSStyle(tmp->fontpos, str);
>>       }
>>        fputs(str1->getCString(),f);
>>       delete str;
>>        delete str1;
>>        fputs("</text>\n",f);
>>      }
>>
>> As can be seen, str1 is not initialised outside of the "if
>> (tmp->fontpos!=-1)" condition. This means that if tmp->fontpos == -1,
>> str1 is either NULL (if this is the first entry, resulting in a NULL
>> pointer dereference), or is pointing to the previous str1 object
>> already deleted (resulting in a delete-after-free), and before it a
>> NULL pointer access, or access to already released memory (with
>> potentially garbage data).
>>
>> Thus, the code should be:
>>
>>    GooString *str, *str1 = NULL;
>>    for(HtmlString *tmp=yxStrings;tmp;tmp=tmp->yxNext){
>>     if (tmp->htext){
>>        str=new GooString(tmp->htext);
>>        fprintf(f,"<text top=\"%d\" left=\"%d\"
>> ",xoutRound(tmp->yMin),xoutRound(tmp->xMin));
>>        fprintf(f,"width=\"%d\" height=\"%d\"
>> ",xoutRound(tmp->xMax-tmp->xMin),xoutRound(tmp->yMax-tmp->yMin));
>>        fprintf(f,"font=\"%d\">", tmp->fontpos);
>>       if (tmp->fontpos!=-1){
>>       str1=fonts->getCSStyle(tmp->fontpos, str);
>>        fputs(str1->getCString(),f);
>>        delete str1;
>>       }
>>       delete str;
>>        fputs("</text>\n",f);
>>      }
>>
>> with str1 only being used and released inside that conditional.
>>
>> Now, if tmp->fontpos == -1 the output is "<text></text>" as there is
>> no text being written. This does not make sense, so the
>> (tmp->fontpos!=-1) check can be moved to the (tmp->htext) check.
>>
>> Thus my patch, which as I said is untested (hence the RFC).
>
> Yeah seems logical, but the more important, do you have a case where this
> happens?

No, I don't have a case where this happens. It is something I saw when
looking at the code.

That is, I don't know when tmp->fontpos == -1 (for any tmp in
xyStrings) without further analysis.

- Reece


More information about the poppler mailing list