Skip to content

Commit 0f85171

Browse files
committed
lib: fix error handling when opening archives over http
1 parent 39a05ff commit 0f85171

2 files changed

Lines changed: 24 additions & 10 deletions

File tree

lib/archive.c

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -150,25 +150,43 @@ struct fetch_archive {
150150
};
151151

152152
static int
153-
fetch_archive_open(struct archive *a UNUSED, void *client_data)
153+
fetch_archive_open(struct archive *a, void *client_data)
154154
{
155155
struct fetch_archive *f = client_data;
156156

157157
f->fetch = fetchGet(f->url, NULL);
158+
if (!f->fetch) {
159+
const char *errstr = xbps_fetch_error_string();
160+
int err;
161+
switch (fetchLastErrCode) {
162+
case FETCH_UNAVAIL:
163+
err = ENOENT;
164+
break;
165+
default:
166+
err = EIO;
167+
break;
168+
}
169+
archive_set_error(a, err, "%s", errstr ? errstr : "unknown fetch error");
170+
return ARCHIVE_FATAL;
171+
}
158172

159-
if (f->fetch == NULL)
160-
return ENOENT;
161-
162-
return 0;
173+
return ARCHIVE_OK;
163174
}
164175

165176
static ssize_t
166177
fetch_archive_read(struct archive *a UNUSED, void *client_data, const void **buf)
167178
{
168179
struct fetch_archive *f = client_data;
180+
ssize_t rd;
169181

170182
*buf = f->buffer;
171-
return fetchIO_read(f->fetch, f->buffer, sizeof(f->buffer));
183+
rd = fetchIO_read(f->fetch, f->buffer, sizeof(f->buffer));
184+
if (rd == -1) {
185+
const char *errstr = xbps_fetch_error_string();
186+
archive_set_error(a, EIO, "%s", errstr ? errstr : "unknown fetch error");
187+
return -1;
188+
}
189+
return rd;
172190
}
173191

174192
static int
@@ -222,7 +240,6 @@ xbps_archive_read_open_remote(struct archive *ar, const char *url)
222240
f = calloc(1, sizeof(*f));
223241
if (!f) {
224242
r = -errno;
225-
archive_read_free(ar);
226243
fetchFreeURL(furl);
227244
return r;
228245
}
@@ -232,8 +249,6 @@ xbps_archive_read_open_remote(struct archive *ar, const char *url)
232249
fetch_archive_close);
233250
if (r == ARCHIVE_FATAL) {
234251
r = -archive_errno(ar);
235-
fetchFreeURL(f->url);
236-
free(f);
237252
return r;
238253
}
239254

lib/repo.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,6 @@ repo_open_remote(struct xbps_repo *repo, struct archive *ar)
346346
r = xbps_archive_read_open_remote(ar, url);
347347
if (r < 0) {
348348
xbps_error_printf("failed to open repository: %s: %s\n", repo->uri, strerror(-r));
349-
archive_read_free(ar);
350349
return r;
351350
}
352351

0 commit comments

Comments
 (0)