hwpfilter/source/hcode.cxx     |    8 +++++
 hwpfilter/source/hcode.h       |    2 +
 hwpfilter/source/hwpreader.cxx |   60 +++++++++++------------------------------
 3 files changed, 27 insertions(+), 43 deletions(-)

New commits:
commit 823fe1cb509e80f36744ff948d506ec9eeffb752
Author:     Mike Kaganski <mike.kagan...@collabora.com>
AuthorDate: Fri Mar 4 18:57:46 2022 +0300
Commit:     Mike Kaganski <mike.kagan...@collabora.com>
CommitDate: Fri Mar 4 21:59:56 2022 +0100

    Avoid some sprintf used with colors
    
    Also addresses possible buffer overflow because of possible
    color channel values greater than 255 (found by a fuzzer;
    likely by some unexpected value of shade exceeding 100; see
    
https://gerrit.libreoffice.org/c/core/+/130956/3/hwpfilter/source/hcode.cxx#1292)
    
    Change-Id: I168685c3b51cbc8c9f664282bc9378b3c6669ba0
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/131003
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com>

diff --git a/hwpfilter/source/hcode.cxx b/hwpfilter/source/hcode.cxx
index 3e9b08086f23..7a00271641b1 100644
--- a/hwpfilter/source/hcode.cxx
+++ b/hwpfilter/source/hcode.cxx
@@ -1288,13 +1288,21 @@ OUString hcolor2str(uchar color, uchar shade, bool 
bIsChar)
             blue = 0xff;
             break;
     }
+    return rgb2str(red, green, blue);
+}
+
 
+OUString rgb2str(unsigned char red, unsigned char green, unsigned char blue)
+{
     char buf[8];
     int n = std::max(sprintf(buf, "#%02x%02x%02x", red, green, blue), 0);
     return OUString::createFromAscii(std::string_view(buf, n));
 }
 
 
+OUString rgb2str(int32_t rgb) { return rgb2str(rgb & 0xff, (rgb >> 8) & 0xff, 
(rgb >> 16) & 0xff); }
+
+
 ::std::string urltounix(const char *src)
 {
     ::std::string ret;
diff --git a/hwpfilter/source/hcode.h b/hwpfilter/source/hcode.h
index 0f8362e0128a..da7ff7345913 100644
--- a/hwpfilter/source/hcode.h
+++ b/hwpfilter/source/hcode.h
@@ -65,6 +65,8 @@ DLLEXPORT ::std::string urltowin(const char *src);
  * color인덱스 값과 음영값을 조합하여 스타오피스의 color로 변환
  */
 DLLEXPORT OUString hcolor2str(uchar color, uchar shade, bool bIsChar = false);
+DLLEXPORT OUString rgb2str(unsigned char red, unsigned char green, unsigned 
char blue);
+DLLEXPORT OUString rgb2str(int32_t rgb);
 
 DLLEXPORT OUString base64_encode_string( const uchar *buf, unsigned int len );
 DLLEXPORT double calcAngle(int x1, int y1, int x2, int y2);
diff --git a/hwpfilter/source/hwpreader.cxx b/hwpfilter/source/hwpreader.cxx
index f971eeae8c58..0f77c8df9746 100644
--- a/hwpfilter/source/hwpreader.cxx
+++ b/hwpfilter/source/hwpreader.cxx
@@ -585,32 +585,19 @@ void HwpReader::makeDrawMiscStyle( HWPDrawingObject *hdo )
                 {
                     if( prop->center_y == 100 )
                     {
-                        sprintf( buf, "#%02x%02x%02x", prop->tocolor & 0xff,
-                            (prop->tocolor >> 8) & 0xff, (prop->tocolor >>16) 
& 0xff );
-                        mxList->addAttribute( "draw:start-color", sXML_CDATA, 
OUString::createFromAscii( buf ));
-                        sprintf( buf, "#%02x%02x%02x", prop->fromcolor & 0xff,
-                            (prop->fromcolor >> 8) & 0xff, (prop->fromcolor 
>>16) & 0xff );
-                        mxList->addAttribute( "draw:end-color", sXML_CDATA, 
OUString::createFromAscii( buf ));
+                        mxList->addAttribute( "draw:start-color", sXML_CDATA, 
rgb2str( prop->tocolor ));
+                        mxList->addAttribute( "draw:end-color", sXML_CDATA, 
rgb2str( prop->fromcolor ));
                     }
                     else
                     {
-                        sprintf( buf, "#%02x%02x%02x", prop->fromcolor & 0xff,
-                            (prop->fromcolor >> 8) & 0xff, (prop->fromcolor 
>>16) & 0xff );
-                        mxList->addAttribute( "draw:start-color", sXML_CDATA, 
OUString::createFromAscii( buf ));
-                        sprintf( buf, "#%02x%02x%02x", prop->tocolor & 0xff,
-                            (prop->tocolor >> 8) & 0xff, (prop->tocolor >>16) 
& 0xff );
-                        mxList->addAttribute( "draw:end-color", sXML_CDATA, 
OUString::createFromAscii( buf ));
+                        mxList->addAttribute( "draw:start-color", sXML_CDATA, 
rgb2str( prop->fromcolor ));
+                        mxList->addAttribute( "draw:end-color", sXML_CDATA, 
rgb2str( prop->tocolor ));
                     }
                 }
                 else
                 {
-                    sprintf( buf, "#%02x%02x%02x", prop->tocolor & 0xff,
-                        (prop->tocolor >> 8) & 0xff, (prop->tocolor >>16) & 
0xff );
-                    mxList->addAttribute( "draw:start-color", 
sXML_CDATA,OUString::createFromAscii( buf ));
-
-                    sprintf( buf, "#%02x%02x%02x", prop->fromcolor & 0xff,
-                        (prop->fromcolor >> 8) & 0xff, (prop->fromcolor >>16) 
& 0xff );
-                    mxList->addAttribute( "draw:end-color", 
sXML_CDATA,OUString::createFromAscii( buf ));
+                    mxList->addAttribute( "draw:start-color", 
sXML_CDATA,rgb2str( prop->tocolor ));
+                    mxList->addAttribute( "draw:end-color", 
sXML_CDATA,rgb2str( prop->fromcolor ));
                 }
                 if( prop->angle > 0 && ( prop->gstyle == 1 || prop->gstyle == 
4))
                 {
@@ -630,11 +617,7 @@ void HwpReader::makeDrawMiscStyle( HWPDrawingObject *hdo )
                     mxList->addAttribute( "draw:style", sXML_CDATA, "single" );
                 else
                     mxList->addAttribute( "draw:style", sXML_CDATA, "double" );
-                sprintf( buf, "#%02x%02x%02x",
-                    sal_uInt16(prop->pattern_color & 0xff),
-                    sal_uInt16((prop->pattern_color >> 8) & 0xff),
-                    sal_uInt16((prop->pattern_color >>16) & 0xff) );
-                mxList->addAttribute( "draw:color", sXML_CDATA, 
OUString::createFromAscii( buf ));
+                mxList->addAttribute( "draw:color", sXML_CDATA, rgb2str( 
static_cast<int32_t>(prop->pattern_color) ));
                 mxList->addAttribute( "draw:distance", sXML_CDATA, "0.12cm");
                 switch( type )
                 {
@@ -1670,9 +1653,10 @@ void HwpReader::makePageStyle()
          {
              if( hwpinfo.back_info.color[0] > 0 || hwpinfo.back_info.color[1] 
> 0
                      || hwpinfo.back_info.color[2] > 0 ){
-                 sprintf(buf,"#%02x%02x%02x",hwpinfo.back_info.color[0],
-                         hwpinfo.back_info.color[1],hwpinfo.back_info.color[2] 
);
-                 mxList->addAttribute("fo:background-color", sXML_CDATA, 
OUString::createFromAscii(buf));
+                 mxList->addAttribute("fo:background-color", sXML_CDATA,
+                                      rgb2str(hwpinfo.back_info.color[0],
+                                              hwpinfo.back_info.color[1],
+                                              hwpinfo.back_info.color[2]));
              }
          }
 
@@ -2020,12 +2004,8 @@ void HwpReader::makeDrawStyle( HWPDrawingObject * hdo, 
FBoxStyle * fstyle)
             }
             mxList->addAttribute("svg:stroke-width", sXML_CDATA,
                 OUString::number( WTMM(hdo->property.line_width)) + "mm");
-            color = hdo->property.line_color;
-            sprintf( buf, "#%02x%02x%02x",
-                    sal_uInt16(color & 0xff),
-                    sal_uInt16((color >> 8) & 0xff),
-                    sal_uInt16((color >>16) & 0xff) );
-            mxList->addAttribute("svg:stroke-color", sXML_CDATA, 
OUString::createFromAscii( buf) );
+            mxList->addAttribute("svg:stroke-color", sXML_CDATA,
+                                 
rgb2str(static_cast<int32_t>(hdo->property.line_color)));
         }
 
         if( hdo->type == HWPDO_LINE || hdo->type == HWPDO_ARC ||
@@ -2126,22 +2106,16 @@ void HwpReader::makeDrawStyle( HWPDrawingObject * hdo, 
FBoxStyle * fstyle)
                 mxList->addAttribute("draw:fill-hatch-name", sXML_CDATA, 
"Hatch" + OUString::number(hdo->index));
                 if( color < 0xffffff )
                 {
-                    sprintf( buf, "#%02x%02x%02x",
-                        sal_uInt16(color & 0xff),
-                        sal_uInt16((color >> 8) & 0xff),
-                        sal_uInt16((color >>16) & 0xff) );
-                    mxList->addAttribute("draw:fill-color", sXML_CDATA, 
OUString::createFromAscii( buf) );
+                    mxList->addAttribute("draw:fill-color", sXML_CDATA,
+                                         rgb2str(static_cast<int32_t>(color)));
                     mxList->addAttribute("draw:fill-hatch-solid", sXML_CDATA, 
"true");
                 }
             }
             else if( color <= 0xffffff )
             {
                 mxList->addAttribute("draw:fill", sXML_CDATA, "solid");
-                sprintf( buf, "#%02x%02x%02x",
-                    sal_uInt16(color & 0xff),
-                    sal_uInt16((color >> 8) & 0xff),
-                    sal_uInt16((color >>16) & 0xff) );
-                mxList->addAttribute("draw:fill-color", sXML_CDATA, 
OUString::createFromAscii( buf) );
+                mxList->addAttribute("draw:fill-color", sXML_CDATA,
+                                     rgb2str(static_cast<int32_t>(color)));
             }
             else
                 mxList->addAttribute("draw:fill", sXML_CDATA, "none");

Reply via email to