G'day,

Thanks for processing my previous patch.

Here is another patch that uses snprintf(3) to avoid potential
buffer overflow cases (and GCC 10.3 warnings):

There's two instances of "%str" as part of a format specifier for
the original "sprintf" code...  These probably should be "%s".

The error recovery code I've used in the change comes from code used
a little further down the function... I'm not sure if I've tackled
this the right way (and I haven't tried to comprehend the comments!)

A patch is attached.  The "%str"/"%s" discontinuity was only noticed
late in the process, but I think I've caught it in the patch.

cheers,

s-b etc.


--------


-- (Original start of cdCanvasVectorFont (rather long, sigh)) --


char *cdCanvasVectorFont(cdCanvas* canvas, const char *file)
{
  cdVectorFont* vector_font;

  assert(canvas);
  assert(file);
  if (!_cdCheckCanvas(canvas)) return NULL;

  vector_font = canvas->vector_font;
  if (!file || file[0] == 0)
  {
    vf_setdefaultfont(vector_font);
    vector_font->file_name[0] = 0;
  }
  else
  {
    FILE *font = NULL;
    int read_ok;
    char *env;

    /* se arquivo foi o mesmo que o arq. corrente, entao retorna */
    if (strcmp (file, vector_font->file_name) == 0)
        return vector_font->name;

    /* abre arq. no dir. corrente */
    font = fopen(file, "r");

    /* se nao conseguiu, abre arq. no dir. do cd, */
    env = getenv("CDDIR");
    if (!font && env && strlen(file)<10240)
    {
      char filename[10240];
      sprintf(filename, "%str/%str", env, file);
      font = fopen(filename, "r");
    }

    if (font)
      read_ok = vf_readfontfile(font, vector_font);
    else
      read_ok = vf_readfontstring(file, vector_font);

    if (!read_ok)
    {
      if (font) fclose(font);
      vf_setdefaultfont(vector_font);
      vector_font->file_name[0] = 0;
      return NULL;
    }

    /*  ... remainder of function elided ...  */



--------



char *cdCanvasVectorFont(cdCanvas* canvas, const char *file)
{
  cdVectorFont* vector_font;

  assert(canvas);
  assert(file);
  if (!_cdCheckCanvas(canvas)) return NULL;

  vector_font = canvas->vector_font;
  if (!file || file[0] == 0)
  {
    vf_setdefaultfont(vector_font);
    vector_font->file_name[0] = 0;
  }
  else
  {
    FILE *font = NULL;
    int read_ok;
    char *env;

    /* se arquivo foi o mesmo que o arq. corrente, entao retorna */
    if (strcmp (file, vector_font->file_name) == 0)
        return vector_font->name;

    /* abre arq. no dir. corrente */
    font = fopen(file, "r");

    /* se nao conseguiu, abre arq. no dir. do cd, */
    env = getenv("CDDIR");
    if (!font && env)
    {
      char filename[10240];
      int result;

      result = snprintf(filename, sizeof(filename),
                        "%s/%s",
                        env, file);
      if ((result < 0) || (result >= sizeof(filename)))
      {
        vf_setdefaultfont(vector_font);
        vector_font->file_name[0] = 0;
        return NULL;
      }
      font = fopen(filename, "r");
    }

    if (font)
      read_ok = vf_readfontfile(font, vector_font);
    else
      read_ok = vf_readfontstring(file, vector_font);

    if (!read_ok)
    {
      if (font) fclose(font);
      vf_setdefaultfont(vector_font);
      vector_font->file_name[0] = 0;
      return NULL;
    }

    /*  ... remainder of function elided ...  */

-- (End of text.) --
Index: cd/src/cd_vectortext.c
===================================================================
--- cd/src/cd_vectortext.c	(revision 898)
+++ cd/src/cd_vectortext.c	(working copy)
@@ -4798,9 +4798,19 @@

     /* se nao conseguiu, abre arq. no dir. do cd, */
     env = getenv("CDDIR");
-    if (!font && env && strlen(file)<10240)
+    if (!font && env)
     {
       char filename[10240];
-      sprintf(filename, "%str/%str", env, file);
+      int result;
+
+      result = snprintf(filename, sizeof(filename),
+                        "%s/%s",
+                        env, file);
+      if ((result < 0) || (result >= sizeof(filename)))
+      {
+        vf_setdefaultfont(vector_font);
+        vector_font->file_name[0] = 0;
+        return NULL;
+      }
       font = fopen(filename, "r");
     }
_______________________________________________
Iup-users mailing list
Iup-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/iup-users

Reply via email to