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
[email protected]
https://lists.sourceforge.net/lists/listinfo/iup-users