X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=logging.c;h=865fe9b82ed8dc547b48ddb2d06cdc010dd8973d;hb=991d30412d0911e7727a852d0a00ae0f1bec1b3e;hp=b51c97c81bacf975348a779cebe7b2ed2af598f7;hpb=0550943b51c538400e31ce18483032e446178120;p=PuTTY.git diff --git a/logging.c b/logging.c index b51c97c8..865fe9b8 100644 --- a/logging.c +++ b/logging.c @@ -88,16 +88,19 @@ static void logfopen_callback(void *handle, int mode) char buf[256], *event; struct tm tm; const char *fmode; + int shout = FALSE; if (mode == 0) { ctx->state = L_ERROR; /* disable logging */ } else { fmode = (mode == 1 ? "ab" : "wb"); ctx->lgfp = f_open(ctx->currlogfilename, fmode, FALSE); - if (ctx->lgfp) + if (ctx->lgfp) { ctx->state = L_OPEN; - else + } else { ctx->state = L_ERROR; + shout = TRUE; + } } if (ctx->state == L_OPEN) { @@ -119,6 +122,23 @@ static void logfopen_callback(void *handle, int mode) "unknown"), filename_to_str(ctx->currlogfilename)); logevent(ctx->frontend, event); + if (shout) { + /* + * If we failed to open the log file due to filesystem error + * (as opposed to user action such as clicking Cancel in the + * askappend box), we should log it more prominently. We do + * this by sending it to the same place that stderr output + * from the main session goes (so, either a console tool's + * actual stderr, or a terminal window). + * + * Of course this is one case in which that policy won't cause + * it to turn up embarrassingly in a log file of real server + * output, because the whole point is that we haven't managed + * to open any such log file :-) + */ + from_backend(ctx->frontend, 1, event, strlen(event)); + from_backend(ctx->frontend, 1, "\r\n", 2); + } sfree(event); /* @@ -144,6 +164,7 @@ void logfopen(void *handle) { struct LogContext *ctx = (struct LogContext *)handle; struct tm tm; + FILE *fp; int mode; /* Prevent repeat calls */ @@ -163,10 +184,10 @@ void logfopen(void *handle) conf_get_str(ctx->conf, CONF_host), conf_get_int(ctx->conf, CONF_port), &tm); - ctx->lgfp = f_open(ctx->currlogfilename, "r", FALSE); /* file already present? */ - if (ctx->lgfp) { + fp = f_open(ctx->currlogfilename, "r", FALSE); /* file already present? */ + if (fp) { int logxfovr = conf_get_int(ctx->conf, CONF_logxfovr); - fclose(ctx->lgfp); + fclose(fp); if (logxfovr != LGXF_ASK) { mode = ((logxfovr == LGXF_OVR) ? 2 : 1); } else @@ -426,6 +447,7 @@ static Filename *xlatlognam(Filename *src, char *hostname, int port, s = filename_to_str(src); while (*s) { + int sanitise = FALSE; /* Let (bufp, len) be the string to append. */ bufp = buf; /* don't usually override this */ if (*s == '&') { @@ -458,6 +480,12 @@ static Filename *xlatlognam(Filename *src, char *hostname, int port, if (c != '&') buf[size++] = c; } + /* Never allow path separators - or any other illegal + * filename character - to come out of any of these + * auto-format directives. E.g. 'hostname' can contain + * colons, if it's an IPv6 address, and colons aren't + * legal in filenames on Windows. */ + sanitise = TRUE; } else { buf[0] = *s++; size = 1; @@ -466,8 +494,12 @@ static Filename *xlatlognam(Filename *src, char *hostname, int port, bufsize = (buflen + size) * 5 / 4 + 512; buffer = sresize(buffer, bufsize, char); } - memcpy(buffer + buflen, bufp, size); - buflen += size; + while (size-- > 0) { + char c = *bufp++; + if (sanitise) + c = filename_char_sanitise(c); + buffer[buflen++] = c; + } } buffer[buflen] = '\0';