Fix remaining bugs, and ensure correct calling sequences for source functions.
All tests (and all ckmame tests) pass.
--HG--
branch : HEAD
diff --git a/lib/zip_source_open.c b/lib/zip_source_open.c
index 9923bda..a279e20 100644
--- a/lib/zip_source_open.c
+++ b/lib/zip_source_open.c
@@ -42,25 +42,35 @@
{
zip_int64_t ret;
- if (src->src == NULL)
- return src->cb.f(src->ud, NULL, 0, ZIP_SOURCE_OPEN);
-
- if (zip_source_open(src->src) < 0) {
- src->error_source = ZIP_LES_LOWER;
+ if (src->is_open) {
+ src->error_source = ZIP_LES_INVAL;
return -1;
}
- ret = src->cb.l(src->src, src->ud, NULL, 0, ZIP_SOURCE_OPEN);
-
- if (ret < 0) {
- (void)zip_source_close(src->src);
-
- if (ret == ZIP_SOURCE_ERR_LOWER)
+ if (src->src == NULL) {
+ if (src->cb.f(src->ud, NULL, 0, ZIP_SOURCE_OPEN) < 0)
+ return -1;
+ }
+ else {
+ if (zip_source_open(src->src) < 0) {
src->error_source = ZIP_LES_LOWER;
- else
- src->error_source = ZIP_LES_UPPER;
- return -1;
+ return -1;
+ }
+
+ ret = src->cb.l(src->src, src->ud, NULL, 0, ZIP_SOURCE_OPEN);
+
+ if (ret < 0) {
+ (void)zip_source_close(src->src);
+
+ if (ret == ZIP_SOURCE_ERR_LOWER)
+ src->error_source = ZIP_LES_LOWER;
+ else
+ src->error_source = ZIP_LES_UPPER;
+ return -1;
+ }
}
+
+ src->is_open = 1;
return 0;
}