From: Michihiro NAKAJIMA Date: Fri, 5 Oct 2012 05:28:02 +0000 (+0900) Subject: Fix a cause of segmentation fault in case of creating a child X-Git-Tag: v3.1.0~40^2~103 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=267ffe04de5fe2d4aa8093084d1251b83e710df7;p=thirdparty%2Flibarchive.git Fix a cause of segmentation fault in case of creating a child process failed. It occured when archive_write_close() was called after an opening filter process failed. --- diff --git a/libarchive/archive_write.c b/libarchive/archive_write.c index 6fc3907f3..a3d1a3380 100644 --- a/libarchive/archive_write.c +++ b/libarchive/archive_write.c @@ -232,6 +232,10 @@ __archive_write_filter(struct archive_write_filter *f, int r; if (length == 0) return(ARCHIVE_OK); + if (f->write == NULL) + /* If unset, a fatal error has already ocuured, so this filter + * didn't open. We cannot write anything. */ + return(ARCHIVE_FATAL); r = (f->write)(f, buff, length); f->bytes_written += length; return (r); @@ -437,6 +441,8 @@ archive_write_client_close(struct archive_write_filter *f) (*a->client_closer)(&a->archive, a->client_data); free(state->buffer); free(state); + /* Clear the close handler myself not to be called again. */ + f->close = NULL; a->client_data = NULL; return (ret); }