static void repodata_load_solv(Repodata *data);
static void
-parse_repodata(Repodata *maindata, Id *keyp, Repokey *keys, Id *idmap, unsigned numid, unsigned numrel, Repo *repo)
+parse_external_repodata(Repodata *maindata, Id *keyp, Repokey *keys, Id *idmap, unsigned numid, unsigned numrel)
{
+ Repo *repo = maindata->repo;
Id key, id;
Id *ida, *ide;
Repodata *data;
}
/* read_idarray writes a terminating 0, that's why the + 1 */
ida = sat_calloc(keys[key].size + 1, sizeof(Id));
- ide = read_idarray(maindata, 0, 0, ida, ida + keys[key].size + 1);
+ ide = read_idarray(maindata, numid, idmap, ida, ida + keys[key].size + 1);
n = ide - ida - 1;
if (n & 1)
{
pool_debug (mypool, SAT_ERROR, "invalid attribute data\n");
- data->error = SOLV_ERROR_CORRUPT;
+ maindata->error = SOLV_ERROR_CORRUPT;
return;
}
data->nkeys = 1 + (n >> 1);
memset(data->keys, 0, sizeof(Repokey));
for (i = 1, ide = ida; i < data->nkeys; i++)
{
- if (*ide >= numid)
- {
- pool_debug (mypool, SAT_ERROR, "invalid attribute data\n");
- data->error = SOLV_ERROR_CORRUPT;
- return;
- }
- data->keys[i].name = idmap ? idmap[*ide++] : *ide++;
- data->keys[i].type = idmap ? idmap[*ide++] : *ide++;
+ data->keys[i].name = *ide++;
+ data->keys[i].type = *ide++;
data->keys[i].size = 0;
data->keys[i].storage = 0;
}
}
}
+static void
+parse_info_repodata(Repodata *maindata, Id *keyp, Repokey *keys, Id *idmap, unsigned numid, unsigned numrel)
+{
+ Id key, id;
+ Id *ida;
+ while ((key = *keyp++) != 0)
+ {
+ id = keys[key].name;
+ if (id == REPODATA_ADDEDFILEPROVIDES && keys[key].type == REPOKEY_TYPE_IDARRAY)
+ {
+ /* + 1 just in case */
+ ida = sat_calloc(keys[key].size + 1, sizeof(Id));
+ read_idarray(maindata, numid, idmap, ida, ida + keys[key].size + 1);
+ maindata->addedfileprovides = ida;
+ continue;
+ }
+ skip_item(maindata, keys[key].type, numid, numrel);
+ }
+}
+
/*-----------------------------------------------------------------*/
if (keys[key].name == REPODATA_EXTERNAL && keys[key].type == REPOKEY_TYPE_VOID)
{
/* external data for some ids */
- parse_repodata(&data, keyp, keys, idmap, numid, numrel, repo);
+ parse_external_repodata(&data, keyp, keys, idmap, numid, numrel);
+ }
+ else if (keys[key].name == REPODATA_INFO)
+ {
+ parse_info_repodata(&data, keyp, keys, idmap, numid, numrel);
}
else
- skip_schema(&data, keyp, keys, numid, numrel);
+ {
+ skip_schema(&data, keyp, keys, numid, numrel);
+ }
}
s = 0;
if (have_xdata)
- repodata_extend_block(&data, data.start, numsolv);
+ {
+ /* reserve one byte so that all offsets are not zero */
+ incore_add_id(&data, 0);
+ repodata_extend_block(&data, data.start, numsolv);
+ }
left = 0;
buf = sat_calloc(maxsize + 4, 1);