Re: [Iup-users] Another cd-r898 "-Wformat-overflow" patch: cd/src/cd_vectortext.c

2021-09-11 Thread Antonio Scuri
  Applied with a few changes. Just commited to the CD SVN.

Thanks,
Scuri


Em qua., 8 de set. de 2021 às 00:05, sur-behoffski <
sur_behoff...@grouse.com.au> escreveu:

> 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.) --
> ___
> Iup-users mailing list
> Iup-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/iup-users
>
___
Iup-users mailing list
Iup-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/iup-users


[Iup-users] Another cd-r898 "-Wformat-overflow" patch: cd/src/cd_vectortext.c

2021-09-07 Thread sur-behoffski
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