Index: trunk/src/hid/lesstif/dialogs.c =================================================================== --- trunk/src/hid/lesstif/dialogs.c (revision 1197) +++ trunk/src/hid/lesstif/dialogs.c (revision 1198) @@ -686,7 +686,7 @@ case HID_Coord: stdarg(XmNcolumns, 13); stdarg(XmNresizeWidth, True); - pcb_sprintf(buf, "%$mS", results[i].coord_value); + pcb_snprintf(buf, sizeof(buf), "%$mS", results[i].coord_value); stdarg(XmNvalue, buf); wl[i] = XmCreateTextField(form, attrs[i].name, args, n); break; @@ -693,7 +693,7 @@ case HID_Real: stdarg(XmNcolumns, 16); stdarg(XmNresizeWidth, True); - sprintf(buf, "%g", results[i].real_value); + snprintf(buf, sizeof(buf), "%g", results[i].real_value); stdarg(XmNvalue, buf); wl[i] = XmCreateTextField(form, attrs[i].name, args, n); break; @@ -1035,7 +1035,7 @@ if (pcbu) pcb_sprintf(buf, "%m+%.2mS", Settings.grid_unit->allow, u); else - pcb_sprintf(buf, "%#mS %%", u); + pcb_snprintf(buf, sizeof(buf), "%#mS %%", u); XmTextSetString(w, buf); } Index: trunk/src/hid/lesstif/main.c =================================================================== --- trunk/src/hid/lesstif/main.c (revision 1197) +++ trunk/src/hid/lesstif/main.c (revision 1198) @@ -2470,9 +2470,9 @@ } else { if (old_gx || old_gy) - pcb_sprintf(buf, "%m+%$mS @%mS,%mS", UUNIT, old_grid, old_gx, old_gy); + pcb_snprintf(buf, sizeof(buf), "%m+%$mS @%mS,%mS", UUNIT, old_grid, old_gx, old_gy); else - pcb_sprintf(buf, "%m+%$mS", UUNIT, old_grid); + pcb_snprintf(buf, sizeof(buf), "%m+%$mS", UUNIT, old_grid); } ms = XmStringCreatePCB(buf); n = 0; Index: trunk/src/hid/lesstif/styles.c =================================================================== --- trunk/src/hid/lesstif/styles.c (revision 1197) +++ trunk/src/hid/lesstif/styles.c (revision 1198) @@ -91,7 +91,7 @@ { char buf[100]; - pcb_sprintf(buf, "%m+%.2mS", unit->allow, v); + pcb_snprintf(buf, sizeof(buf), "%m+%.2mS", unit->allow, v); XmTextSetString(style_values[i], buf); n = 0; stdarg(XmNlabelString, ustr); Index: trunk/src/pcb-printf.c =================================================================== --- trunk/src/pcb-printf.c (revision 1197) +++ trunk/src/pcb-printf.c (revision 1198) @@ -695,6 +695,33 @@ return strlen(string); } +/* \brief Wrapper for pcb_vprintf that outputs to a string with a size limit + * + * \param [in] string Pointer to string to output into + * \param [in] len Maximum length + * \param [in] fmt Format specifier + * + * \return The length of the written string + */ +int pcb_snprintf(char *string, size_t len, const char *fmt, ...) +{ + char *tmp; + int slen; + + va_list args; + va_start(args, fmt); + + tmp = pcb_vprintf(fmt, args); + slen = strlen(string); + strncpy(string, tmp, len); + if (len < slen) + string[len] = '\0'; + free(tmp); + + va_end(args); + return slen; +} + /* \brief Wrapper for pcb_vprintf that outputs to a file * * \param [in] fh File to output to Index: trunk/src/pcb-printf.h =================================================================== --- trunk/src/pcb-printf.h (revision 1197) +++ trunk/src/pcb-printf.h (revision 1198) @@ -148,6 +148,7 @@ int pcb_fprintf(FILE * f, const char *fmt, ...); int pcb_sprintf(char *string, const char *fmt, ...); +int pcb_snprintf(char *string, size_t len, const char *fmt, ...); int pcb_printf(const char *fmt, ...); char *pcb_g_strdup_printf(const char *fmt, ...); char *pcb_vprintf(const char *fmt, va_list args); Index: trunk/src/regression/pcb-printf/tester.c =================================================================== --- trunk/src/regression/pcb-printf/tester.c (revision 1197) +++ trunk/src/regression/pcb-printf/tester.c (revision 1198) @@ -11,7 +11,7 @@ # define PCB_PRINTF(fmt, ...) \ do { \ pc++; \ - pcb_sprintf(buff, fmt, __VA_ARGS__); \ + pcb_snprintf(buff, sizeof(buff), fmt, __VA_ARGS__); \ } while(0) #else # define NUMREP 1