struct fmt_callbacks *callbacks)
{
char *sp;
- char *savestr, *str;
+ /* If str points to part of buffer[] or buffer2[] then it must only
+ * ever point at their first element as otherwise undefined
+ * behaviour from overlapping strncpy(3)s can result. */
+ char *str, *savestr;
char buffer[NMH_BUFSIZ], buffer2[NMH_BUFSIZ];
int i, c;
bool rjust;
*xp-- = '\0';
if (rjust && i > 0 && (int) strlen(str) > i)
str += strlen(str) - i;
+ str = memmove(buffer, str, strlen(str) + 1);
}
break;
value *= fmt->f_value;
break;
case FT_LV_DIVIDE_L:
- if (fmt->f_value)
- value /= fmt->f_value;
- else
+ if (fmt->f_value == 0 || (fmt->f_value == -1 && value == INT_MIN)) {
+ // FIXME: Tell the user, and probably stop.
value = 0;
+ } else {
+ value /= fmt->f_value;
+ }
break;
case FT_LV_MODULO_L:
if (fmt->f_value)
value %= fmt->f_value;
else
+ // FIXME: Tell the user, and probably stop.
value = 0;
break;
case FT_SAVESTR:
else
break;
}
+ str = memmove(buffer, str, strlen(str) + 1);
} else if (!(str = get_x400_friendly (mn->m_mbox,
buffer, sizeof(buffer)))) {
unfriendly: