diff options
Diffstat (limited to 'wrapper.c')
| -rw-r--r-- | wrapper.c | 60 | 
1 files changed, 60 insertions, 0 deletions
| @@ -196,3 +196,63 @@ int xmkstemp(char *template)  		die("Unable to create temporary file: %s", strerror(errno));  	return fd;  } + +/* + * zlib wrappers to make sure we don't silently miss errors + * at init time. + */ +void git_inflate_init(z_streamp strm) +{ +	const char *err; + +	switch (inflateInit(strm)) { +	case Z_OK: +		return; + +	case Z_MEM_ERROR: +		err = "out of memory"; +		break; +	case Z_VERSION_ERROR: +		err = "wrong version"; +		break; +	default: +		err = "error"; +	} +	die("inflateInit: %s (%s)", err, strm->msg ? strm->msg : "no message"); +} + +void git_inflate_end(z_streamp strm) +{ +	if (inflateEnd(strm) != Z_OK) +		error("inflateEnd: %s", strm->msg ? strm->msg : "failed"); +} + +int git_inflate(z_streamp strm, int flush) +{ +	int ret = inflate(strm, flush); +	const char *err; + +	switch (ret) { +	/* Out of memory is fatal. */ +	case Z_MEM_ERROR: +		die("inflate: out of memory"); + +	/* Data corruption errors: we may want to recover from them (fsck) */ +	case Z_NEED_DICT: +		err = "needs dictionary"; break; +	case Z_DATA_ERROR: +		err = "data stream error"; break; +	case Z_STREAM_ERROR: +		err = "stream consistency error"; break; +	default: +		err = "unknown error"; break; + +	/* Z_BUF_ERROR: normal, needs more space in the output buffer */ +	case Z_BUF_ERROR: +	case Z_OK: +	case Z_STREAM_END: +		return ret; +	} +	error("inflate: %s (%s)", err, strm->msg ? strm->msg : "no message"); +	return ret; +} | 
