X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;f=sbr%2Ffmt_scan.c;h=51ba24cf86c0a75d132863e202702e9d9aba04f5;hb=a71e7d9a788e0b21ada5f1218724843f10432936;hp=74cfd927f2aaf1f0e4106a304b5027fda3338cec;hpb=6456295d747373150577e02588770a1a4ba1efaf;p=mmh diff --git a/sbr/fmt_scan.c b/sbr/fmt_scan.c index 74cfd92..51ba24c 100644 --- a/sbr/fmt_scan.c +++ b/sbr/fmt_scan.c @@ -317,7 +317,7 @@ get_x400_comp (char *mbox, char *key, char *buffer, int buffer_len) } struct format * -fmt_scan (struct format *format, char *scanl, int width, int *dat) +fmt_scan (struct format *format, char *scanl, size_t max, int width, int *dat) { char *cp, *ep; unsigned char *sp; @@ -332,8 +332,11 @@ fmt_scan (struct format *format, char *scanl, int width, int *dat) struct tws *tws; struct mailname *mn; + /* ep keeps track of displayed characters. They're limited by width. + The total number of characters, cp - scanl + 1 (for trailing NULL), + includes invisible control characters and is limited by max. */ cp = scanl; - ep = scanl + width - 1; + ep = scanl + (width <= (int) max ? width : (int) max) - 1; for (fmt = format; fmt->f_type != FT_DONE; fmt++) switch (fmt->f_type) { @@ -974,9 +977,14 @@ fmt_scan (struct format *format, char *scanl, int width, int *dat) } #ifndef JLR finished:; - if (cp[-1] != '\n') - *cp++ = '\n'; - *cp = 0; + if (cp > scanl && cp[-1] != '\n') { + if (cp - scanl < (int) max - 1) { + *cp++ = '\n'; + } else { + cp[-1] = '\n'; + } + } + *cp = '\0'; return ((struct format *)0); #else /* JLR */ if (cp[-1] != '\n')