if (hdrp) *hdrp = NULL;
rpmtdReset(&sigtd);
- l = rpmLeadNew();
- if ((rc = rpmLeadRead(fd, l)) == RPMRC_OK) {
+ if ((rc = rpmLeadRead(fd, &l)) == RPMRC_OK) {
const char * err = NULL;
if ((rc = rpmLeadCheck(l, &err)) == RPMRC_FAIL) {
rpmlog(RPMLOG_ERR, "%s: %s\n", fn, err);
}
leadtype = rpmLeadType(l);
+ l = rpmLeadFree(l);
}
- l = rpmLeadFree(l);
if (rc != RPMRC_OK)
goto exit;
pgpDigParams sigp;
Header sigh = NULL;
HeaderIterator hi = NULL;
+ rpmlead lead = NULL;
char * msg = NULL;
int res = 1; /* assume failure */
rpmRC rc;
rpmDigestBundle plbundle = rpmDigestBundleNew();
rpmDigestBundle hdrbundle = rpmDigestBundleNew();
- rpmlead lead = rpmLeadNew();
- if ((rc = rpmLeadRead(fd, lead)) == RPMRC_OK) {
+ if ((rc = rpmLeadRead(fd, &lead)) == RPMRC_OK) {
const char *lmsg = NULL;
rc = rpmLeadCheck(lead, &lmsg);
if (rc != RPMRC_OK)
rpmlog(RPMLOG_ERR, "%s: %s\n", fn, lmsg);
+ lead = rpmLeadFree(lead);
}
- lead = rpmLeadFree(lead);
if (rc != RPMRC_OK) {
goto exit;
char reserved[16]; /*!< Pad to 96 bytes -- 8 byte aligned! */
};
-rpmlead rpmLeadNew(void)
-{
- return xcalloc(1, sizeof(struct rpmlead_s));
-}
-
rpmlead rpmLeadFromHeader(Header h)
{
rpmlead l = NULL;
rpmGetArchInfo(NULL, &archnum);
rpmGetOsInfo(NULL, &osnum);
- l = rpmLeadNew();
+ l = xcalloc(1, sizeof(*l));
l->major = 3;
l->minor = 0;
l->archnum = archnum;
return RPMRC_OK;
}
-rpmRC rpmLeadRead(FD_t fd, rpmlead lead)
+rpmRC rpmLeadRead(FD_t fd, rpmlead *lead)
{
- assert(lead != NULL);
- memset(lead, 0, sizeof(*lead));
- if (Fread(lead, 1, sizeof(*lead), fd) != sizeof(*lead)) {
+ rpmRC rc = RPMRC_OK;
+ rpmlead l = xcalloc(1, sizeof(*l));
+
+ if (Fread(l, 1, sizeof(*l), fd) != sizeof(*l)) {
if (Ferror(fd)) {
rpmlog(RPMLOG_ERR, _("read failed: %s (%d)\n"),
Fstrerror(fd), errno);
- return RPMRC_FAIL;
+ rc = RPMRC_FAIL;
} else {
rpmlog(RPMLOG_ERR, _("not an rpm package\n"));
- return RPMRC_NOTFOUND;
+ rc = RPMRC_NOTFOUND;
}
}
- lead->type = ntohs(lead->type);
- lead->archnum = ntohs(lead->archnum);
- lead->osnum = ntohs(lead->osnum);
- lead->signature_type = ntohs(lead->signature_type);
- return RPMRC_OK;
+ if (rc == RPMRC_OK) {
+ l->type = ntohs(l->type);
+ l->archnum = ntohs(l->archnum);
+ l->osnum = ntohs(l->osnum);
+ l->signature_type = ntohs(l->signature_type);
+ }
+
+ if (rc || lead == NULL)
+ rpmLeadFree(l);
+ else
+ *lead = l;
+
+ return rc;
}
int rpmLeadType(rpmlead lead)
typedef struct rpmlead_s * rpmlead;
-
-/** \ingroup lead
- * Initialize a lead structure
- * @return Pointer to empty lead structure
- */
-rpmlead rpmLeadNew(void);
-
/** \ingroup lead
* Initialize a lead structure from header
* param h Header
/** \ingroup lead
* Read lead from file handle.
* @param fd file handle
- * @retval lead package lead
+ * @retval lead pointer to package lead (malloced)
* @return RPMRC_OK on success, RPMRC_FAIL/RPMRC_NOTFOUND on error
*/
-rpmRC rpmLeadRead(FD_t fd, rpmlead lead);
+rpmRC rpmLeadRead(FD_t fd, rpmlead *lead);
/** \ingroup lead
* Check lead for compatibility.
{
FD_t fd = NULL;
FD_t ofd = NULL;
- rpmlead lead;
+ rpmlead lead = NULL;
char *sigtarget = NULL, *trpm = NULL;
Header sigh = NULL;
char * msg;
if (manageFile(&fd, rpm, O_RDONLY))
goto exit;
- lead = rpmLeadNew();
-
- if ((rc = rpmLeadRead(fd, lead)) == RPMRC_OK) {
+ if ((rc = rpmLeadRead(fd, &lead)) == RPMRC_OK) {
const char *lmsg = NULL;
rc = rpmLeadCheck(lead, &lmsg);
if (rc != RPMRC_OK)
}
if (rc != RPMRC_OK) {
- lead = rpmLeadFree(lead);
goto exit;
}
/* Write the lead/signature of the output rpm */
rc = rpmLeadWrite(ofd, lead);
- lead = rpmLeadFree(lead);
if (rc != RPMRC_OK) {
rpmlog(RPMLOG_ERR, _("%s: writeLead failed: %s\n"), trpm,
Fstrerror(ofd));
if (ofd) (void) closeFile(&ofd);
rpmFreeSignature(sigh);
+ rpmLeadFree(lead);
/* Clean up intermediate target */
if (sigtarget) {