From 244454da2d4f3cb5d197a6b0e6fc2b4c8d72d08c Mon Sep 17 00:00:00 2001 From: Christophe Varoqui Date: Mon, 29 Sep 2008 00:44:46 +0200 Subject: [PATCH] [libmultipath] fixes for "show paths format" o undue 1-char rollback when encountering unknown wildcard o fix segfault when format starts with an unknown wildard o continue parsing the format after an unknown wildcard --- libmultipath/print.c | 33 +++++++++++++-------------------- 1 files changed, 13 insertions(+), 20 deletions(-) diff --git a/libmultipath/print.c b/libmultipath/print.c index 459b973..7411ccc 100644 --- a/libmultipath/print.c +++ b/libmultipath/print.c @@ -28,6 +28,9 @@ #define NOPAD s = c #define PAD(x) while ((int)(c - s) < (x) && (c < (line + len - 1))) \ *c++ = ' '; s = c +#define ENDLINE \ + if (c > line) \ + line[c - line - 1] = '\n' #define PRINT(var, size, format, args...) \ fwd = snprintf(var, size, format, ##args); \ c += (fwd >= size) ? size : fwd; @@ -532,15 +535,13 @@ snprint_multipath_header (char * line, int len, char * format) f++; if (!(data = mpd_lookup(*f))) - break; /* unknown wildcard */ + continue; /* unknown wildcard */ PRINT(c, TAIL, data->header); PAD(data->width); } while (*f++); - line[c - line - 1] = '\n'; - line[c - line] = '\0'; - + ENDLINE; return (c - line); } @@ -567,7 +568,7 @@ snprint_multipath (char * line, int len, char * format, f++; if (!(data = mpd_lookup(*f))) - break; + continue; data->snprint(buff, MAX_FIELD_LEN, mpp); PRINT(c, TAIL, buff); @@ -575,9 +576,7 @@ snprint_multipath (char * line, int len, char * format, buff[0] = '\0'; } while (*f++); - line[c - line - 1] = '\n'; - line[c - line] = '\0'; - + ENDLINE; return (c - line); } @@ -602,15 +601,13 @@ snprint_path_header (char * line, int len, char * format) f++; if (!(data = pd_lookup(*f))) - break; /* unknown wildcard */ + continue; /* unknown wildcard */ PRINT(c, TAIL, data->header); PAD(data->width); } while (*f++); - line[c - line - 1] = '\n'; - line[c - line] = '\0'; - + ENDLINE; return (c - line); } @@ -637,16 +634,14 @@ snprint_path (char * line, int len, char * format, f++; if (!(data = pd_lookup(*f))) - break; + continue; data->snprint(buff, MAX_FIELD_LEN, pp); PRINT(c, TAIL, buff); PAD(data->width); } while (*f++); - line[c - line - 1] = '\n'; - line[c - line] = '\0'; - + ENDLINE; return (c - line); } @@ -673,16 +668,14 @@ snprint_pathgroup (char * line, int len, char * format, f++; if (!(data = pgd_lookup(*f))) - break; + continue; data->snprint(buff, MAX_FIELD_LEN, pgp); PRINT(c, TAIL, buff); PAD(data->width); } while (*f++); - line[c - line - 1] = '\n'; - line[c - line] = '\0'; - + ENDLINE; return (c - line); } -- 1.5.2.4